diff --git a/apps/aqhome-cgi/modules/mdevices.c b/apps/aqhome-cgi/modules/mdevices.c index 14ce132..baca810 100644 --- a/apps/aqhome-cgi/modules/mdevices.c +++ b/apps/aqhome-cgi/modules/mdevices.c @@ -32,6 +32,7 @@ #define P_DEVICEREAD AQH_MODDEVICES_PERMS_DEVICEREAD #define P_VALUEREAD AQH_MODDEVICES_PERMS_VALUEREAD +#define P_VALUEWRITE AQH_MODDEVICES_PERMS_VALUEWRITE @@ -48,10 +49,17 @@ static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session static void _handleRqIndexGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqValuesGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); +static void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _runIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf); static void _runValues(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf); +static void _runSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf); +static void _writeValueListToTable(const AQH_VALUE_LIST *valueList, GWEN_BUFFER *dbuf); +static void _writeValueToTable(const AQH_VALUE *value, GWEN_BUFFER *dbuf); +static void _addValueActionToForm(const AQH_VALUE *value, GWEN_BUFFER *dbuf); +static uint32_t _colorFromHexString(const char *s); + /* ------------------------------------------------------------------------------------------------ @@ -60,8 +68,9 @@ static void _runValues(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, A */ static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={ - {"index.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD, _handleRqIndexGet}, - {"values.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValuesGet}, + {"index.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD, _handleRqIndexGet}, + {"values.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValuesGet}, + {"setdata.html", AQCGI_REQUEST_METHOD_POST, P_VALUEWRITE, _handleRqSetDataPost}, {NULL, 0, 0, NULL} }; @@ -186,6 +195,13 @@ void _handleRqValuesGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, +void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) +{ + AQH_ModDataClient_HandleRequest(m, rq, session, _runSetData, dbuf); +} + + + void _runIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf) { AQH_DEVICE_LIST *deviceList; @@ -210,11 +226,13 @@ void _runIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATAC "
| Name | " - "Type | " - "Modality | " - "Driver | " - "Device | " - "Name for System | " - "
|---|
No values.
\n"); + } + AQH_Value_List_free(valueList); } } +void _runSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf) +{ + AQH_SERVICE *sv; + GWEN_DB_NODE *dbPost; + const char *sDeviceName; + AQH_VALUE_LIST *valueList; + + /* sample data */ + sv=AQH_ModService_GetService(m); + dbPost=AQCGI_Request_GetDbPostBody(rq); + sDeviceName=dbPost?GWEN_DB_GetCharValue(dbPost, "device", 0, NULL):NULL; + valueList=sDeviceName?AQH_DataClient_GetValues(dc, sDeviceName, 0):NULL; + if (valueList && AQH_Value_List_GetCount(valueList)) { + const AQH_VALUE *value; + + value=AQH_Value_List_First(valueList); + while(value) { + if (AQH_Value_GetValueType(value)==AQH_ValueType_Actor) { + const char *sValueSystemName; + const char *sValueName; + const char *sValue; + int rv; + + sValueSystemName=AQH_Value_GetNameForSystem(value); + sValueName=AQH_Value_GetName(value); + sValue=GWEN_DB_GetCharValue(dbPost, sValueName, 0, NULL); + if (sValueName && *sValueName) { + DBG_ERROR(NULL, "Setting value %s to %s", sValueName?sValueName:"no name", sValue?sValue:"no value"); + switch(AQH_Value_GetModality(value)) { + case AQH_ValueModality_RGBW: + if (sValue) { + uint32_t color; + char colbuf[16]; + + color=_colorFromHexString(sValue); + snprintf(colbuf, sizeof(colbuf), "0x%08x", color); + DBG_ERROR(NULL, "Send value [%s] to %s", colbuf, sValueSystemName); + rv=AQH_DataClient_SetData(dc, value, colbuf); + if (rv<0) { + DBG_ERROR(NULL, "Error sending data: %d", rv); + GBAA(dbuf, "Error setting value for %s
", sValueSystemName); + } + } + break; + case AQH_ValueModality_OnOff: + if (sValue) { + if (strcasecmp(sValue, "unchanged")==0) { + DBG_ERROR(NULL, "Value %s unchanged", sValueSystemName); + } + else if (strcasecmp(sValue, "on")==0) { + DBG_ERROR(NULL, "Send value 1 to %s", sValueSystemName); + rv=AQH_DataClient_SetData(dc, value, "1"); + if (rv<0) { + DBG_ERROR(NULL, "Error sending data: %d", rv); + } + } + else if (strcasecmp(sValue, "off")==0) { + DBG_ERROR(NULL, "Send value 0 to %s", sValueSystemName); + rv=AQH_DataClient_SetData(dc, value, "0"); + if (rv<0) { + DBG_ERROR(NULL, "Error sending data: %d", rv); + } + } + else { + } + } + break; + case AQH_ValueModality_OnOffAuto: + if (sValue) { + if (strcasecmp(sValue, "unchanged")==0) { + DBG_ERROR(NULL, "Value %s unchanged", sValueSystemName); + } + else if (strcasecmp(sValue, "on")==0) { + DBG_ERROR(NULL, "Send value 1 to %s", sValueSystemName); + rv=AQH_DataClient_SetData(dc, value, "1"); + if (rv<0) { + DBG_ERROR(NULL, "Error sending data: %d", rv); + } + } + else if (strcasecmp(sValue, "off")==0) { + DBG_ERROR(NULL, "Send value 0 to %s", sValueSystemName); + rv=AQH_DataClient_SetData(dc, value, "0"); + if (rv<0) { + DBG_ERROR(NULL, "Error sending data: %d", rv); + } + } + else if (strcasecmp(sValue, "auto")==0) { + DBG_ERROR(NULL, "Send value 2 to %s", sValueSystemName); + rv=AQH_DataClient_SetData(dc, value, "2"); + if (rv<0) { + DBG_ERROR(NULL, "Error sending data: %d", rv); + } + } + else { + DBG_ERROR(NULL, "Invalid value [%s] for %s", sValue, sValueSystemName); + } + } + break; + default: + break; + } /* switch */ + } /* if (sValueName) */ + } + value=AQH_Value_List_Next(value); + } /* while */ + + + } + AQH_Value_List_free(valueList); + + if (sDeviceName && *sDeviceName) { + GWEN_BUFFER *pbuf; + + pbuf=GWEN_Buffer_new(0, 256, 0, 1); + GBAS(pbuf, "Location: /aqbt/devices/values.html?device="); + GWEN_Text_EscapeToBufferTolerant(sDeviceName, pbuf); + AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(pbuf)); + GWEN_Buffer_free(pbuf); + } + AQCGI_Request_SetResponseCode(rq, 303); + AQCGI_Request_SetResponseText(rq, "See other"); +} + + + +void _writeValueListToTable(const AQH_VALUE_LIST *valueList, GWEN_BUFFER *dbuf) +{ + const AQH_VALUE *value; + + GBAS(dbuf, + "| Name | " + "Type | " + "Modality | " +#if 0 + "Driver | " + "Device | " + "Name for System | " +#endif + "Action | " + "
|---|