예제 #1
0
 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);
         }
     }
 }
예제 #2
0
파일: Message.cs 프로젝트: puskyer/x10-1
        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);
        }
예제 #3
0
파일: Serial.cs 프로젝트: gerzo/x10
 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);
         }
     }
 }