public void VerifyThatMessageTypesAndCodesMapToErrorMessage() { MessageError unknownMessageError = new MessageError(MessageSource.Unknown, null); List<string> errorCodes = new List<string>(new[] { "Buffer", "Syntax", "TimOut", "NoAuth", "Method" }); foreach (MessageSource source in Enum.GetNames(typeof (MessageSource)).Select(name => (MessageSource) Enum.Parse(typeof (MessageSource), name))) { foreach (MessageError error in errorCodes.Select(code => new MessageError(source, code))) { Assert.IsNotNullOrEmpty(error.Message); Assert.AreNotEqual(unknownMessageError.Message, error.Message); } } }
public static Message Parse(string message) { if (String.IsNullOrEmpty(message)) { throw new ArgumentException("Message can not be null or empty."); } if (message.Length < 3) { throw new ArgumentException("Message must be at least 3 characters long."); } message = message.Trim(); string source = ""; if (message.Substring(2, 1) == ":") { source = message.Substring(0, 2).ToUpper(); message = message.Substring(3); } Message x10Msg; if (message.Length == 3 && message.ToUpper() == "X10") { x10Msg = new Boot(); } else if (message.Length >= 3 && message.Substring(0, 3).ToUpper() == "_EX") { x10Msg = new MessageError(ParseSource(source), message.Substring(3)); } else { message = message.ToUpper(); if (message.Length != 3 && message.Length != 9) { throw new ArgumentException( message.Length + " characters is an invalid message length. " + "Valid messages are 3 or 9 characters long."); } // Standard or Extended if ((message[0] >= 'A' && message[0] <= 'P') || message[0] == '*') { x10Msg = ParseStandardAndExtended(message); } else { if (message.Length != 3) { throw new ArgumentException( "9 characters is an invalid message length for this type. " + "Only extended code messages starting with house code A-P can be this length."); } // Scenario Execute if (message[0] == 'S') { x10Msg = ParseScenario(message); } // Module State else if (message[0] == 'R') { x10Msg = ParseModuleState(message); } else { throw new ArgumentException( message[0] + " is an invalid house/type character. " + "Valid characters are A-P, S or R."); } } } x10Msg.SourceString = source; x10Msg.Source = ParseSource(source); return(x10Msg); }
private void DataReceived(object sender, SerialDataReceivedEventArgs e) { _serialBuffer.Append(SerialPort.ReadExisting()); string messageData = _serialBuffer.ToString(); int lastMessageEnd = messageData.LastIndexOf('\n'); if (lastMessageEnd > -1) { messageData = messageData.Substring(0, lastMessageEnd); _serialBuffer.Remove(0, lastMessageEnd); string[] messages = messageData.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); foreach (string message in messages) { string messageTrimmed = message.Trim(new[] {' ', '\r', '\n'}); Message x10Message; try { x10Message = Message.Parse(messageTrimmed); _log.Debug(x10Message.GetType().Name + " parsed successfully: " + messageTrimmed); } catch (Exception ex) { string errorMessage = ex.GetType().Name + " thrown when parsing message \"" + messageTrimmed + "\". " + ex.Message; _log.Warn(errorMessage); x10Message = new MessageError(MessageSource.Parser, "Parser", errorMessage); } InvokeMessageReceived(x10Message); } } }