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(); } }
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())); } }
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)); }
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 void ReadLog(String logFilename) { try { GecoSiLogger.OpenOutStreamLogger(); Start(); driver = new SiDriver(new LogFilePort(logFilename), this).Start(); } catch (Exception e) { e.PrintStackTrace(); } }
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"); } }
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 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())); } }
private void Stop() { siPort.Close(); siHandler.Notify(CommStatus.Off); GecoSiLogger.Close(); }
public virtual void NotifyError(CommStatus errorStatus, String errorMessage) { GecoSiLogger.Error(errorMessage); siListener.Notify(errorStatus, errorMessage); }
public virtual void Notify(CommStatus status) { GecoSiLogger.Log("!", status.GetType().Name); siListener.Notify(status); }
protected SiDriverState ErrorFallback(SiHandler siHandler, String errorMessage) { GecoSiLogger.Error(errorMessage); siHandler.Notify(CommStatus.ProcessingError); return(DISPATCH_READY); }