/// <summary> /// Get protocol activation /// </summary> /// <param name="data">>received data</param> public void ProcessStatusResponse(RFData data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } if (data.Fields["Protocol"] != "STATUS" || !data.Fields.ContainsKey("setRF433") || !data.Fields.ContainsKey("setNodoNRF") || !data.Fields.ContainsKey("setMilight") || !data.Fields.ContainsKey("setLivingColors") || !data.Fields.ContainsKey("setAnsluta") || !data.Fields.ContainsKey("setGPIO") || !data.Fields.ContainsKey("setMysensors") || !data.Fields.ContainsKey("setBLE")) { throw new FormatException("RF Data did not contain correct status data"); } SetRF433 = ProtocolParser.ToBoolean(data.Fields["setRF433"]); SetNodoNRF = ProtocolParser.ToBoolean(data.Fields["setNodoNRF"]); SetMiLight = ProtocolParser.ToBoolean(data.Fields["setMilight"]); SetLivingColors = ProtocolParser.ToBoolean(data.Fields["setLivingColors"]); SetAnsluta = ProtocolParser.ToBoolean(data.Fields["setAnsluta"]); SetGPIO = ProtocolParser.ToBoolean(data.Fields["setGPIO"]); SetMySensors = ProtocolParser.ToBoolean(data.Fields["setMysensors"]); SetBLE = ProtocolParser.ToBoolean(data.Fields["setBLE"]); }
internal static RFData ProcessData(string indata) { RFData rf = new RFData(); string[] splitProtocol = indata.Split(DataDelim); if (splitProtocol.Length == 1 || // RTS Record: 0 Address: FFFFFF RC: FFFF … splitProtocol[1].Equals("PING")) // ping { rf.Fields.Add("LOG", indata); return(rf); } // data sent if (indata.StartsWith(((int)Direction.MasterToRF).ToString())) { rf.Protocol = splitProtocol[1]; rf.Fields.Add("Protocol", rf.Protocol); rf.Fields.Add("ID", splitProtocol[2]); rf.Fields.Add("SWITCH", splitProtocol[3]); rf.Fields.Add("CMD", splitProtocol[4]); } else // data received { rf.Counter = splitProtocol[1]; rf.Protocol = splitProtocol[2]; rf.Fields.Add("Protocol", rf.Protocol); ProcessesFields(splitProtocol, ref rf); } return(rf); }
internal static void ProcessesFields(string[] fields, ref RFData rf) { string[] labelSplit; // Skip pass "20;xx; for (int i = 3; i < fields.Length - 1; i++) { try { labelSplit = fields[i].Split(FieldDelim); rf.Fields.Add(labelSplit[0], labelSplit[1]); } catch { }//todo: remove? } }
/// <summary> /// Get rflink software version /// </summary> /// <param name="data">received data</param> public void ProcessVerResponse(RFData data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } if (!data.Fields["Protocol"].StartsWith("VER") || !data.Fields.ContainsKey("REV") || !data.Fields.ContainsKey("BUILD")) { throw new FormatException("RF Data did not contain correct version data"); } Version = data.Fields["Protocol"]; Rev = data.Fields["REV"]; Build = data.Fields["BUILD"]; }
/// <summary> /// Data to be processed when received by the RFlink serial port /// </summary> /// <param name="sender">sender</param> /// <param name="e">Data received over serial port</param> private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { lock (receiveLock) { SerialPort sp = sender as SerialPort; string indata = sp.ReadLine(); try { RFData rf = ProtocolParser.ProcessData(indata); if (rf != null) { if (!string.IsNullOrWhiteSpace(rf.Protocol) && rf.Protocol == "PONG") { LastPong = DateTime.Now; } else if (!string.IsNullOrWhiteSpace(rf.Protocol) && rf.Protocol == "STATUS") { Settings.ProcessStatusResponse(rf); statusReceived.Set(); } else if (!string.IsNullOrWhiteSpace(rf.Protocol) && rf.Protocol.StartsWith("VER")) { Settings.ProcessVerResponse(rf); versionReceived.Set(); } else if (libraryStatus == LibraryStatus.Ready) { ReturnRFOutput(rf); } } } catch (FormatException) { // Failed to process settings/version, ignore } catch (Exception ex) { ReturnStdOut($"Invalid data «{indata}». \r\nException {ex.Message} \r\n {ex.StackTrace}"); } } }
/// <summary> /// Callback for rflink rf log /// </summary> protected void ReturnRFOutput(RFData data) { EventRFOut?.Invoke(this, data); }