void DevicePluginIntertechno::radioData(const QList<int> &rawData) { // filter right here a wrong signal length if(rawData.length() != 49){ return; } QList<Device*> deviceList = deviceManager()->findConfiguredDevices(intertechnoRemote); if(deviceList.isEmpty()){ return; } int delay = rawData.first()/31; QByteArray binCode; // ======================================= // average 314 if(delay > 300 && delay < 400){ // go trough all 48 timings (without sync signal) for(int i = 1; i <= 48; i+=2 ){ int div; int divNext; // if short if(rawData.at(i) <= 700){ div = 1; }else{ div = 3; } // if long if(rawData.at(i+1) < 700){ divNext = 1; }else{ divNext = 3; } // _ // if we have | |___ = 0 -> in 4 delays => 1000 // _ // if we have ___| | = 1 -> in 4 delays => 0001 if(div == 1 && divNext == 3){ binCode.append('0'); }else if(div == 3 && divNext == 1){ binCode.append('1'); }else{ return; } } }else{ return; } // ======================================= // Check nibble 16-19, must be 0001 if(binCode.mid(16,4) != "0001"){ return; } // ======================================= // Get family code QString familyCode; bool ok; QByteArray familyCodeBin = binCode.left(8); int famiyCodeInt = familyCodeBin.toInt(&ok,2); if(!ok){ return; } switch (famiyCodeInt) { case 0b00000000: familyCode = "A"; break; case 0b01000000: familyCode = "B"; break; case 0b00010000: familyCode = "C"; break; case 0b01010000: familyCode = "D"; break; case 0b00000100: familyCode = "E"; break; case 0b01000100: familyCode = "F"; break; case 0b00010100: familyCode = "G"; break; case 0b01010100: familyCode = "H"; break; case 0b00000001: familyCode = "I"; break; case 0b01000001: familyCode = "J"; break; case 0b00010001: familyCode = "K"; break; case 0b01010001: familyCode = "L"; break; case 0b00000101: familyCode = "M"; break; case 0b01000101: familyCode = "N"; break; case 0b00010101: familyCode = "O"; break; case 0b01010101: familyCode = "P"; break; default: return; } // ======================================= // Get button code QString buttonCode; QByteArray buttonCodeBin = binCode.mid(8,8); int buttonCodeInt = buttonCodeBin.toInt(&ok,2); if(!ok){ return; } switch (buttonCodeInt) { case 0b00000000: buttonCode = "1"; break; case 0b01000000: buttonCode = "2"; break; case 0b00010000: buttonCode = "3"; break; case 0b01010000: buttonCode = "4"; break; case 0b00000100: buttonCode = "5"; break; case 0b01000100: buttonCode = "6"; break; case 0b00010100: buttonCode = "7"; break; case 0b01010100: buttonCode = "8"; break; case 0b00000001: buttonCode = "9"; break; case 0b01000001: buttonCode = "10"; break; case 0b00010001: buttonCode = "11"; break; case 0b01010001: buttonCode = "12"; break; case 0b00000101: buttonCode = "13"; break; case 0b01000101: buttonCode = "14"; break; case 0b00010101: buttonCode = "15"; break; case 0b01010101: buttonCode = "16"; break; default: return; } // ======================================= // get power status -> On = 0100, Off = 0001 bool power; if(binCode.right(4).toInt(0,2) == 5){ power = true; }else if(binCode.right(4).toInt(0,2) == 4){ power = false; }else{ return; } qDebug() << "family code = " << familyCode << "button code =" << buttonCode << power; // =================================================== Device *device = 0; foreach (Device *dev, deviceList) { if (dev->paramValue("familyCode").toString() == familyCode) { // Yippie! We found the device. device = dev; break; } } if (!device) { qWarning() << "couldn't find any configured device for intertech familyCode:" << familyCode; return; } ParamList params; Param powerParam("power", power); params.append(powerParam); // FIXME: find a better way to get to the remote DeviceClass DeviceClass deviceClass = supportedDevices().first(); foreach (const EventType &eventType, deviceClass.eventTypes()) { if (eventType.name() == buttonCode) { qDebug() << "emit event " << pluginName() << familyCode << eventType.name() << power; Event event = Event(eventType.id(), device->id(), params); emit emitEvent(event); return; } } }
QString HttpDaemon::generateWebPage() { DeviceClass deviceClass = m_plugin->supportedDevices().first(); QString body = QString( "<html>" "<body>" "<h1>Mock device Controller</h1>\n" "<hr>" "<h2>Device Information</h2>" "Name: %1<br>" "ID: %2<br>" "DeviceClass ID: %3<br>").arg(m_device->paramValue("name").toString()).arg(m_device->id().toString()).arg(deviceClass.id().toString()); body.append("<hr>"); body.append("<h2>States</h2>"); body.append("<table>"); for (int i = 0; i < deviceClass.stateTypes().count(); ++i) { body.append("<tr>"); body.append("<form action=\"/setstate\" method=\"get\">"); const StateType &stateType = deviceClass.stateTypes().at(i); body.append("<td>" + stateType.name() + "</td>"); body.append(QString("<td><input type='input'' name='%1' value='%2'></td>").arg(stateType.id().toString()).arg(m_device->states().at(i).value().toString())); body.append("<td><input type=submit value='Set State'/></td>"); body.append("</form>"); body.append("</tr>"); } body.append("</table>"); body.append("<hr>"); body.append("<h2>Events</h2>"); body.append("<table>"); for (int i = 0; i < deviceClass.eventTypes().count(); ++i) { const EventType &eventType = deviceClass.eventTypes().at(i); body.append(QString( "<tr>" "<form action=\"/generateevent\" method=\"get\">" "<td>%1<input type='hidden' name='eventtypeid' value='%2'/></td>" "<td>").arg(eventType.name()).arg(eventType.id().toString())); if (!eventType.name().endsWith(" changed")) { body.append("<input type='submit' value='Generate'/>"); } body.append("</td>" "</form>" "</tr>" ); } body.append("</table>"); body.append("<hr>"); body.append("<h2>Actions</h2>"); body.append("<table border=2px>"); body.append("<tr><td>Name</td><td>Type ID</td><td>Timestamp</td></tr>"); for (int i = 0; i < m_actionList.count(); ++i) { ActionTypeId actionTypeId = ActionTypeId(m_actionList.at(i).first); QDateTime timestamp = m_actionList.at(i).second; QString actionName; foreach (const ActionType &at, deviceClass.actionTypes()) { if (at.id() == actionTypeId) { actionName = at.name(); break; } } body.append(QString( "<tr>" "<td>%1</td>" "<td>%2</td>" "<td>%3</td>" "</tr>" ).arg(actionName).arg(actionTypeId.toString()).arg(timestamp.toString())); } body.append("</table>"); body.append("</body></html>\n"); return generateHeader() + body; }