--- tags: NewPOS, diagram, architecture --- # Dock POS (New POS) diagram ## Dock Design ```plantuml @startuml package Service { class Service { add_characteristic() get_characteristic() set_context() run() } class AccessoryService {} class DockService { - Accessories serviceinfo() run() handle() } class YourService{ - Device } DockService -u-|> Service YourService -u-|> AccessoryService AccessoryService -u-|> Service } package Device { class Device { add_service() get_service() run() start() stop() } class Bridge #aliceblue ##blue{ -nodes add_device() start() stop() } class YourDevice { - Services } Bridge -d-|> Device YourDevice -d-|> Device } package Channel { class MQTTChannel { connect() disconnect() loop() publish() subscribe() @property will_set() @property connected() } class ServiceDirectory { is_primary() start() stop() register_service() unregister_service() is_registered() welcome() update() update_sd() update_service() lookup_service() handle_message() } MQTTChannel -r- ServiceDirectory:messager } DockService -- ServiceDirectory:msd DockService -- MQTTChannel:messager DockService --> Bridge:add_service YourService -r-> DockService:add to accessories YourService <--> YourDevice:Bind @enduml ``` ## Class Diagram - Device - contains Services - responsible for starting/stopping Services - Service - contains the associated Device - Bridge (Device) - contains other Devices, responsible for communication between devices - responsible for starting/stopping other Devices - DockService (Service) - contains AccessoryServices - responsible for initializing/starting/stopping ServiceDirectory - responsible for initializing/starting/stopping MQTTChannel - AccessoryService (Service) - contains associated DockService (context) - ServiceDirectory - contains list of service directory - responsible for registration / lookup of other services / service directory (??) - MQTTChannel - contains DockService as its handler (to be changed) ```plantuml @startuml dock_class_diagram 'skinparam defaultFontSize 20 class MQTTChannel { - _on_message_handlers } class ServiceDirectory { + messenger: MQTTChannel + start(messenger: MQTTChannel) + post_serviceinfo(serviceinfo: Dict[str,?]) '+ register_service(serviceinfo: Dict[str,?]) '+ unregister_service(serviceinfo: Dict[str,?]) } class Service { + context: DockService + device: Device + set_context(context: DockService) } class DockService { msd: ServiceDirectory messenger: MQTTChannel + add_accessory(accsessory: AccessoryService) + handle_event(event) } class AccessoryService { emit_event(event) } class PrintService class EDCService class HIDInput class Device { + services: Dict[str, Service] + add_service(service:Service) } class Bridge{ + nodes: Dict[str, Device] + add_device(device: Device) } class PrinterDevice class InvoicePrinter <> isService <> usesDock ' DockService -|> Service ' DockService <- Service Service <|-- isService isService -- DockService isService -- AccessoryService 'isService -- EDCService Device <|-- Bridge Device <|-- PrinterDevice Device <|-- EDCDevice InvoicePrinter <|-- PrinterDevice 'PrinterDevice o-- PrintService AccessoryService <|-- PrintService AccessoryService <|-- HIDInput AccessoryService <|-- EDCService EDCService <|-- EDC_TSB usesDock "*" - Service usesDock --o "1" DockService ' ServiceDirectory o-- MQTTChannel ' DockService o-- MQTTChannel 'ServiceDirectory o- MQTChannel MQTTChannel "1" - "1" DockService 'DockService "1" - "1" MQTTChannel MQTTChannel --o ServiceDirectory DockService *-- ServiceDirectory 'DockService *-- MQTTChannel 'ServiceDirectory -* DockService Service "*" -o "0..1" Device : "\t\t" ' Service o- Device ' Service -o Device Device "*" --o "1" Bridge ' Service o- DockService @enduml ``` ## Device/Service object instantiation ```plantuml @startwbs * (Device)\nBridge ** (Service)\nDockService *** ServiceDirectory *** MQTTChannel ** (EDCDevice)\nEDCDeviceFactory *** (AccessoryService)\nEDCServiceFactory ** (EDCDevice)\nEDCDevice[TSB,NCCC,FUBO] *** (AccessoryService)\nEDCService[TSB,NCCC,FUBO] ** (AccessoryService)\nHIDInput ** (AccessoryService)\nCheckDevice ** (Device)\nPrinter *** (AccessoryService)\nPrinter @endwbs ``` 1. PrinterDevice adds PrintService - PrintService sets the PrinterDevice as its device 2. EDCDeviceFactory adds EDCServiceFactory - EDCServiceFactory sets the EDCDeviceFactory as its device 4. EDCDevice[TSB,NCCC,FUBO], adds EDCService[TSB,NCCC,FUBO] - EDCService[TSB,NCCC,FUBO] sets the EDCDevice[TSB,NCCC,FUBO] as its device 5. DockService adds AccessoryService s - AccessoryService sets the DockService as its context - If AccessoryService has device - Add AccessoryService's device to DockService's device's (Bridge) device list - Else - AccessoryService sets the DockService's device (Bridge) as its device 6. Bridge adds DockService - DockService sets the Bridge as its device 7. Starts Bridge - run device's services - start other nodes (device list) - start PrinterDevice - run device's services - start EDCDeviceTSB - run device's services