protected SiDriverState RetrieveDataMessages(SiMessageQueue queue, ICommWriter writer, SiHandler siHandler, SiMessage[] readoutCommands, int nbPunchesIndex, String timeoutMessage) { try { GecoSiLogger.StateChanged(GetType().Name); SiMessage readoutCommand = readoutCommands[0]; writer.Write(readoutCommand); SiMessage firstDataBlock = PollAnswer(queue, readoutCommand.CommandByte()); int nbDataBlocks = (nbPunchesIndex == -1) ? readoutCommands.Length : ExtractNumberOfDataBlocks(firstDataBlock, nbPunchesIndex); var dataMessages = new SiMessage[nbDataBlocks]; dataMessages[0] = firstDataBlock; for (int i = 1; i < nbDataBlocks; i++) { readoutCommand = readoutCommands[i]; writer.Write(readoutCommand); dataMessages[i] = PollAnswer(queue, readoutCommand.CommandByte()); } siHandler.Notify(CreateDataFrame(dataMessages)); return(ACK_READ.Send(writer, siHandler)); } catch (TimeoutException e) { return(ErrorFallback(siHandler, timeoutMessage)); } catch (InvalidMessage e) { return(ErrorFallback(siHandler, "Invalid message: " + e.ReceivedMessage())); } }
protected SiMessage PollAnswer(SiMessageQueue queue, byte command) { SiMessage message = queue.TimeoutPoll(); CheckAnswer(message, command); return(message); }
protected void CheckAnswer(SiMessage message, byte command) { if (!message.Check(command)) { throw new InvalidMessage(message); } }
public override SiDriverState Receive(SiMessageQueue queue, ICommWriter writer, SiHandler siHandler) { SiMessage message = PollAnswer(queue, SiMessage.GET_SYSTEM_VALUE); si6_192PunchesMode = (message.Sequence(6) & 0xFF) == 0xFF; GecoSiLogger.Info("SiCard6 192 Punches Mode " + (si6_192PunchesMode ? "Enabled" : "Disabled")); return(STARTUP_COMPLETE.Send(writer, siHandler)); }
private static SiDriverState DispatchSicard8Plus(SiMessage message, SiMessageQueue queue, ICommWriter writer, SiHandler siHandler) { if (message.Sequence(SiMessage.SI3_NUMBER_INDEX) == SiMessage.SI_CARD_10_PLUS_SERIES) { return(RETRIEVE_SICARD_10_PLUS_DATA.Retrieve(queue, writer, siHandler)); } return(RETRIEVE_SICARD_8_9_DATA.Retrieve(queue, writer, siHandler)); }
protected int ExtractNumberOfDataBlocks(SiMessage firstBlock, int nbPunchesIndex) { int nbPunches = firstBlock.Sequence(nbPunchesIndex) & 0xFF; int nbPunchesPerBlock = 32; int nbPunchDataBlocks = (nbPunches / nbPunchesPerBlock) + Math.Min(1, nbPunches % nbPunchesPerBlock); GecoSiLogger.Info(String.Format("Nb punches/Data blocks: {0}/{1}", nbPunches, nbPunchDataBlocks)); return(nbPunchDataBlocks + 1); }
public override SiDriverState Receive(SiMessageQueue queue, ICommWriter writer, SiHandler siHandler) { SiMessage message = PollAnswer(queue, SiMessage.GET_SYSTEM_VALUE); byte cpcByte = message.Sequence(6); if ((cpcByte & CONFIG_CHECK_MASK) == CONFIG_CHECK_MASK) { return(GET_SI6_CARDBLOCKS.Send(writer, siHandler)); } if ((cpcByte & EXTENDED_PROTOCOL_MASK) == 0) { return(EXTENDED_PROTOCOL_ERROR); } return(HANDSHAKE_MODE_ERROR); }
public override SiDriverState Receive(SiMessageQueue queue, ICommWriter writer, SiHandler siHandler) { siHandler.Notify(CommStatus.Ready); SiMessage message = queue.Take(); siHandler.Notify(CommStatus.Processing); if (!message.Valid()) { return(DISPATCH_READY); } if (message.CommandByte() == SiMessage.SI_CARD_5_DETECTED || message.CommandByte() == SiMessage.SI_CARD_6_PLUS_DETECTED || message.CommandByte() == SiMessage.SI_CARD_8_PLUS_DETECTED) { var bytes = new ByteFrame(message.Data()); if (!siHandler.OnEcardDown(bytes.Block3At(5).ToString())) { return(ACK_READ.Send(writer, siHandler)); } } switch (message.CommandByte()) { case SiMessage.SI_CARD_5_DETECTED: return(RETRIEVE_SICARD_5_DATA.Retrieve(queue, writer, siHandler)); case SiMessage.SI_CARD_6_PLUS_DETECTED: return(RETRIEVE_SICARD_6_DATA.Retrieve(queue, writer, siHandler)); case SiMessage.SI_CARD_8_PLUS_DETECTED: return(DispatchSicard8Plus(message, queue, writer, siHandler)); case SiMessage.BEEP: break; case SiMessage.SI_CARD_REMOVED: GecoSiLogger.Debug("Late removal " + message); break; default: GecoSiLogger.Debug("Unexpected message " + message); break; } return(DISPATCH_READY); }
public void Write(SiMessage message) { }
public InvalidMessage(SiMessage receivedMessage) { this.receivedMessage = receivedMessage; }
public void Write(SiMessage message) { GecoSiLogger.Log("SEND", message.ToString()); byte[] buff = message.Sequence(); port.Write(buff, 0, buff.Length); }
private void QueueMessage(SiMessage message) { GecoSiLogger.Log("READ", message.ToString()); messageQueue.Add(message); }
protected byte[] ExtractDataFrame(SiMessage message) { return(message.Sequence().Skip(5).Take(133 - 5).ToArray()); }
public Si5DataFrame(SiMessage message) { dataFrame = ExtractDataFrame(message); siNumber = ExtractSiNumber(); }