50 class ControllerReplication;
81 ControllerInterface_Unknown = 0,
83 ControllerInterface_Hid
93 Driver(
string const& _controllerPath, ControllerInterface
const& _interface );
107 static void DriverThreadEntryPoint(
Event* _exitEvent,
void* _context );
126 void DriverThreadProc(
Event* _exitEvent );
140 bool Init(
uint32 _attempts );
146 void RemoveQueues(
uint8 const _nodeId );
151 bool m_awakeNodesQueried;
152 bool m_allNodesQueried;
153 bool m_notifytransactions;
160 void RequestConfig();
171 ControllerCaps_Secondary = 0x01,
172 ControllerCaps_OnOtherNetwork = 0x02,
173 ControllerCaps_SIS = 0x04,
174 ControllerCaps_RealPrimary = 0x08,
175 ControllerCaps_SUC = 0x10
181 InitCaps_Slave = 0x01,
182 InitCaps_TimerSupport = 0x02,
183 InitCaps_Secondary = 0x04,
187 bool IsPrimaryController()
const{
return ((m_initCaps & InitCaps_Secondary) == 0); }
188 bool IsStaticUpdateController()
const{
return ((m_initCaps & InitCaps_SUC) != 0); }
189 bool IsBridgeController()
const{
return (m_libraryType == 7); }
190 bool IsInclusionController()
const{
return ((m_controllerCaps & ControllerCaps_SIS) != 0); }
193 uint32 GetHomeId()
const{
return m_homeId; }
194 uint8 GetNodeId()
const{
return m_nodeId; }
195 uint8 GetSUCNodeId()
const{
return m_SUCNodeId; }
196 uint16 GetManufacturerId()
const{
return m_manufacturerId; }
197 uint16 GetProductType()
const{
return m_productType; }
198 uint16 GetProductId()
const{
return m_productId; }
199 string GetControllerPath()
const{
return m_controllerPath; }
200 ControllerInterface GetControllerInterfaceType()
const{
return m_controllerInterfaceType; }
201 string GetLibraryVersion()
const{
return m_libraryVersion; }
202 string GetLibraryTypeName()
const{
return m_libraryTypeName; }
203 int32 GetSendQueueCount()
const
206 for(
int32 i=0; i<MsgQueue_Count; ++i )
208 count += (
int32) (m_msgQueue[i].size());
222 Node* GetNodeUnsafe(
uint8 _nodeId );
232 Node* GetNode(
uint8 _nodeId );
242 ControllerInterface m_controllerInterfaceType;
243 string m_controllerPath;
244 Controller* m_controller;
247 string m_libraryVersion;
248 string m_libraryTypeName;
251 uint8 m_serialAPIVersion[2];
259 uint8 m_controllerCaps;
264 ControllerReplication* m_controllerReplication;
266 uint8 m_transmitOptions;
273 void ProcessMsg(
uint8* _data );
275 void HandleGetVersionResponse(
uint8* _data );
276 void HandleGetRandomResponse(
uint8* _data );
277 void HandleGetControllerCapabilitiesResponse(
uint8* _data );
278 void HandleGetSerialAPICapabilitiesResponse(
uint8* _data );
279 void HandleSerialAPISoftResetResponse(
uint8* _data );
280 void HandleEnableSUCResponse(
uint8* _data );
281 void HandleSetSUCNodeIdResponse(
uint8* _data );
282 void HandleGetSUCNodeIdResponse(
uint8* _data );
283 void HandleMemoryGetIdResponse(
uint8* _data );
296 void HandleSerialAPIGetInitDataResponse(
uint8* _data );
297 void HandleGetNodeProtocolInfoResponse(
uint8* _data );
298 bool HandleRemoveFailedNodeResponse(
uint8* _data );
299 void HandleIsFailedNodeResponse(
uint8* _data );
300 bool HandleReplaceFailedNodeResponse(
uint8* _data );
301 bool HandleAssignReturnRouteResponse(
uint8* _data );
302 bool HandleDeleteReturnRouteResponse(
uint8* _data );
303 void HandleSendNodeInformationRequest(
uint8* _data );
304 void HandleSendDataResponse(
uint8* _data,
bool _replication );
305 bool HandleNetworkUpdateResponse(
uint8* _data );
306 void HandleGetRoutingInfoResponse(
uint8* _data );
308 void HandleSendDataRequest(
uint8* _data,
bool _replication );
309 void HandleAddNodeToNetworkRequest(
uint8* _data );
310 void HandleCreateNewPrimaryRequest(
uint8* _data );
311 void HandleControllerChangeRequest(
uint8* _data );
312 void HandleSetLearnModeRequest(
uint8* _data );
313 void HandleRemoveFailedNodeRequest(
uint8* _data );
314 void HandleReplaceFailedNodeRequest(
uint8* _data );
315 void HandleRemoveNodeFromNetworkRequest(
uint8* _data );
316 void HandleApplicationCommandHandlerRequest(
uint8* _data );
317 void HandlePromiscuousApplicationCommandHandlerRequest(
uint8* _data );
318 void HandleAssignReturnRouteRequest(
uint8* _data );
319 void HandleDeleteReturnRouteRequest(
uint8* _data );
320 void HandleNodeNeighborUpdateRequest(
uint8* _data );
321 void HandleNetworkUpdateRequest(
uint8* _data );
322 bool HandleApplicationUpdateRequest(
uint8* _data );
323 bool HandleRfPowerLevelSetResponse(
uint8* _data );
324 bool HandleSerialApiSetTimeoutsResponse(
uint8* _data );
325 bool HandleMemoryGetByteResponse(
uint8* _data );
326 bool HandleReadMemoryResponse(
uint8* _data );
327 void HandleGetVirtualNodesResponse(
uint8* _data );
328 bool HandleSetSlaveLearnModeResponse(
uint8* _data );
329 void HandleSetSlaveLearnModeRequest(
uint8* _data );
330 bool HandleSendSlaveNodeInfoResponse(
uint8* _data );
331 void HandleSendSlaveNodeInfoRequest(
uint8* _data );
332 void HandleApplicationSlaveCommandRequest(
uint8* _data );
333 void HandleSerialAPIResetRequest(
uint8* _data );
335 void CommonAddNodeStatusRequestHandler(
uint8 _funcId,
uint8* _data );
337 bool m_waitingForAck;
338 uint8 m_expectedCallbackId;
339 uint8 m_expectedReply;
340 uint8 m_expectedCommandClassId;
341 uint8 m_expectedNodeId;
347 int32 GetPollInterval(){
return m_pollInterval ; }
348 void SetPollInterval(
int32 _milliseconds,
bool _bIntervalBetweenPolls ){ m_pollInterval = _milliseconds; m_bIntervalBetweenPolls = _bIntervalBetweenPolls; }
349 bool EnablePoll(
const ValueID &_valueId,
uint8 _intensity = 1 );
350 bool DisablePoll(
const ValueID &_valueId );
351 bool isPolled(
const ValueID &_valueId );
352 void SetPollIntensity(
const ValueID &_valueId,
uint8 _intensity );
353 static void PollThreadEntryPoint( Event* _exitEvent,
void* _context );
354 void PollThreadProc( Event* _exitEvent );
356 Thread* m_pollThread;
363 list<PollEntry> m_pollList;
366 int32 m_pollInterval;
367 bool m_bIntervalBetweenPolls;
384 void InitNode(
uint8 const _nodeId,
bool newNode =
false );
388 bool IsNodeListeningDevice(
uint8 const _nodeId );
389 bool IsNodeFrequentListeningDevice(
uint8 const _nodeId );
390 bool IsNodeBeamingDevice(
uint8 const _nodeId );
391 bool IsNodeRoutingDevice(
uint8 const _nodeId );
392 bool IsNodeSecurityDevice(
uint8 const _nodeId );
399 string GetNodeType(
uint8 const _nodeId );
402 string GetNodeManufacturerName(
uint8 const _nodeId );
403 string GetNodeProductName(
uint8 const _nodeId );
404 string GetNodeName(
uint8 const _nodeId );
405 string GetNodeLocation(
uint8 const _nodeId );
407 string GetNodeManufacturerId(
uint8 const _nodeId );
408 string GetNodeProductType(
uint8 const _nodeId );
409 string GetNodeProductId(
uint8 const _nodeId );
410 void SetNodeManufacturerName(
uint8 const _nodeId,
string const& _manufacturerName );
411 void SetNodeProductName(
uint8 const _nodeId,
string const& _productName );
412 void SetNodeName(
uint8 const _nodeId,
string const& _nodeName );
413 void SetNodeLocation(
uint8 const _nodeId,
string const& _location );
414 void SetNodeLevel(
uint8 const _nodeId,
uint8 const _level );
415 void SetNodeOn(
uint8 const _nodeId );
416 void SetNodeOff(
uint8 const _nodeId );
420 bool IsAPICallSupported(
uint8 const _apinum )
const{
return (( m_apiMask[( _apinum - 1 ) >> 3] & ( 1 << (( _apinum - 1 ) & 0x07 ))) != 0 ); }
421 void SetAPICall(
uint8 const _apinum,
bool _toSet )
425 m_apiMask[( _apinum - 1 ) >> 3] |= ( 1 << (( _apinum - 1 ) & 0x07 ));
429 m_apiMask[( _apinum - 1 ) >> 3] &= ~( 1 << (( _apinum - 1 ) & 0x07 ));
445 ControllerCommand_None = 0,
461 ControllerCommand_DeleteButton
471 ControllerState_Normal = 0,
481 ControllerState_NodeFailed
490 ControllerError_None = 0,
502 ControllerError_Overflow
509 void ResetController(
Event* _evt );
511 void RequestNodeNeighbors(
uint8 const _nodeId,
uint32 const _requestFlags );
513 bool BeginControllerCommand(
ControllerCommand _command, pfnControllerCallback_t _callback,
void* _context,
bool _highPower,
uint8 _nodeId,
uint8 _arg );
514 bool CancelControllerCommand();
515 void AddNodeStop(
uint8 const _funcId );
517 struct ControllerCommandItem
520 bool m_controllerStateChanged;
521 bool m_controllerCommandDone;
523 pfnControllerCallback_t m_controllerCallback;
525 void* m_controllerCallbackContext;
527 bool m_controllerAdded;
528 uint8 m_controllerCommandNode;
529 uint8 m_controllerCommandArg;
532 ControllerCommandItem* m_currentControllerCommand;
534 void DoControllerCommand();
535 void UpdateControllerState( ControllerState
const _state, ControllerError
const _error = ControllerError_None )
537 if( m_currentControllerCommand !=
NULL )
539 if( _state != m_currentControllerCommand->m_controllerState )
541 m_currentControllerCommand->m_controllerStateChanged =
true;
542 m_currentControllerCommand->m_controllerState = _state;
545 case ControllerState_Error:
546 case ControllerState_Cancel:
547 case ControllerState_Failed:
548 case ControllerState_Sleeping:
549 case ControllerState_NodeFailed:
550 case ControllerState_NodeOK:
551 case ControllerState_Completed:
553 m_currentControllerCommand->m_controllerCommandDone =
true;
555 m_queueEvent[MsgQueue_Controller]->Set();
556 m_sendMutex->Unlock();
566 if( _error != ControllerError_None )
568 m_currentControllerCommand->m_controllerReturnError = _error;
575 void UpdateNodeRoutes(
uint8 const_nodeId,
bool _doUpdate =
false );
577 Event* m_controllerResetEvent;
585 MsgQueue_Command = 0,
596 void SendMsg(
Msg* _msg, MsgQueue
const _queue );
621 bool WriteNextMsg( MsgQueue
const _queue );
622 bool WriteMsg(
string const &str);
623 void RemoveCurrentMsg();
624 bool MoveMessagesToWakeUpQueue(
uint8 const _targetNodeId,
bool const _move );
625 bool HandleErrorResponse(
uint8 const _error,
uint8 const _nodeId,
char const* _funcStr,
bool _sleepCheck =
false );
626 bool IsExpectedReply(
uint8 const _nodeId );
629 void CheckCompletedNodeQueries();
667 MsgQueueCmd_SendMsg = 0,
668 MsgQueueCmd_QueryStageComplete,
669 MsgQueueCmd_Controller
678 m_queryStage(Node::QueryStage_None),
683 bool operator == ( MsgQueueItem
const& _other )
const
685 if( _other.m_command == m_command )
687 if( m_command == MsgQueueCmd_SendMsg )
689 return( (*_other.m_msg) == (*m_msg) );
691 else if( m_command == MsgQueueCmd_QueryStageComplete )
693 return( (_other.m_nodeId == m_nodeId) && (_other.m_queryStage == m_queryStage) );
695 else if( m_command == MsgQueueCmd_Controller )
697 return( (_other.m_cci->m_controllerCommand == m_cci->m_controllerCommand) && (_other.m_cci->m_controllerCallback == m_cci->m_controllerCallback) );
704 MsgQueueCmd m_command;
709 ControllerCommandItem* m_cci;
713 list<MsgQueueItem> m_msgQueue[MsgQueue_Count];
715 Event* m_queueEvent[MsgQueue_Count];
718 MsgQueue m_currentMsgQueueSource;
719 TimeStamp m_resendTimeStamp;
725 void TestNetwork(
uint8 const _nodeId,
uint32 const _count );
737 void RequestVirtualNeighbors( MsgQueue
const _queue );
738 bool IsVirtualNode(
uint8 const _nodeId )
const{
return (( m_virtualNeighbors[( _nodeId - 1 ) >> 3] & 1 << (( _nodeId - 1 ) & 0x07 )) != 0 ); }
739 void SendVirtualNodeInfo(
uint8 const _fromNodeId,
uint8 const _ToNodeId );
740 void SendSlaveLearnModeOff();
742 void ReadButtons(
uint8 const _nodeId );
744 bool m_virtualNeighborsReceived;
760 bool SetConfigParam(
uint8 const _nodeId,
uint8 const _param,
int32 _value,
uint8 const _size );
761 void RequestConfigParam(
uint8 const _nodeId,
uint8 const _param );
770 uint8 GetMaxAssociations(
uint8 const _nodeId,
uint8 const _groupIdx );
771 string GetGroupLabel(
uint8 const _nodeId,
uint8 const _groupIdx );
772 void AddAssociation(
uint8 const _nodeId,
uint8 const _groupIdx,
uint8 const _targetNodeId );
773 void RemoveAssociation(
uint8 const _nodeId,
uint8 const _groupIdx,
uint8 const _targetNodeId );
779 void QueueNotification( Notification* _notification );
780 void NotifyWatchers();
783 list<Notification*> m_notifications;
785 Event* m_notificationsEvent;
816 void LogDriverStatistics();
819 void GetDriverStatistics(
DriverData* _data );
841 uint32 m_broadcastReadCnt;
842 uint32 m_broadcastWriteCnt;
851 uint8 *GetNetworkKey();