Skip to content

Commit 33fad67

Browse files
committed
Support DP over AM.
1 parent 19b1113 commit 33fad67

2 files changed

Lines changed: 80 additions & 34 deletions

File tree

cmd/deviceparameter/deviceparameter.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ type Options struct {
9999
ConnectionString string `description:"Connectionstring sf@HOST:PORT"`
100100
} `positional-args:"yes"`
101101

102-
Group sfconnection.AMGroup `short:"g" long:"group" default:"22" description:"Packet AM Group (hex)"`
102+
Group sfconnection.AMGroup `short:"g" long:"group" default:"22" description:"Packet AM Group (hex)"`
103+
Address sfconnection.AMAddr `short:"a" long:"address" default:"5678" description:"Source AM address (hex)"`
104+
Destination sfconnection.AMAddr `short:"d" long:"destination" default:"0" description:"Destination AM address (hex)"`
103105

104106
Parameter string `short:"p" long:"parameter" description:"Name of the parameter"`
105107
Value string `short:"v" long:"value" description:"Value to set"`
@@ -145,7 +147,13 @@ func main() {
145147
}
146148

147149
sfc := sfconnection.NewSfConnection()
148-
dpm := deviceparameters.NewDeviceParameterManager(sfc)
150+
151+
var dpm *deviceparameters.DeviceParameterManager = nil
152+
if opts.Destination == 0 {
153+
dpm = deviceparameters.NewDeviceParameterManager(sfc)
154+
} else {
155+
dpm = deviceparameters.NewDeviceParameterActiveMessageManager(sfc, opts.Group, opts.Address, opts.Destination)
156+
}
149157

