示例#1
0
 public void Run()
 {
     try
     {
         SiDriverState currentState = StartupBootstrap();
         while (IsAlive(currentState))
         {
             GecoSiLogger.StateChanged(currentState.GetType().Name);
             currentState = currentState.Receive(messageQueue, writer, siHandler);
         }
         if (currentState.IsError())
         {
             siHandler.NotifyError(CommStatus.FatalError, currentState.Status());
         }
     }
     catch (ThreadInterruptedException e)
     {
         // normal way out
     }
     catch (Exception e)
     {
         e.PrintStackTrace();
         GecoSiLogger.Error(" #run# " + e);
     }
     finally
     {
         Stop();
     }
 }
示例#2
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()));
     }
 }
示例#3
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));
            }
示例#4
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);
        }
示例#5
0
 public void ReadLog(String logFilename)
 {
     try
     {
         GecoSiLogger.OpenOutStreamLogger();
         Start();
         driver = new SiDriver(new LogFilePort(logFilename), this).Start();
     }
     catch (Exception e)
     {
         e.PrintStackTrace();
     }
 }
示例#6
0
 public void Connect(String portname)
 {
     try
     {
         GecoSiLogger.Open("######");
         GecoSiLogger.LogTime("Start " + portname);
         Start();
         var port = new SerialPort(portname, 2000);
         port.Open();
         driver = new SiDriver(new SerialComPort(port), this).Start();
     }
     catch (Exception e)
     {
         siListener.Notify(CommStatus.FatalError, "Port in use");
     }
 }
示例#7
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);
            }
示例#8
0
 public override SiDriverState Receive(SiMessageQueue queue, ICommWriter writer, SiHandler siHandler)
 {
     try
     {
         PollAnswer(queue, SiMessage.SI_CARD_REMOVED);
         return(DISPATCH_READY);
     }
     catch (TimeoutException e)
     {
         GecoSiLogger.Info("Timeout on SiCard removal");
         return(DISPATCH_READY);
     }
     catch (InvalidMessage e)
     {
         return(ErrorFallback(siHandler, "Invalid message: " + e.ReceivedMessage()));
     }
 }
示例#9
0
 private void Stop()
 {
     siPort.Close();
     siHandler.Notify(CommStatus.Off);
     GecoSiLogger.Close();
 }
示例#10
0
 public virtual void NotifyError(CommStatus errorStatus, String errorMessage)
 {
     GecoSiLogger.Error(errorMessage);
     siListener.Notify(errorStatus, errorMessage);
 }
示例#11
0
 public virtual void Notify(CommStatus status)
 {
     GecoSiLogger.Log("!", status.GetType().Name);
     siListener.Notify(status);
 }
示例#12
0
 protected SiDriverState ErrorFallback(SiHandler siHandler, String errorMessage)
 {
     GecoSiLogger.Error(errorMessage);
     siHandler.Notify(CommStatus.ProcessingError);
     return(DISPATCH_READY);
 }