/// <summary> /// gets triggered by LIListener when broadcast appears /// </summary> internal void ProcessBroadCast() { if (LastAnswer.GetType() == typeof(BCAllOff)) { EmergencyOff = true; logme.Log(i18n.FlakeLIMsgs.EmergencyOffToggle, logme.LogLevel.info); return; } if (LastAnswer.GetType() == typeof(BCAllOn)) { EmergencyOff = false; EmergencyStop = false; ProgramMode = false; logme.Log(i18n.FlakeLIMsgs.AllOnSet, logme.LogLevel.info); return; } if (LastAnswer.GetType() == typeof(BCAllLocosOff)) { EmergencyStop = true; logme.Log(i18n.FlakeLIMsgs.EmergencyStopToggle, logme.LogLevel.info); return; } if (LastAnswer.GetType() == typeof(BCProgramMode)) { ProgramMode = true; logme.Log(i18n.FlakeLIMsgs.ProgrammodeToggle, logme.LogLevel.info); return; } }
/// <summary> /// Send command to central and receive answer /// </summary> /// <param name="command"></param> private void SendCommandAndReceiveAnswer(LICommandAndAnswer command) { bool retry = true; while (retry) { SerialPortConnection.Write(command.Command.ByteArray, 0, command.Command.Length); logme.Log(command.Command.LogMessage, logme.LogLevel.limsg, command.Command.ByteArray); logme.AddLine(); Thread.Sleep(Config.Data.TimeToWaitForLIAnswer_ms); // wait for central DateTime tmp = DateTime.Now; while (LastAnswer == null || EmergencyOff) { // wait for answer if (DateTime.Now > tmp.AddSeconds(Config.Data.TimeoutForLIResponse_s)) { // timeout logme.Log(Resources.FlakeLIErrors.LITimeout, logme.LogLevel.error, command.Command.ByteArray); return; } } if (LastAnswer.GetType() == typeof(ErrorUnknown)) { if (_ErrorInARow < Config.Data.AllowedCentralErrorsInARow) { // unknown error, send again, if error sum < n _ErrorInARow++; } else { // Too much errors in a row retry = false; logme.Log(string.Format(Resources.FlakeLIErrors.ErrorSendingCommad, Config.Data.AllowedCentralErrorsInARow.ToString()), logme.LogLevel.error, command.Command.ByteArray); return; } } else { _ErrorInARow = 0; retry = false; } } command.Answer = LastAnswer; // store answer to command for external use LastAnswer = null; logme.Log(command.Answer.LogMessage, logme.LogLevel.limsg, command.Answer.ByteArray); logme.AddLine('='); }