@@ -40,7 +40,7 @@ const TOS_SERIAL_DEVICE_PARAMETERS_ID = 0x80
4040type 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