@startuml class hide empty members class Dolibarr { + String getDestination(String tagID) + String createStockMovement(String tagID, String warehouseId) } package "Components" { package "NFCReader" { interface INFCReader { {abstract} char* read() {abstract} bool hasTag() } class RC522 RC522 .|> INFCReader } package "LCDScreen" { interface ILCDScreen { {abstract} void clearScreen() {abstract} void draw(int x, int y, int h, int w) {abstract} void drawRect(int x, int y, int h, int w) } class M5LCD M5LCD .|> ILCDScreen } package "GRBL" { interface IGRBL { {abstract} drive(int x, int y, int z, int step) {abstract} step(int s) } class M5GRBL M5GRBL .|> IGRBL } package "ServoMotor" { interface IServoMotor { {abstract} goLeft() {abstract} goRight() {abstract} goMiddle() } class ServoMotor ServoMotor .|> IServoMotor } } class Program { + Program() + void loop } Program <-- IServoMotor Program <-- IGRBL Program <-- ILCDScreen Program <-- INFCReader Dolibarr --> Program @enduml