result_t gd_base::hsb(double hue, double saturation, double brightness, int32_t& retVal) { if (hue < 0 || hue > 360 || saturation < 0 || saturation > 1 || brightness < 0 || brightness > 1) return CHECK_ERROR(CALL_E_INVALIDARG); retVal = hsb2rgb(hue, saturation, brightness); return 0; }
result_t gd_base::hsba(double hue, double saturation, double brightness, double alpha, int32_t& retVal) { if (hue < 0 || hue > 360 || saturation < 0 || saturation > 1 || brightness < 0 || brightness > 1 || alpha < 0 || alpha > 1) return CHECK_ERROR(CALL_E_INVALIDARG); retVal = (doubleToInt(alpha * 127) << 24) | hsb2rgb(hue, saturation, brightness); return 0; }
/*- * make sure this function is NOT static under WIN32. We use it to * create the colortable in WIN32 specific stuff in xlock.c */ void #else static void #endif hsbramp(double h1, double s1, double b1, double h2, double s2, double b2, int count, unsigned char *red, unsigned char *green, unsigned char *blue) { double dh, ds, db; dh = (h2 - h1) / count; ds = (s2 - s1) / count; db = (b2 - b1) / count; while (count--) { hsb2rgb(h1, s1, b1, red++, green++, blue++); h1 += dh; s1 += ds; b1 += db; } }
void MQTT::on_message(const struct mosquitto_message *message) { std::string topic = message->topic; std::string qMessage = std::string((char*)message->payload, (char*)message->payload + message->payloadlen); _log.Log(LOG_NORM, "MQTT: Topic: %s, Message: %s", topic.c_str(), qMessage.c_str()); if (qMessage.empty()) return; if (topic != m_TopicIn) return; Json::Value root; Json::Reader jReader; std::string szCommand = "udevice"; std::vector<std::vector<std::string> > result; uint64_t idx = 0; bool ret = jReader.parse(qMessage, root); if ((!ret) || (!root.isObject())) goto mqttinvaliddata; try { if (!root["command"].empty()) { szCommand = root["command"].asString(); } if ((szCommand == "udevice") || (szCommand == "switchlight") || (szCommand == "getdeviceinfo")) { idx = (uint64_t)root["idx"].asInt64(); //Get the raw device parameters result = m_sql.safe_query("SELECT HardwareID, DeviceID, Unit, Type, SubType FROM DeviceStatus WHERE (ID==%" PRIu64 ")", idx); if (result.empty()) { _log.Log(LOG_ERROR, "MQTT: unknown idx received!"); return; } } else if ((szCommand == "switchscene") || (szCommand == "getsceneinfo")) { idx = (uint64_t)root["idx"].asInt64(); result = m_sql.safe_query("SELECT Name FROM Scenes WHERE (ID==%" PRIu64 ")", idx); if (result.empty()) { _log.Log(LOG_ERROR, "MQTT: unknown idx received!"); return; } } else if (szCommand == "setuservariable") { idx = (uint64_t)root["idx"].asInt64(); result = m_sql.safe_query("SELECT Name FROM UserVariables WHERE (ID==%" PRIu64 ")", idx); if (result.empty()) { _log.Log(LOG_ERROR, "MQTT: unknown idx received!"); return; } } if (szCommand == "udevice") { int HardwareID = atoi(result[0][0].c_str()); std::string DeviceID = result[0][1]; int unit = atoi(result[0][2].c_str()); int devType = atoi(result[0][3].c_str()); int subType = atoi(result[0][4].c_str()); bool bnvalue = !root["nvalue"].empty(); bool bsvalue = !root["svalue"].empty(); bool bParseValue = !root["parse"].empty(); if (!bnvalue && !bsvalue) goto mqttinvaliddata; if (bnvalue) { if (!root["nvalue"].isInt()) goto mqttinvaliddata; } if (bsvalue) { if (!root["svalue"].isString()) goto mqttinvaliddata; } int nvalue = (bnvalue) ? root["nvalue"].asInt() : 0; std::string svalue = (bsvalue) ? root["svalue"].asString() : ""; bool bParseTrigger = (bParseValue) ? root["parse"].asBool() : true; int signallevel = 12; bool b_signallevel = ! root["RSSI"].empty(); if (b_signallevel) { if (! root["RSSI"].isInt()) goto mqttinvaliddata; signallevel = root["RSSI"].asInt(); } int batterylevel = 255; bool b_batterylevel = ! root["Battery"].empty(); if (b_batterylevel) { if (! root["Battery"].isInt()) goto mqttinvaliddata; batterylevel = root["Battery"].asInt(); } if (!m_mainworker.UpdateDevice(HardwareID, DeviceID, unit, devType, subType, nvalue, svalue, signallevel, batterylevel, bParseTrigger)) { _log.Log(LOG_ERROR, "MQTT: Problem updating sensor (check idx, hardware enabled)"); return; } return; } else if (szCommand == "switchlight") { std::string switchcmd = root["switchcmd"].asString(); if ((switchcmd != "On") && (switchcmd != "Off") && (switchcmd != "Toggle") && (switchcmd != "Set Level")) goto mqttinvaliddata; int level = 0; if (!root["level"].empty()) { if (root["level"].isString()) level = atoi(root["level"].asString().c_str()); else level = root["level"].asInt(); } if (!m_mainworker.SwitchLight(idx, switchcmd, level, NoColor, false, 0) == true) { _log.Log(LOG_ERROR, "MQTT: Error sending switch command!"); } } else if (szCommand == "setcolbrightnessvalue") { idx = (uint64_t)root["idx"].asInt64(); if (root["switchcmd"].empty()) root["switchcmd"] = "On"; std::string switchcmd = root["switchcmd"].asString(); if ((switchcmd != "On") && (switchcmd != "Off") && (switchcmd != "Toggle") && (switchcmd != "Set Level") && (switchcmd != "Set Color")) goto mqttinvaliddata; _tColor color; std::string hex = root["hex"].asString(); std::string hue = root["hue"].asString(); std::string sat = root["sat"].asString(); std::string brightness = root["level"].asString(); std::string iswhite; if (!root["isWhite"].empty()) { if (root["isWhite"].isString()) iswhite = root["isWhite"].asString(); else { iswhite = root["isWhite"].asInt()!=0?"true":"false"; } } int ival = 100; float brightnessAdj = 1.0f; if (!root["color"].empty()) { color = _tColor(root["color"]); if (color.mode == ColorModeRGB) { // Normalize RGB to full brightness float hsb[3]; int r, g, b; rgb2hsb(color.r, color.g, color.b, hsb); hsb2rgb(hsb[0]*360.0f, hsb[1], 1.0f, r, g, b, 255); color.r = r; color.g = g; color.b = b; brightnessAdj = hsb[2]; } //_log.Debug(DEBUG_NORM, "MQTT: setcolbrightnessvalue: color: '%s', bri: '%s'", color.toString().c_str(), brightness.c_str()); } else if (!hex.empty()) { uint64_t ihex = hexstrtoui64(hex); //_log.Debug(DEBUG_NORM, "MQTT: setcolbrightnessvalue: hex: '%s', ihex: %" PRIx64 ", bri: '%s', iswhite: '%s'", hex.c_str(), ihex, brightness.c_str(), iswhite.c_str()); uint8_t r = 0; uint8_t g = 0; uint8_t b = 0; uint8_t cw = 0; uint8_t ww = 0; switch (hex.length()) { case 6: //RGB r = (uint8_t)((ihex & 0x0000FF0000) >> 16); g = (uint8_t)((ihex & 0x000000FF00) >> 8); b = (uint8_t)ihex & 0xFF; float hsb[3]; int tr, tg, tb; // tmp of 'int' type so can be passed as references to hsb2rgb rgb2hsb(r, g, b, hsb); // Normalize RGB to full brightness hsb2rgb(hsb[0]*360.0f, hsb[1], 1.0f, tr, tg, tb, 255); r = tr; g = tg; b = tb; brightnessAdj = hsb[2]; // Backwards compatibility: set iswhite for unsaturated colors iswhite = (hsb[1] < (20.0 / 255.0)) ? "true" : "false"; color = _tColor(r, g, b, cw, ww, ColorModeRGB); break; case 8: //RGB_WW r = (uint8_t)((ihex & 0x00FF000000) >> 24); g = (uint8_t)((ihex & 0x0000FF0000) >> 16); b = (uint8_t)((ihex & 0x000000FF00) >> 8); ww = (uint8_t)ihex & 0xFF; color = _tColor(r, g, b, cw, ww, ColorModeCustom); break; case 10: //RGB_CW_WW r = (uint8_t)((ihex & 0xFF00000000) >> 32); g = (uint8_t)((ihex & 0x00FF000000) >> 24); b = (uint8_t)((ihex & 0x0000FF0000) >> 16); cw = (uint8_t)((ihex & 0x000000FF00) >> 8); ww = (uint8_t)ihex & 0xFF; color = _tColor(r, g, b, cw, ww, ColorModeCustom); break; } if (iswhite == "true") color.mode = ColorModeWhite; //_log.Debug(DEBUG_NORM, "MQTT: setcolbrightnessvalue: trgbww: %02x%02x%02x%02x%02x, color: '%s'", r, g, b, cw, ww, color.toString().c_str()); } else if (!hue.empty()) { int r, g, b; //convert hue to RGB float iHue = float(atof(hue.c_str())); float iSat = 100.0f; if (!sat.empty()) iSat = float(atof(sat.c_str())); hsb2rgb(iHue, iSat/100.0f, 1.0f, r, g, b, 255); color = _tColor(r, g, b, 0, 0, ColorModeRGB); if (iswhite == "true") color.mode = ColorModeWhite; //_log.Debug(DEBUG_NORM, "MQTT: setcolbrightnessvalue2: hue: %f, rgb: %02x%02x%02x, color: '%s'", iHue, r, g, b, color.toString().c_str()); } if (color.mode == ColorModeNone) { goto mqttinvaliddata; } if (!brightness.empty()) ival = atoi(brightness.c_str()); ival = int(ival * brightnessAdj); ival = std::max(ival, 0); ival = std::min(ival, 100); _log.Log(LOG_STATUS, "MQTT: setcolbrightnessvalue: ID: %" PRIx64 ", bri: %d, color: '%s'", idx, ival, color.toString().c_str()); if (!m_mainworker.SwitchLight(idx, switchcmd, ival, color, false, 0) == true) { _log.Log(LOG_ERROR, "MQTT: Error sending switch command!"); } }