internal void ReceiveMessage(Message message) { if (_needData != NeedDataEnum.NoNeed) { State.SetNeedData(_needData); _needData = NeedDataEnum.NoNeed; } var processingMessage = State.ProcessMessage(message, _confirmMessage, _newState, _needsConfirm); if (processingMessage == null) return; if (processingMessage.ResponseMessage != null) { SendMessage(processingMessage); } else { _needsConfirm = false; _confirmMessage = null; _newState = null; if (processingMessage.NewState != null) { State = processingMessage.NewState; processingMessage = State.StateChanged(); if (processingMessage != null) SendMessage(processingMessage); } } }
internal Dispatcher() { State = new NepripojenoState(); _comPortCommunicator = new Communicator(this); _messagesToSend = new Queue<Message>(); }
internal override ProcessingMesssage ProcessMessage(Message message, byte[] confirmMessage, AbstractState newState, bool needsConfirm) { var response = GetEchoResponse(message); if (response != null) return new ProcessingMesssage() { NewState = new InicializaceState() }; return null; }
private void SendMessage(ProcessingMesssage processingMessage) { _needsConfirm = processingMessage.NeedsConfirm; if (_needsConfirm) { _confirmMessage = processingMessage.ResponseMessage; if (processingMessage.NewState != null) _newState = processingMessage.NewState; } else { if (processingMessage.NewState != null) State = processingMessage.NewState; _confirmMessage = null; _newState = null; } _comPortCommunicator.Send(processingMessage); }
internal abstract ProcessingMesssage ProcessMessage(Message message, byte[] confirmMessage, AbstractState newState, bool needsConfirm);
internal override ProcessingMesssage ProcessMessage(Message message, byte[] confirmMessage, AbstractState newState, bool needsConfirm) { if (_numberOfRetries >= ConfigFile.NumberOfRetries) { //Logger.Log(ApplicationConfig.DebugFile, "INFO: Pokus FAILED o dotaz na id " + _lastItemId); _lastItemId++; _numberOfRetries = 0; _needPing = true; } if (_needPing) { var responseEchoNeedPing = GetEchoResponse(message); if (responseEchoNeedPing != null) { _needPing = false; return responseEchoNeedPing; } } if (NeedData == NeedDataEnum.NoNeed) { var responseNoNeed = GetEchoResponse(message); if (responseNoNeed != null) return responseNoNeed; } else if (NeedData == NeedDataEnum.CheckTemperature) { if (message.Id == Request.ItemsInfo.Id || message.Id == Request.CJTempInfo.Id) { var communicationError = message.Data[4].GetBit(7); if (communicationError) Logger.Log(ApplicationConfig.DebugFile, "ERR: Chyba komunikace"); else { string itemName = ""; if (message.Id == Request.CJTempInfo.Id) { lock (CJ.Lock) { CJ.Temperature = Functions.GetTemperatureFromData(message.Data); Logger.Log(ApplicationConfig.DebugFile, string.Format("TEMP: CJ - {0:D2} C", CJ.Temperature.ToString(CultureInfo.InvariantCulture))); } _lastItemId++; _numberOfRetries = 0; _needPing = true; } else { lock (CJ.Items) { var item = CJ.Items.Single(i => i.Id == message.Data[2]); itemName = ConfigFile.GetItems().Single(i => i.Id == message.Data[2]).Name; item.OpenedPercent = message.Data[4]; item.Temperature = Functions.GetTemperatureFromData(message.Data); item.Started = message.Data[4].GetBit(0); item.IsTenCanal = message.Data[4].GetBit(1); item.TenCanalRelayOrder = Convert.ToByte(8 * (message.Data[4].GetBit(6) ? 1 : 0) + 4 * (message.Data[4].GetBit(5) ? 1 : 0) + 2 * (message.Data[4].GetBit(4) ? 1 : 0) + 1 * (message.Data[4].GetBit(3) ? 1 : 0)); item.BatteryLow = message.Data[6].GetBit(7); Logger.Log(ApplicationConfig.DebugFile, string.Format("TEMP: {0} - {1:D2} C", itemName, item.Temperature.ToString(CultureInfo.InvariantCulture))); if (item.BatteryLow) Logger.Log(ApplicationConfig.DebugFile, string.Format("BAT LOW: {0}", itemName)); } _lastItemId++; _numberOfRetries = 0; _needPing = true; //Logger.Log(ApplicationConfig.DebugFile, "INFO: Nový pokus 2 " + _numberOfRetries + " o dotaz na id " + _lastItemId); } } } var responseMessage = Response.GetItemsResponse(_lastItemId); if (responseMessage == null) { _lastItemId = 0; _numberOfRetries = 0; _needPing = false; //Logger.Log(ApplicationConfig.DebugFile, "INFO: Nový pokus " + _numberOfRetries + " o dotaz na id " + _lastItemId); return new ProcessingMesssage() { NeedsConfirm = false, NewState = new PripojenoState() }; } _numberOfRetries++; //Logger.Log(ApplicationConfig.DebugFile, "INFO: Pokus " + _numberOfRetries + " o dotaz na id " + _lastItemId); return new ProcessingMesssage() { NeedsConfirm = false, ResponseMessage = responseMessage, Text = "Žádost o informace" }; } var response = GetEchoResponse(message); if (response != null) return response; return new ProcessingMesssage(); }