package protocol type DrawerKickoutConnectorStatus struct { IsPin3High bool } type OnlineStatus struct { IsOffline bool IsCoverOpen bool IsPaperFedByFeedButton bool IsWaitingForOnlineRecovery bool } type PaperSensorStatus struct { IsNearEnd bool IsNotPresent bool } type ErrorStatus struct { RecoverableErrorOccurred bool AutocutterErrorOccurred bool UnrecoverableErrorOccurred bool AutomaticallyRecoverableErrorOccurred bool } type PanelSwitchStatus struct { IsFeedButtonPressed bool } type ASBStatus struct { DrawerKickoutConnector DrawerKickoutConnectorStatus Online OnlineStatus Paper PaperSensorStatus Error ErrorStatus PanelSwitch PanelSwitchStatus } func (p Protocol) ParsePaperSensorStatus(status byte) PaperSensorStatus { return PaperSensorStatus{ IsNearEnd: status&0b00000011 != 0, IsNotPresent: status&0b00001100 != 0, } } func (p Protocol) ParseASBStatus(status [4]byte) ASBStatus { checkbit := func(nbyte int, nbit int) bool { return status[nbyte]&(1<<nbit) != 0 } return ASBStatus{ DrawerKickoutConnector: DrawerKickoutConnectorStatus{ IsPin3High: checkbit(0, 2), }, Online: OnlineStatus{ IsOffline: checkbit(0, 3), IsCoverOpen: checkbit(0, 5), IsPaperFedByFeedButton: checkbit(0, 5), IsWaitingForOnlineRecovery: checkbit(1, 0), }, Error: ErrorStatus{ RecoverableErrorOccurred: checkbit(1, 2), AutocutterErrorOccurred: checkbit(1, 3), UnrecoverableErrorOccurred: checkbit(1, 5), AutomaticallyRecoverableErrorOccurred: checkbit(1, 6), }, Paper: p.ParsePaperSensorStatus(status[2]), PanelSwitch: PanelSwitchStatus{ IsFeedButtonPressed: checkbit(1, 1), }, } }