00001 #include "X10Device.h"
00002 namespace rwil {
00003 ExecuteReturns::Returns X10Device::ExecuteMessage(const Message & msg)
00004 {
00005 char house, number;
00006 char temp[2];
00007 temp[1] = '\0';
00008 temp[0]= m_house;
00009 house = GetRealHouse(temp);
00010 number = GetRealNumber(m_number);
00011 if(msg.GetCommand()=="dim")
00012 {
00013 int percent = StringToInt(msg.GetParam("percent"));
00014 assert((percent >= 0) && (percent <= 100));
00015 if(!SupportsDim()) assert(0);
00016 X10::send_Dim_X10(house, number, percent);
00017 int real_percent = X10::get_status_X10(house, number);
00018 if((real_percent < 0) || (abs(percent-real_percent) > 3))
00019 {
00020 return ExecuteReturns::PleaseRetry;
00021 }
00022 brightness = real_percent;
00023 }
00024 if(msg.GetCommand()=="off")
00025 {
00026
00027 if(!SupportsDim())
00028 {
00029 X10::send_X10(house, number, 'G');
00030 }
00031 else
00032 {
00033 X10::send_Dim_X10(house, number, 0);
00034 }
00035 int real_percent = X10::get_status_X10(house, number);
00036 if((real_percent < 0) || (abs(real_percent) > 3))
00037 {
00038 return ExecuteReturns::PleaseRetry;
00039 }
00040 brightness = 0;
00041 }
00042 if(msg.GetCommand()=="on")
00043 {
00044 if(!SupportsDim())
00045 {
00046 X10::send_X10(house, number, 'E');
00047 }
00048 else
00049 {
00050 X10::send_Dim_X10(house, number, 100);
00051 }
00052 int real_percent = X10::get_status_X10(house, number);
00053 if((real_percent < 0) || (abs(100-real_percent) > 3))
00054 {
00055 return ExecuteReturns::PleaseRetry;
00056 }
00057 brightness = 100;
00058 }
00059
00060 m_output.Add(EncapsulatingMessage("success", msg));
00061 return ExecuteReturns::DontRetry;
00062 }
00063
00064 char X10Device::GetRealHouse(std::string house) const
00065 {
00066 char chouse = house[0];
00067 switch(chouse)
00068 {
00069 case 'a' : case 'A' : return 'F';
00070 case 'b' : case 'B' : return 'N';
00071 case 'c' : case 'C' : return 'B';
00072 case 'd' : case 'D' : return 'J';
00073 case 'e' : case 'E' : return 'A';
00074 case 'f' : case 'F' : return 'I';
00075 case 'g' : case 'G' : return 'E';
00076 case 'h' : case 'H' : return 'M';
00077 case 'i' : case 'I' : return 'G';
00078 case 'j' : case 'J' : return 'O';
00079 case 'k' : case 'K' : return 'C';
00080 case 'l' : case 'L' : return 'K';
00081 case 'm' : case 'M' : return '@';
00082 case 'n' : case 'N' : return 'H';
00083 case 'o' : case 'O' : return 'D';
00084 case 'p' : case 'P' : return 'L';
00085 }
00086 assert(0);
00087 }
00088
00089 char X10Device::GetRealNumber(int unitnumber) const
00090 {
00091 switch(unitnumber)
00092 {
00093 case 1 : return 'L';
00094 case 2 : return '\\';
00095 case 3 : return 'D';
00096 case 4 : return 'T';
00097 case 5 : return 'B';
00098 case 6 : return 'R';
00099 case 7 : return 'J';
00100 case 8 : return 'Z';
00101 case 9 : return 'N';
00102 case 10 : return '^';
00103 case 11 : return 'F';
00104 case 12 : return 'V';
00105 case 13 : return '@';
00106 case 14 : return 'P';
00107 case 15 : return 'H';
00108 case 16 : return 'X';
00109 }
00110 assert(0);
00111 }
00112
00113 void X10Device::SetHouse(std::string house) { m_house = house[0]; }
00114 void X10Device::SetNumber(int number) { m_number = number; }
00115
00116 bool X10Device::SupportsDim() {return true; }
00117 std::string X10Device::GetStatus() const { return IntToString(brightness); }
00118 X10Device::X10Device(const std::string &name, MessageList& output, char house, int number) : Device(name, output), m_house(house), m_number(number) {}
00119 }