150158
logger := logsetup(len(opts.Debug))
151159
if len(opts.Debug) > 0 {

deviceparameters.go

Lines changed: 70 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const TOS_SERIAL_DEVICE_PARAMETERS_ID = 0x80
4040
type DeviceParameterManager struct {
4141
loggers.DIWEloggers
4242
sfc *sfconnection.SfConnection
43-
dsp *sfconnection.PacketDispatcher
43+
dsp sfconnection.Dispatcher
4444

4545
values map[string]*DeviceParameter
4646
devstart time.Time
@@ -51,6 +51,8 @@ type DeviceParameterManager struct {
5151

5252
receive chan sfconnection.Packet
5353

54+
destination sfconnection.AMAddr // Optional destination
55+
5456
done chan bool
5557
closed bool
5658
}
@@ -73,8 +75,31 @@ func NewDeviceParameterManager(sfc *sfconnection.SfConnection) *DeviceParameterM
7375
dpm.timeout = time.Second
7476
dpm.retries = 3
7577

76-
dpm.dsp = sfconnection.NewPacketDispatcher(sfconnection.NewRawPacket(TOS_SERIAL_DEVICE_PARAMETERS_ID))
77-
dpm.dsp.RegisterReceiver(dpm.receive)
78+
dsp := sfconnection.NewPacketDispatcher(sfconnection.NewRawPacket(TOS_SERIAL_DEVICE_PARAMETERS_ID))
79+
dsp.RegisterReceiver(dpm.receive)
80+
dpm.dsp = dsp
81+
82+
dpm.sfc = sfc
83+
dpm.sfc.AddDispatcher(dpm.dsp)
84+
85+
go dpm.run()
86+
return dpm
87+
}
88+
89+
func NewDeviceParameterActiveMessageManager(sfc *sfconnection.SfConnection, group sfconnection.AMGroup, address sfconnection.AMAddr, destination sfconnection.AMAddr) *DeviceParameterManager {
90+
dpm := new(DeviceParameterManager)
91+
dpm.InitLoggers()
92+
dpm.values = make(map[string]*DeviceParameter)
93+
dpm.done = make(chan bool)
94+
dpm.closed = false
95+
dpm.receive = make(chan sfconnection.Packet)
96+
dpm.timeout = time.Second
97+
dpm.retries = 3
98+
dpm.destination = destination
99+
100+
dsp := sfconnection.NewMessageDispatcher(sfconnection.NewMessage(group, address))
101+
dsp.RegisterMessageReceiver(0x80, dpm.receive)
102+
dpm.dsp = dsp
78103

79104
dpm.sfc = sfc
80105
dpm.sfc.AddDispatcher(dpm.dsp)
@@ -99,11 +124,15 @@ func (self *DeviceParameterManager) GetValue(name string) (*DeviceParameter, err
99124

100125
for retries := 0; retries <= self.retries; retries++ {
101126
// Send get request
102-
msg := self.dsp.NewPacket().(*sfconnection.RawPacket)
127+
msg := self.dsp.NewPacket()
128+
if self.destination != 0 {
129+
msg.(*sfconnection.Message).SetDestination(self.destination)
130+
msg.(*sfconnection.Message).SetType(0x80)
131+
}
103132
payload := new(DpGetParameterId)
104133
payload.Header = DP_GET_PARAMETER_WITH_ID
105134
payload.Id = name
106-
msg.Payload = sfconnection.SerializePacket(payload)
135+
msg.SetPayload(sfconnection.SerializePacket(payload))
107136
self.sfc.Send(msg)
108137

109138
// Wait for value
@@ -131,12 +160,16 @@ func (self *DeviceParameterManager) SetValue(name string, value []byte) (*Device
131160

132161
for retries := 0; retries <= self.retries; retries++ {
133162
// Send set request
134-
msg := self.dsp.NewPacket().(*sfconnection.RawPacket)
163+
msg := self.dsp.NewPacket()
164+
if self.destination != 0 {
165+
msg.(*sfconnection.Message).SetDestination(self.destination)
166+
msg.(*sfconnection.Message).SetType(0x80)
167+
}
135168
payload := new(DpSetParameterId)
136169
payload.Header = DP_SET_PARAMETER_WITH_ID
137170
payload.Id = name
138171
payload.Value = value
139-
msg.Payload = sfconnection.SerializePacket(payload)
172+
msg.SetPayload(sfconnection.SerializePacket(payload))
140173
self.sfc.Send(msg)
141174

142175
// Wait for value
@@ -172,12 +205,13 @@ func (self *DeviceParameterManager) GetList() (chan *DeviceParameter, error) {
172205
return delivery, nil
173206
}
174207

175-
func (self *DeviceParameterManager) receivedPacket(msg *sfconnection.RawPacket) {
208+
func (self *DeviceParameterManager) receivedPacket(msg sfconnection.Packet) {
176209
self.Debug.Printf("%s\n", msg)
177-
if len(msg.Payload) > 0 {
178-
if msg.Payload[0] == DP_HEARTBEAT {
210+
payload := msg.GetPayload()
211+
if len(payload) > 0 {
212+
if payload[0] == DP_HEARTBEAT {
179213
p := new(DpHeartbeat)
180-
if err := sfconnection.DeserializePacket(p, msg.Payload); err == nil {
214+
if err := sfconnection.DeserializePacket(p, payload); err == nil {
181215
self.heartbeat = time.Now()
182216
self.devstart = self.heartbeat.Add(-time.Duration(p.Uptime) * time.Second)
183217
// TODO check stuff
@@ -191,20 +225,20 @@ func (self *DeviceParameterManager) waitValueId(name string) (*DeviceParameter,
191225
for {
192226
select {
193227
case packet := <-self.receive:
194-
msg := packet.(*sfconnection.RawPacket)
195-
if len(msg.Payload) > 0 {
196-
if msg.Payload[0] == DP_PARAMETER {
228+
payload := packet.GetPayload()
229+
if len(payload) > 0 {
230+
if payload[0] == DP_PARAMETER {
197231
p := new(DpParameter)
198-
if err := sfconnection.DeserializePacket(p, msg.Payload); err == nil {
232+
if err := sfconnection.DeserializePacket(p, payload); err == nil {
199233
if p.Id == name {
200234
return &DeviceParameter{name, p.Type, p.Seqnum, p.Value, time.Now(), nil}, nil
201235
}
202236
} else {
203-
self.Error.Printf("Deserialize error %s %s\n", err, msg)
237+
self.Error.Printf("Deserialize error %s %s\n", err, packet)
204238
}
205-
} else if msg.Payload[0] == DP_ERROR_PARAMETER_ID {
239+
} else if payload[0] == DP_ERROR_PARAMETER_ID {
206240
p := new(DpErrorParameterId)
207-
if err := sfconnection.DeserializePacket(p, msg.Payload); err == nil {
241+
if err := sfconnection.DeserializePacket(p, payload); err == nil {
208242
if p.Id == name {
209243
if p.Exists {
210244
return nil, errors.New(fmt.Sprintf("Something went wrong with parameter \"%s\", error %d!", name, p.Err))
@@ -215,10 +249,10 @@ func (self *DeviceParameterManager) waitValueId(name string) (*DeviceParameter,
215249
self.Warning.Printf("Received unexpected error for parameter %s\n", p.Id)
216250
}
217251
} else {
218-
self.Error.Printf("Deserialize error %s %s\n", err, msg)
252+
self.Error.Printf("Deserialize error %s %s\n", err, packet)
219253
}
220254
} else {
221-
self.receivedPacket(msg)
255+
self.receivedPacket(packet)
222256
}
223257
}
224258
case <-time.After(remaining(start, self.timeout)):
@@ -232,20 +266,20 @@ func (self *DeviceParameterManager) waitValueSeqnum(seqnum uint8) (*DeviceParame
232266
for {
233267
select {
234268
case packet := <-self.receive:
235-
msg := packet.(*sfconnection.RawPacket)
236-
if len(msg.Payload) > 0 {
237-
if msg.Payload[0] == DP_PARAMETER {
269+
payload := packet.GetPayload()
270+
if len(payload) > 0 {
271+
if payload[0] == DP_PARAMETER {
238272
p := new(DpParameter)
239-
if err := sfconnection.DeserializePacket(p, msg.Payload); err == nil {
273+
if err := sfconnection.DeserializePacket(p, payload); err == nil {
240274
if p.Seqnum == seqnum {
241275
return &DeviceParameter{p.Id, p.Type, p.Seqnum, p.Value, time.Now(), nil}, nil
242276
}
243277
} else {
244-
self.Error.Printf("Deserialize error %s %s\n", err, msg)
278+
self.Error.Printf("Deserialize error %s %s\n", err, packet)
245279
}
246-
} else if msg.Payload[0] == DP_ERROR_PARAMETER_SEQNUM {
280+
} else if payload[0] == DP_ERROR_PARAMETER_SEQNUM {
247281
p := new(DpErrorParameterSeqnum)
248-
if err := sfconnection.DeserializePacket(p, msg.Payload); err == nil {
282+
if err := sfconnection.DeserializePacket(p, payload); err == nil {
249283
if p.Seqnum == seqnum {
250284
if p.Exists {
251285
return nil, errors.New(fmt.Sprintf("Something went wrong with parameter %d, error %d!", seqnum, p.Err))
@@ -256,10 +290,10 @@ func (self *DeviceParameterManager) waitValueSeqnum(seqnum uint8) (*DeviceParame
256290
self.Warning.Printf("Received unexpected error for parameter %d\n", p.Seqnum)
257291
}
258292
} else {
259-
self.Error.Printf("Deserialize error %s %s\n", err, msg)
293+
self.Error.Printf("Deserialize error %s %s\n", err, packet)
260294
}
261295
} else {
262-
self.receivedPacket(msg)
296+
self.receivedPacket(packet)
263297
}
264298
}
265299
case <-time.After(remaining(start, self.timeout)):
@@ -273,11 +307,15 @@ func (self *DeviceParameterManager) getList(delivery chan *DeviceParameter) {
273307
for retries := 0; retries <= self.retries; retries++ {
274308
self.Debug.Printf("Get %d %d/%d\n", i, retries, self.retries)
275309
// Send get request
276-
msg := self.dsp.NewPacket().(*sfconnection.RawPacket)
310+
msg := self.dsp.NewPacket()
311+
if self.destination != 0 {
312+
msg.(*sfconnection.Message).SetDestination(self.destination)
313+
msg.(*sfconnection.Message).SetType(0x80)
314+
}
277315
payload := new(DpGetParameterSeqnum)
278316
payload.Header = DP_GET_PARAMETER_WITH_SEQNUM
279317
payload.Seqnum = uint8(i)
280-
msg.Payload = sfconnection.SerializePacket(payload)
318+
msg.SetPayload(sfconnection.SerializePacket(payload))
281319
self.sfc.Send(msg)
282320

283321
// Wait for value
@@ -309,7 +347,7 @@ func (self *DeviceParameterManager) run() {
309347
for {
310348
select {
311349
case packet := <-self.receive:
312-
msg := packet.(*sfconnection.RawPacket)
350+
msg := packet
313351
self.receivedPacket(msg)
314352
case done := <-self.done:
315353
if done {

0 commit comments

Comments
 (0)