Ejemplo n.º 1
0
 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()));
     }
 }
Ejemplo n.º 2
0
        protected SiMessage PollAnswer(SiMessageQueue queue, byte command)
        {
            SiMessage message = queue.TimeoutPoll();

            CheckAnswer(message, command);
            return(message);
        }
Ejemplo n.º 3
0
 protected void CheckAnswer(SiMessage message, byte command)
 {
     if (!message.Check(command))
     {
         throw new InvalidMessage(message);
     }
 }
Ejemplo n.º 4
0
            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));
            }
Ejemplo n.º 5
0
 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));
 }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
            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);
            }
Ejemplo n.º 8
0
            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);
            }
Ejemplo n.º 9
0
 public void Write(SiMessage message)
 {
 }
Ejemplo n.º 10
0
 public InvalidMessage(SiMessage receivedMessage)
 {
     this.receivedMessage = receivedMessage;
 }
Ejemplo n.º 11
0
 public void Write(SiMessage message)
 {
     GecoSiLogger.Log("SEND", message.ToString());
     byte[] buff = message.Sequence();
     port.Write(buff, 0, buff.Length);
 }
Ejemplo n.º 12
0
 private void QueueMessage(SiMessage message)
 {
     GecoSiLogger.Log("READ", message.ToString());
     messageQueue.Add(message);
 }
Ejemplo n.º 13
0
 protected byte[] ExtractDataFrame(SiMessage message)
 {
     return(message.Sequence().Skip(5).Take(133 - 5).ToArray());
 }
Ejemplo n.º 14
0
 public Si5DataFrame(SiMessage message)
 {
     dataFrame = ExtractDataFrame(message);
     siNumber  = ExtractSiNumber();
 }