diff --git a/apps/esp8266/st_air_monitor/main/caps_airQualitySensor.c b/apps/esp8266/st_air_monitor/main/caps_airQualitySensor.c index 02f4e754..6e26ef50 100644 --- a/apps/esp8266/st_air_monitor/main/caps_airQualitySensor.c +++ b/apps/esp8266/st_air_monitor/main/caps_airQualitySensor.c @@ -27,7 +27,7 @@ static int caps_airQualitySensor_get_airQuality_value(caps_airQualitySensor_data { if (!caps_data) { printf("caps_data is NULL\n"); - return NULL; + return caps_helper_airQualitySensor.attr_airQuality.min - 1; } return caps_data->airQuality_value; } @@ -65,7 +65,16 @@ static void caps_airQualitySensor_attr_airQuality_send(caps_airQualitySensor_dat uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *) caps_helper_airQualitySensor.attr_airQuality.name, caps_data->airQuality_value, caps_data->airQuality_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -95,7 +104,6 @@ caps_airQualitySensor_data_t *caps_airQualitySensor_initialize(IOT_CTX *ctx, con memset(caps_data, 0, sizeof(caps_airQualitySensor_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_airQualitySensor.id , caps_airQualitySensor_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -108,5 +116,12 @@ caps_airQualitySensor_data_t *caps_airQualitySensor_initialize(IOT_CTX *ctx, con caps_data->airQuality_value = caps_helper_airQualitySensor.attr_airQuality.min; caps_data->airQuality_unit = (char *)caps_helper_airQualitySensor.attr_airQuality.units[CAPS_HELPER_AIR_QUALITY_SENSOR_UNIT_CAQI]; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_airQualitySensor.id , caps_airQualitySensor_init_cb, caps_data); + } + if (!caps_data->handle) { + printf("fail to init airQuality handle\n"); + } + return caps_data; } diff --git a/apps/esp8266/st_air_monitor/main/caps_alarm.c b/apps/esp8266/st_air_monitor/main/caps_alarm.c index b21d2a15..ebb045f7 100644 --- a/apps/esp8266/st_air_monitor/main/caps_alarm.c +++ b/apps/esp8266/st_air_monitor/main/caps_alarm.c @@ -47,6 +47,11 @@ static void caps_alarm_attr_alarm_send(caps_alarm_data_t *caps_data) uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string((char *)caps_helper_alarm.attr_alarm.name, caps_data->alarm_value, NULL); @@ -134,7 +139,6 @@ caps_alarm_data_t *caps_alarm_initialize(IOT_CTX *ctx, const char *component, vo memset(caps_data, 0, sizeof(caps_alarm_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_alarm.id , caps_alarm_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -144,26 +148,28 @@ caps_alarm_data_t *caps_alarm_initialize(IOT_CTX *ctx, const char *component, vo caps_data->alarm_value = (char *)caps_helper_alarm.attr_alarm.values[CAPS_HELPER_ALARM_VALUE_OFF]; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_both.name, caps_alarm_cmd_both_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for both\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_siren.name, caps_alarm_cmd_siren_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for siren\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_alarm.id , caps_alarm_init_cb, caps_data); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_off.name, caps_alarm_cmd_off_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for off\n"); - return NULL; + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_both.name, caps_alarm_cmd_both_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for both\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_siren.name, caps_alarm_cmd_siren_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for siren\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_off.name, caps_alarm_cmd_off_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for off\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_strobe.name, caps_alarm_cmd_strobe_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for strobe\n"); + } + } else { + printf("fail to init alarm handle\n"); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_alarm.cmd_strobe.name, caps_alarm_cmd_strobe_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for strobe\n"); - return NULL; - } - return caps_data; } diff --git a/apps/esp8266/st_air_monitor/main/caps_carbonDioxideMeasurement.c b/apps/esp8266/st_air_monitor/main/caps_carbonDioxideMeasurement.c index ab31c54d..6f70765a 100644 --- a/apps/esp8266/st_air_monitor/main/caps_carbonDioxideMeasurement.c +++ b/apps/esp8266/st_air_monitor/main/caps_carbonDioxideMeasurement.c @@ -27,7 +27,7 @@ static int caps_carbonDioxideMeasurement_get_carbonDioxide_value(caps_carbonDiox { if (!caps_data) { printf("caps_data is NULL\n"); - return NULL; + return caps_helper_carbonDioxideMeasurement.attr_carbonDioxide.min - 1; } return caps_data->carbonDioxide_value; } @@ -65,7 +65,16 @@ static void caps_carbonDioxideMeasurement_attr_carbonDioxide_send(caps_carbonDio uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *) caps_helper_carbonDioxideMeasurement.attr_carbonDioxide.name, caps_data->carbonDioxide_value, caps_data->carbonDioxide_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -95,7 +104,6 @@ caps_carbonDioxideMeasurement_data_t *caps_carbonDioxideMeasurement_initialize(I memset(caps_data, 0, sizeof(caps_carbonDioxideMeasurement_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_carbonDioxideMeasurement.id , caps_carbonDioxideMeasurement_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -108,5 +116,12 @@ caps_carbonDioxideMeasurement_data_t *caps_carbonDioxideMeasurement_initialize(I caps_data->carbonDioxide_value = caps_helper_carbonDioxideMeasurement.attr_carbonDioxide.min; caps_data->carbonDioxide_unit = (char *)caps_helper_carbonDioxideMeasurement.attr_carbonDioxide.units[CAPS_HELPER_CARBON_DIOXIDE_MEASUREMENT_UNIT_PPM]; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_carbonDioxideMeasurement.id , caps_carbonDioxideMeasurement_init_cb, caps_data); + } + if (!caps_data->handle) { + printf("fail to init carbonDioxideMeasurement handle\n"); + } + return caps_data; } diff --git a/apps/esp8266/st_air_monitor/main/caps_carbonMonoxideDetector.c b/apps/esp8266/st_air_monitor/main/caps_carbonMonoxideDetector.c index 023fc6ce..6316f720 100644 --- a/apps/esp8266/st_air_monitor/main/caps_carbonMonoxideDetector.c +++ b/apps/esp8266/st_air_monitor/main/caps_carbonMonoxideDetector.c @@ -47,6 +47,11 @@ static void caps_carbonMonoxideDetector_attr_carbonMonoxide_send(caps_carbonMono uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string((char *)caps_helper_carbonMonoxideDetector.attr_carbonMonoxide.name, caps_data->carbonMonoxide_value, NULL); @@ -78,7 +83,6 @@ caps_carbonMonoxideDetector_data_t *caps_carbonMonoxideDetector_initialize(IOT_C memset(caps_data, 0, sizeof(caps_carbonMonoxideDetector_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_carbonMonoxideDetector.id , caps_carbonMonoxideDetector_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -88,5 +92,12 @@ caps_carbonMonoxideDetector_data_t *caps_carbonMonoxideDetector_initialize(IOT_C caps_data->carbonMonoxide_value = (char *)caps_helper_carbonMonoxideDetector.attr_carbonMonoxide.values[CAPS_HELPER_CARBON_MONOXIDE_DETECTOR_VALUE_CLEAR]; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_carbonMonoxideDetector.id , caps_carbonMonoxideDetector_init_cb, caps_data); + } + if (!caps_data->handle) { + printf("fail to init switchLevel handle\n"); + } + return caps_data; } diff --git a/apps/esp8266/st_air_monitor/main/caps_formaldehydeMeasurement.c b/apps/esp8266/st_air_monitor/main/caps_formaldehydeMeasurement.c index fccfb9ec..f63ac38e 100644 --- a/apps/esp8266/st_air_monitor/main/caps_formaldehydeMeasurement.c +++ b/apps/esp8266/st_air_monitor/main/caps_formaldehydeMeasurement.c @@ -27,7 +27,7 @@ static int caps_formaldehydeMeasurement_get_formaldehydeLevel_value(caps_formald { if (!caps_data) { printf("caps_data is NULL\n"); - return NULL; + return caps_helper_formaldehydeMeasurement.attr_formaldehydeLevel.min - 1; } return caps_data->formaldehydeLevel_value; } @@ -65,7 +65,16 @@ static void caps_formaldehydeMeasurement_attr_formaldehydeLevel_send(caps_formal uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *) caps_helper_formaldehydeMeasurement.attr_formaldehydeLevel.name, caps_data->formaldehydeLevel_value, caps_data->formaldehydeLevel_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -95,7 +104,6 @@ caps_formaldehydeMeasurement_data_t *caps_formaldehydeMeasurement_initialize(IOT memset(caps_data, 0, sizeof(caps_formaldehydeMeasurement_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_formaldehydeMeasurement.id, caps_formaldehydeMeasurement_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -108,5 +116,12 @@ caps_formaldehydeMeasurement_data_t *caps_formaldehydeMeasurement_initialize(IOT caps_data->formaldehydeLevel_value = caps_helper_formaldehydeMeasurement.attr_formaldehydeLevel.min; caps_data->formaldehydeLevel_unit = (char *)caps_helper_formaldehydeMeasurement.attr_formaldehydeLevel.units[CAPS_HELPER_FORMALDEHYDE_MEASUREMENT_UNIT_PPM]; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_formaldehydeMeasurement.id, caps_formaldehydeMeasurement_init_cb, caps_data); + } + if (!caps_data->handle) { + printf("fail to init formaldehydeMeasurement handle\n"); + } + return caps_data; } diff --git a/apps/esp8266/st_air_monitor/main/smart_air_monitor.c b/apps/esp8266/st_air_monitor/main/smart_air_monitor.c index da832ab0..5aa9c1e2 100755 --- a/apps/esp8266/st_air_monitor/main/smart_air_monitor.c +++ b/apps/esp8266/st_air_monitor/main/smart_air_monitor.c @@ -164,11 +164,6 @@ int get_alarm_state(void) return alarm_state; } -void cap_alarm_init_cb(struct caps_alarm_data *caps_data) -{ - caps_data->set_alarm_value(caps_data, caps_helper_alarm.attr_alarm.values[CAPS_HELPER_ALARM_VALUE_OFF]); -} - void cap_airQualitySensor_init_cb(struct caps_airQualitySensor_data *caps_data) { caps_data->set_airQuality_value(caps_data, get_air_quality()); @@ -266,13 +261,21 @@ static void app_task(void *arg) update_air_monitor_info(); update_alarm_state(); - send_air_monitor_capabilities(); + send_air_monitor_info(); } vTaskDelay(10 / portTICK_PERIOD_MS); } } +static void device_init(void) +{ + int alarm_init_state = CAPS_HELPER_ALARM_VALUE_OFF; + cap_alarm_data->set_alarm_value(cap_alarm_data, caps_helper_alarm.attr_alarm.values[alarm_init_state]); + + change_alarm_state(alarm_init_state); +} + void app_main(void) { /** @@ -311,29 +314,30 @@ void app_main(void) iot_err = st_conn_set_noti_cb(ctx, iot_noti_cb, NULL); if (iot_err) printf("fail to set notification callback function\n"); + } else { + printf("fail to create the iot_context\n"); + } + // 2. create a handle to process capability // implement init_callback function - cap_alarm_data = caps_alarm_initialize(ctx, "main", cap_alarm_init_cb, NULL); - cap_airQualitySensor_data = caps_airQualitySensor_initialize(ctx, "main", cap_airQualitySensor_init_cb, NULL); - cap_carbonDioxideMeasurement_data = caps_carbonDioxideMeasurement_initialize(ctx, "main", cap_carbonDioxideMeasurement_init_cb, NULL); - cap_carbonMonoxideDetector_data = caps_carbonMonoxideDetector_initialize(ctx, "main", cap_carbonMonoxideDetector_init_cb, NULL); - cap_formaldehydeMeasurement_data = caps_formaldehydeMeasurement_initialize(ctx, "main", cap_formaldehydeMeasurement_init_cb, NULL); + cap_alarm_data = caps_alarm_initialize(ctx, "main", NULL, NULL); + cap_airQualitySensor_data = caps_airQualitySensor_initialize(ctx, "main", cap_airQualitySensor_init_cb, NULL); + cap_carbonDioxideMeasurement_data = caps_carbonDioxideMeasurement_initialize(ctx, "main", cap_carbonDioxideMeasurement_init_cb, NULL); + cap_carbonMonoxideDetector_data = caps_carbonMonoxideDetector_initialize(ctx, "main", cap_carbonMonoxideDetector_init_cb, NULL); + cap_formaldehydeMeasurement_data = caps_formaldehydeMeasurement_initialize(ctx, "main", cap_formaldehydeMeasurement_init_cb, NULL); // 3. register a callback function to process capability command when it comes from the SmartThings Server // implement callback function - cap_alarm_data->cmd_both_usr_cb = cap_alarm_cmd_cb; - cap_alarm_data->cmd_off_usr_cb = cap_alarm_cmd_cb; - cap_alarm_data->cmd_siren_usr_cb = cap_alarm_cmd_cb; - cap_alarm_data->cmd_strobe_usr_cb = cap_alarm_cmd_cb; + cap_alarm_data->cmd_both_usr_cb = cap_alarm_cmd_cb; + cap_alarm_data->cmd_off_usr_cb = cap_alarm_cmd_cb; + cap_alarm_data->cmd_siren_usr_cb = cap_alarm_cmd_cb; + cap_alarm_data->cmd_strobe_usr_cb = cap_alarm_cmd_cb; - } else { - printf("fail to create the iot_context\n"); - } + device_init(); // 4. needed when it is necessary to keep monitoring the device status xTaskCreate(app_task, "app_task", 2048, NULL, 10, NULL); // 5. process on-boarding procedure. There is nothing more to do on the app side than call the API. st_conn_start(ctx, (st_status_cb)&iot_status_cb, IOT_STATUS_ALL, NULL, NULL); - } diff --git a/apps/esp8266/st_lamp/main/caps_colorControl.c b/apps/esp8266/st_lamp/main/caps_colorControl.c index c5ecb13f..8b20a95c 100644 --- a/apps/esp8266/st_lamp/main/caps_colorControl.c +++ b/apps/esp8266/st_lamp/main/caps_colorControl.c @@ -17,6 +17,9 @@ ****************************************************************************/ #include +#include + +#include "JSON.h" #include "st_dev.h" #include "caps_colorControl.h" @@ -27,7 +30,7 @@ static double caps_colorControl_get_hue_value(caps_colorControl_data_t *caps_dat { if (!caps_data) { printf("caps_data is NULL\n"); - return -1; + return caps_helper_colorControl.attr_hue.min - 1; } return caps_data->hue_value; } @@ -36,7 +39,7 @@ static double caps_colorControl_get_saturation_value(caps_colorControl_data_t *c { if (!caps_data) { printf("caps_data is NULL\n"); - return -1; + return caps_helper_colorControl.attr_saturation.min - 1; } return caps_data->saturation_value; } @@ -78,8 +81,18 @@ static void caps_colorControl_attr_color_send(caps_colorControl_data_t *caps_dat uint8_t evt_num = 2; int32_t sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt[0] = st_cap_attr_create_number((char *) caps_helper_colorControl.attr_hue.name, caps_data->hue_value, NULL); cap_evt[1] = st_cap_attr_create_number((char *) caps_helper_colorControl.attr_saturation.name, caps_data->saturation_value, NULL); + if (!cap_evt[0] || !cap_evt[1]) { + printf("fail to create cap_evt\n"); + free(cap_evt[0]); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, cap_evt); if (sequence_no < 0) @@ -94,13 +107,28 @@ static void caps_colorControl_cmd_setColor_cb(IOT_CAP_HANDLE *handle, iot_cap_cmd_data_t *cmd_data, void *usr_data) { caps_colorControl_data_t *caps_data = usr_data; - double hue, saturation; + JSON_H* json_object; + JSON_H* item; + double hue = caps_helper_colorControl.attr_hue.min - 1; + double saturation = caps_helper_colorControl.attr_saturation.min - 1; printf("called [%s] func with : num_args:%u\n", __func__, cmd_data->num_args); - saturation = cmd_data->cmd_data[0].number; - hue = cmd_data->cmd_data[1].number; + json_object = JSON_PARSE(cmd_data->cmd_data[0].json_object); + if (!json_object) { + printf("fail to parse json object\n"); + return; + } + item = JSON_GET_OBJECT_ITEM(json_object, "hue"); + if (JSON_IS_NUMBER(item)) { + hue = item->valuedouble; + } + item = JSON_GET_OBJECT_ITEM(json_object, "saturation"); + if (JSON_IS_NUMBER(item)) { + saturation = item->valuedouble; + } + JSON_DELETE(json_object); caps_colorControl_set_color_value(caps_data, hue, saturation); if (caps_data && caps_data->cmd_setColor_usr_cb) @@ -163,7 +191,6 @@ caps_colorControl_data_t *caps_colorControl_initialize(IOT_CTX *ctx, const char memset(caps_data, 0, sizeof(caps_colorControl_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_colorControl.id, caps_colorControl_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -174,24 +201,27 @@ caps_colorControl_data_t *caps_colorControl_initialize(IOT_CTX *ctx, const char caps_data->set_saturation_value = caps_colorControl_set_saturation_value; caps_data->attr_color_send = caps_colorControl_attr_color_send; - caps_data->hue_value = caps_helper_colorControl.attr_hue.min; caps_data->saturation_value = caps_helper_colorControl.attr_saturation.min; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_colorControl.cmd_setColor.name, caps_colorControl_cmd_setColor_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for setColor\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_colorControl.cmd_setHue.name, caps_colorControl_cmd_setHue_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for setHue\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_colorControl.id, caps_colorControl_init_cb, caps_data); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_colorControl.cmd_setSaturation.name, caps_colorControl_cmd_setSaturation_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for setSaturation\n"); - return NULL; + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_colorControl.cmd_setColor.name, caps_colorControl_cmd_setColor_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for setColor\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_colorControl.cmd_setHue.name, caps_colorControl_cmd_setHue_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for setHue\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_colorControl.cmd_setSaturation.name, caps_colorControl_cmd_setSaturation_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for setSaturation\n"); + } + } else { + printf("fail to init colorControl handle\n"); } return caps_data; diff --git a/apps/esp8266/st_lamp/main/caps_switch.c b/apps/esp8266/st_lamp/main/caps_switch.c index f419e1fa..c9018d27 100644 --- a/apps/esp8266/st_lamp/main/caps_switch.c +++ b/apps/esp8266/st_lamp/main/caps_switch.c @@ -47,8 +47,17 @@ static void caps_switch_attr_switch_send(caps_switch_data_t *caps_data) uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string((char *)caps_helper_switch.attr_switch.name, caps_data->switch_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -109,7 +118,6 @@ caps_switch_data_t *caps_switch_initialize(IOT_CTX *ctx, const char *component, memset(caps_data, 0, sizeof(caps_switch_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_switch.id , caps_switch_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -119,15 +127,20 @@ caps_switch_data_t *caps_switch_initialize(IOT_CTX *ctx, const char *component, caps_data->switch_value = (char *)caps_helper_switch.attr_switch.values[CAPS_HELPER_SWITCH_VALUE_ON]; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_off.name, caps_switch_cmd_off_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for off\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_switch.id , caps_switch_init_cb, caps_data); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_on.name, caps_switch_cmd_on_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for on\n"); - return NULL; + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_off.name, caps_switch_cmd_off_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for off\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_on.name, caps_switch_cmd_on_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for on\n"); + } + } else { + printf("fail to init switch handle\n"); } return caps_data; diff --git a/apps/esp8266/st_lamp/main/caps_switchLevel.c b/apps/esp8266/st_lamp/main/caps_switchLevel.c index 4fdd200a..bbcd4907 100644 --- a/apps/esp8266/st_lamp/main/caps_switchLevel.c +++ b/apps/esp8266/st_lamp/main/caps_switchLevel.c @@ -27,7 +27,7 @@ static int caps_switchLevel_get_level_value(caps_switchLevel_data_t *caps_data) { if (!caps_data) { printf("caps_data is NULL\n"); - return -1; + return caps_helper_switchLevel.attr_level.min - 1; } return caps_data->level_value; } @@ -56,7 +56,6 @@ static void caps_switchLevel_set_level_unit(caps_switchLevel_data_t *caps_data, printf("caps_data is NULL\n"); return; } - caps_data->level_unit = (char *)unit; } @@ -66,7 +65,16 @@ static void caps_switchLevel_attr_level_send(caps_switchLevel_data_t *caps_data) uint8_t evt_num = 1; int32_t sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *)caps_helper_switchLevel.attr_level.name, caps_data->level_value, caps_data->level_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -99,7 +107,6 @@ static void caps_switchLevel_init_cb(IOT_CAP_HANDLE *handle, void *usr_data) if (caps_data && caps_data->init_usr_cb) caps_data->init_usr_cb(caps_data); caps_switchLevel_attr_level_send(caps_data); - } caps_switchLevel_data_t *caps_switchLevel_initialize(IOT_CTX *ctx, const char *component, void *init_usr_cb, void *usr_data) @@ -115,7 +122,6 @@ caps_switchLevel_data_t *caps_switchLevel_initialize(IOT_CTX *ctx, const char *c memset(caps_data, 0, sizeof(caps_switchLevel_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_switchLevel.id, caps_switchLevel_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -128,10 +134,16 @@ caps_switchLevel_data_t *caps_switchLevel_initialize(IOT_CTX *ctx, const char *c caps_data->level_value = caps_helper_switchLevel.attr_level.min; caps_data->level_unit = (char *)caps_helper_switchLevel.attr_level.units[CAPS_HELPER_SWITCH_LEVEL_UNIT_PERCENT]; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switchLevel.cmd_setLevel.name, caps_switchLevel_cmd_set_level_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for setLevel\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_switchLevel.id, caps_switchLevel_init_cb, caps_data); + } + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switchLevel.cmd_setLevel.name, caps_switchLevel_cmd_set_level_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for setLevel\n"); + } + } else { + printf("fail to init switchLevel handle\n"); } return caps_data; diff --git a/apps/esp8266/st_lamp/main/smart_lamp.c b/apps/esp8266/st_lamp/main/smart_lamp.c index a4789438..ec622919 100755 --- a/apps/esp8266/st_lamp/main/smart_lamp.c +++ b/apps/esp8266/st_lamp/main/smart_lamp.c @@ -121,34 +121,14 @@ static void update_color_info(void) update_rgb_from_hsl(hue, saturation, hsl_color_lightness, &rgb_color_red, &rgb_color_green, &rgb_color_blue); - printf("HSL (%lf, %lf, %d), RGB (%d, %d, %d)\n", - hue, saturation, hsl_color_lightness, + printf("HSL (%d, %d, %d), RGB (%d, %d, %d)\n", + (int)hue, (int)saturation, hsl_color_lightness, rgb_color_red, rgb_color_green, rgb_color_blue); switch_state = get_switch_state(); color_led_onoff(switch_state); } -void cap_switch_init_cb(struct caps_switch_data *caps_data) -{ - int switch_init_state = CAPS_HELPER_SWITCH_VALUE_OFF; - caps_data->set_switch_value(caps_data, caps_helper_switch.attr_switch.values[switch_init_state]); -} - -void cap_colorControl_init_cb(struct caps_colorControl_data *caps_data) -{ - int hue_init_value = 0; - int saturation_init_value = 100; - caps_data->set_color_value(caps_data, hue_init_value, saturation_init_value); -} - -void cap_switchLevel_init_cb(struct caps_switchLevel_data *caps_data) -{ - int switch_init_level = 50; - caps_data->set_level_value(caps_data, switch_init_level); - caps_data->set_level_unit(caps_data, caps_helper_switchLevel.attr_level.units[CAPS_HELPER_SWITCH_LEVEL_UNIT_PERCENT]); -} - void cap_switch_cmd_cb(struct caps_switch_data *caps_data) { int switch_state = get_switch_state(); @@ -265,6 +245,22 @@ void* pin_num_memcpy(void *dest, const void *src, unsigned int count) } #endif +void device_init() +{ + int switch_init_state = CAPS_HELPER_SWITCH_VALUE_ON; + int switch_init_level = 50; + int hue_init_value = 0; + int saturation_init_value = 100; + + cap_switch_data->set_switch_value(cap_switch_data, caps_helper_switch.attr_switch.values[switch_init_state]); + cap_switchLevel_data->set_level_value(cap_switchLevel_data, switch_init_level); + cap_switchLevel_data->set_level_unit(cap_switchLevel_data, caps_helper_switchLevel.attr_level.units[CAPS_HELPER_SWITCH_LEVEL_UNIT_PERCENT]); + cap_colorControl_data->set_color_value(cap_colorControl_data, hue_init_value, saturation_init_value); + + noti_led_onoff(switch_init_state); + update_color_info(); +} + void app_main(void) { /** @@ -303,26 +299,27 @@ void app_main(void) iot_err = st_conn_set_noti_cb(ctx, iot_noti_cb, NULL); if (iot_err) printf("fail to set notification callback function\n"); + } else { + printf("fail to create the iot_context\n"); + } // 2. create a handle to process capability // implement init_callback function - cap_switch_data = caps_switch_initialize(ctx, "main", cap_switch_init_cb, NULL); - cap_switchLevel_data = caps_switchLevel_initialize(ctx, "main", cap_switchLevel_init_cb, NULL); - cap_colorControl_data = caps_colorControl_initialize(ctx, "main", cap_colorControl_init_cb, NULL); + cap_switch_data = caps_switch_initialize(ctx, "main", NULL, NULL); + cap_switchLevel_data = caps_switchLevel_initialize(ctx, "main", NULL, NULL); + cap_colorControl_data = caps_colorControl_initialize(ctx, "main", NULL, NULL); // 3. register a callback function to process capability command when it comes from the SmartThings Server // implement callback function - cap_switch_data->cmd_on_usr_cb = cap_switch_cmd_cb; - cap_switch_data->cmd_off_usr_cb = cap_switch_cmd_cb; - cap_switchLevel_data->cmd_set_level_usr_cb = cap_switchLevel_cmd_cb; - cap_colorControl_data->cmd_setColor_usr_cb = cap_colorControl_cmd_cb; - } else { - printf("fail to create the iot_context\n"); - } + cap_switch_data->cmd_on_usr_cb = cap_switch_cmd_cb; + cap_switch_data->cmd_off_usr_cb = cap_switch_cmd_cb; + cap_switchLevel_data->cmd_set_level_usr_cb = cap_switchLevel_cmd_cb; + cap_colorControl_data->cmd_setColor_usr_cb = cap_colorControl_cmd_cb; + cap_colorControl_data->cmd_setHue_usr_cb = cap_colorControl_cmd_cb; + cap_colorControl_data->cmd_setSaturation_usr_cb = cap_colorControl_cmd_cb; gpio_init(); - - update_color_info(); + device_init(); // 4. needed when it is necessary to keep monitoring the device status xTaskCreate(smartlamp_task, "smartlamp_task", 2048, NULL, 10, NULL); diff --git a/apps/esp8266/st_switch/main/caps_switch.c b/apps/esp8266/st_switch/main/caps_switch.c index f419e1fa..c9018d27 100644 --- a/apps/esp8266/st_switch/main/caps_switch.c +++ b/apps/esp8266/st_switch/main/caps_switch.c @@ -47,8 +47,17 @@ static void caps_switch_attr_switch_send(caps_switch_data_t *caps_data) uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string((char *)caps_helper_switch.attr_switch.name, caps_data->switch_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -109,7 +118,6 @@ caps_switch_data_t *caps_switch_initialize(IOT_CTX *ctx, const char *component, memset(caps_data, 0, sizeof(caps_switch_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_switch.id , caps_switch_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -119,15 +127,20 @@ caps_switch_data_t *caps_switch_initialize(IOT_CTX *ctx, const char *component, caps_data->switch_value = (char *)caps_helper_switch.attr_switch.values[CAPS_HELPER_SWITCH_VALUE_ON]; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_off.name, caps_switch_cmd_off_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for off\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_switch.id , caps_switch_init_cb, caps_data); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_on.name, caps_switch_cmd_on_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for on\n"); - return NULL; + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_off.name, caps_switch_cmd_off_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for off\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_switch.cmd_on.name, caps_switch_cmd_on_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for on\n"); + } + } else { + printf("fail to init switch handle\n"); } return caps_data; diff --git a/apps/esp8266/st_switch/main/smart_switch.c b/apps/esp8266/st_switch/main/smart_switch.c index b77ea803..fff45a30 100755 --- a/apps/esp8266/st_switch/main/smart_switch.c +++ b/apps/esp8266/st_switch/main/smart_switch.c @@ -227,18 +227,18 @@ void app_main(void) iot_err = st_conn_set_noti_cb(ctx, iot_noti_cb, NULL); if (iot_err) printf("fail to set notification callback function\n"); + } else { + printf("fail to create the iot_context\n"); + } // 2. create a handle to process capability // implement init_callback function (cap_switch_init_cb) - cap_switch_data = caps_switch_initialize(ctx, "main", cap_switch_init_cb, NULL); + cap_switch_data = caps_switch_initialize(ctx, "main", cap_switch_init_cb, NULL); // 3. register a callback function to process capability command when it comes from the SmartThings Server // implement callback function (cap_switch_cmd_off_cb) - cap_switch_data->cmd_on_usr_cb = cap_switch_cmd_cb; - cap_switch_data->cmd_off_usr_cb = cap_switch_cmd_cb; - } else { - printf("fail to create the iot_context\n"); - } + cap_switch_data->cmd_on_usr_cb = cap_switch_cmd_cb; + cap_switch_data->cmd_off_usr_cb = cap_switch_cmd_cb; gpio_init(); diff --git a/apps/esp8266/st_thermostat/main/caps_temperatureMeasurement.c b/apps/esp8266/st_thermostat/main/caps_temperatureMeasurement.c index fe6597c9..ced204f3 100644 --- a/apps/esp8266/st_thermostat/main/caps_temperatureMeasurement.c +++ b/apps/esp8266/st_thermostat/main/caps_temperatureMeasurement.c @@ -27,7 +27,7 @@ static int caps_temperatureMeasurement_get_temperature_value(caps_temperatureMea { if (!caps_data) { printf("caps_data is NULL\n"); - return NULL; + return caps_helper_temperatureMeasurement.attr_temperature.min - 1; } return caps_data->temperature_value; } @@ -65,7 +65,16 @@ static void caps_temperatureMeasurement_attr_temperature_send(caps_temperatureMe uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *) caps_helper_temperatureMeasurement.attr_temperature.name, caps_data->temperature_value, caps_data->temperature_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -95,7 +104,6 @@ caps_temperatureMeasurement_data_t *caps_temperatureMeasurement_initialize(IOT_C memset(caps_data, 0, sizeof(caps_temperatureMeasurement_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_temperatureMeasurement.id , caps_temperatureMeasurement_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -108,5 +116,12 @@ caps_temperatureMeasurement_data_t *caps_temperatureMeasurement_initialize(IOT_C caps_data->temperature_value = caps_helper_temperatureMeasurement.attr_temperature.min; caps_data->temperature_unit = (char *)caps_helper_temperatureMeasurement.attr_temperature.units[CAPS_HELPER_TEMPERATURE_MEASUREMENT_UNIT_C]; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_temperatureMeasurement.id , caps_temperatureMeasurement_init_cb, caps_data); + } + if (!caps_data->handle) { + printf("fail to init temperatureMeasurement handle\n"); + } + return caps_data; } diff --git a/apps/esp8266/st_thermostat/main/caps_thermostatCoolingSetpoint.c b/apps/esp8266/st_thermostat/main/caps_thermostatCoolingSetpoint.c index 92d5fb79..0db6d272 100644 --- a/apps/esp8266/st_thermostat/main/caps_thermostatCoolingSetpoint.c +++ b/apps/esp8266/st_thermostat/main/caps_thermostatCoolingSetpoint.c @@ -27,7 +27,7 @@ static int caps_thermostatCoolingSetpoint_get_coolingSetpoint_value(caps_thermos { if (!caps_data) { printf("caps_data is NULL\n"); - return NULL; + return caps_helper_thermostatCoolingSetpoint.attr_coolingSetpoint.min - 1; } return caps_data->coolingSetpoint_value; } @@ -65,7 +65,16 @@ static void caps_thermostatCoolingSetpoint_attr_coolingSetpoint_send(caps_thermo uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *) caps_helper_thermostatCoolingSetpoint.attr_coolingSetpoint.name, caps_data->coolingSetpoint_value, caps_data->coolingSetpoint_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -113,7 +122,6 @@ caps_thermostatCoolingSetpoint_data_t *caps_thermostatCoolingSetpoint_initialize memset(caps_data, 0, sizeof(caps_thermostatCoolingSetpoint_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatCoolingSetpoint.id , caps_thermostatCoolingSetpoint_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -126,10 +134,16 @@ caps_thermostatCoolingSetpoint_data_t *caps_thermostatCoolingSetpoint_initialize caps_data->coolingSetpoint_value = caps_helper_thermostatCoolingSetpoint.attr_coolingSetpoint.min; caps_data->coolingSetpoint_unit = (char *)caps_helper_thermostatCoolingSetpoint.attr_coolingSetpoint.units[CAPS_HELPER_THERMOSTAT_COOLING_SETPOINT_UNIT_C]; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatCoolingSetpoint.cmd_setCoolingSetpoint.name, caps_thermostatCoolingSetpoint_cmd_setCoolingSetpoint_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for set_coolingSetpoint\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatCoolingSetpoint.id , caps_thermostatCoolingSetpoint_init_cb, caps_data); + } + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatCoolingSetpoint.cmd_setCoolingSetpoint.name, caps_thermostatCoolingSetpoint_cmd_setCoolingSetpoint_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for set_coolingSetpoint\n"); + } + } else { + printf("fail to init thermostatCoolingSetpoint handle"); } return caps_data; diff --git a/apps/esp8266/st_thermostat/main/caps_thermostatFanMode.c b/apps/esp8266/st_thermostat/main/caps_thermostatFanMode.c index 2f262d49..4be39511 100644 --- a/apps/esp8266/st_thermostat/main/caps_thermostatFanMode.c +++ b/apps/esp8266/st_thermostat/main/caps_thermostatFanMode.c @@ -48,8 +48,18 @@ static void caps_thermostatFanMode_attr_thermostatFanMode_send(caps_thermostatFa uint8_t evt_num = 1; int sequence_no; + + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string((char *)caps_helper_thermostatFanMode.attr_thermostatFanMode.name, caps_data->thermostatFanMode_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -84,8 +94,17 @@ static void caps_thermostatFanMode_attr_supportedThermostatFanModes_send(caps_th uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string_array((char *)caps_helper_thermostatFanMode.attr_supportedThermostatFanModes.name, caps_data->supportedThermostatFanModes_array_size, caps_data->supportedThermostatFanModes_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -196,7 +215,7 @@ caps_thermostatFanMode_data_t *caps_thermostatFanMode_initialize(IOT_CTX *ctx, c memset(caps_data, 0, sizeof(caps_thermostatFanMode_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatFanMode.id , caps_thermostatFanMode_init_cb, caps_data); + caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -212,26 +231,32 @@ caps_thermostatFanMode_data_t *caps_thermostatFanMode_initialize(IOT_CTX *ctx, c caps_data->supportedThermostatFanModes_value = (char **)caps_helper_thermostatFanMode.attr_supportedThermostatFanModes.values; caps_data->supportedThermostatFanModes_array_size = sizeof(caps_helper_thermostatFanMode.attr_supportedThermostatFanModes.values)/sizeof(char *); - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_fanAuto.name, caps_thermostatFanMode_cmd_fanAuto_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for fanAuto\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_fanCirculate.name, caps_thermostatFanMode_cmd_fanCirculate_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for fanCirculate\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatFanMode.id , caps_thermostatFanMode_init_cb, caps_data); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_fanOn.name, caps_thermostatFanMode_cmd_fanOn_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for fanOn\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_setThermostatFanMode.name, caps_thermostatFanMode_cmd_setThermostatFanMode_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for setThermostatFanMode\n"); - return NULL; + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_fanAuto.name, caps_thermostatFanMode_cmd_fanAuto_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for fanAuto\n"); + return NULL; + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_fanCirculate.name, caps_thermostatFanMode_cmd_fanCirculate_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for fanCirculate\n"); + return NULL; + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_fanOn.name, caps_thermostatFanMode_cmd_fanOn_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for fanOn\n"); + return NULL; + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatFanMode.cmd_setThermostatFanMode.name, caps_thermostatFanMode_cmd_setThermostatFanMode_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for setThermostatFanMode\n"); + return NULL; + } + } else { + printf("fail to init thermostatFanMode handle\n"); } - return caps_data; } diff --git a/apps/esp8266/st_thermostat/main/caps_thermostatHeatingSetpoint.c b/apps/esp8266/st_thermostat/main/caps_thermostatHeatingSetpoint.c index 2759b5a7..6e7ba308 100644 --- a/apps/esp8266/st_thermostat/main/caps_thermostatHeatingSetpoint.c +++ b/apps/esp8266/st_thermostat/main/caps_thermostatHeatingSetpoint.c @@ -27,7 +27,7 @@ static int caps_thermostatHeatingSetpoint_get_heatingSetpoint_value(caps_thermos { if (!caps_data) { printf("caps_data is NULL\n"); - return NULL; + return caps_helper_thermostatHeatingSetpoint.attr_heatingSetpoint.min - 1; } return caps_data->heatingSetpoint_value; } @@ -65,7 +65,16 @@ static void caps_thermostatHeatingSetpoint_attr_heatingSetpoint_send(caps_thermo uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_int((char *) caps_helper_thermostatHeatingSetpoint.attr_heatingSetpoint.name, caps_data->heatingSetpoint_value, caps_data->heatingSetpoint_unit); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -113,7 +122,6 @@ caps_thermostatHeatingSetpoint_data_t *caps_thermostatHeatingSetpoint_initialize memset(caps_data, 0, sizeof(caps_thermostatHeatingSetpoint_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatHeatingSetpoint.id , caps_thermostatHeatingSetpoint_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -126,10 +134,16 @@ caps_thermostatHeatingSetpoint_data_t *caps_thermostatHeatingSetpoint_initialize caps_data->heatingSetpoint_value = caps_helper_thermostatHeatingSetpoint.attr_heatingSetpoint.min; caps_data->heatingSetpoint_unit = (char *)caps_helper_thermostatHeatingSetpoint.attr_heatingSetpoint.units[CAPS_HELPER_THERMOSTAT_HEATING_SETPOINT_UNIT_C]; - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatHeatingSetpoint.cmd_setHeatingSetpoint.name, caps_thermostatHeatingSetpoint_cmd_set_heatingSetpoint_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for set_heatingSetpoint\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatHeatingSetpoint.id , caps_thermostatHeatingSetpoint_init_cb, caps_data); + } + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatHeatingSetpoint.cmd_setHeatingSetpoint.name, caps_thermostatHeatingSetpoint_cmd_set_heatingSetpoint_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for set_heatingSetpoint\n"); + } + } else { + printf("fail to init thermostatHeatingSetpoint handle\n"); } return caps_data; diff --git a/apps/esp8266/st_thermostat/main/caps_thermostatMode.c b/apps/esp8266/st_thermostat/main/caps_thermostatMode.c index d0898120..34194ace 100644 --- a/apps/esp8266/st_thermostat/main/caps_thermostatMode.c +++ b/apps/esp8266/st_thermostat/main/caps_thermostatMode.c @@ -47,8 +47,17 @@ static void caps_thermostatMode_attr_thermostatMode_send(caps_thermostatMode_dat uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string(caps_helper_thermostatMode.attr_thermostatMode.name, caps_data->thermostatMode_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -83,8 +92,17 @@ static void caps_thermostatMode_attr_supportedThermostatModes_send(caps_thermost uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string_array((char *)caps_helper_thermostatMode.attr_supportedThermostatModes.name, caps_data->supportedThermostatModes_array_size, caps_data->supportedThermostatModes_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -225,7 +243,6 @@ caps_thermostatMode_data_t *caps_thermostatMode_initialize(IOT_CTX *ctx, const c memset(caps_data, 0, sizeof(caps_thermostatMode_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatMode.id , caps_thermostatMode_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -241,35 +258,36 @@ caps_thermostatMode_data_t *caps_thermostatMode_initialize(IOT_CTX *ctx, const c caps_data->supportedThermostatModes_value = (char **)caps_helper_thermostatMode.attr_supportedThermostatModes.values; caps_data->supportedThermostatModes_array_size = sizeof(caps_helper_thermostatMode.attr_supportedThermostatModes.values)/sizeof(char *); - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_auto.name, caps_thermostatMode_cmd_auto_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for auto\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_cool.name, caps_thermostatMode_cmd_cool_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for cool\n"); - return NULL; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatMode.id , caps_thermostatMode_init_cb, caps_data); } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_emergencyHeat.name, caps_thermostatMode_cmd_emergencyHeat_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for emergencyHeat\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_heat.name, caps_thermostatMode_cmd_heat_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for heat\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_off.name, caps_thermostatMode_cmd_off_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for off\n"); - return NULL; - } - err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_setThermostatMode.name, caps_thermostatMode_cmd_setThermostatMode_cb, caps_data); - if (err) { - printf("fail to set cmd_cb for setThermostatMode\n"); - return NULL; + if (caps_data->handle) { + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_auto.name, caps_thermostatMode_cmd_auto_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for auto\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_cool.name, caps_thermostatMode_cmd_cool_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for cool\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_emergencyHeat.name, caps_thermostatMode_cmd_emergencyHeat_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for emergencyHeat\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_heat.name, caps_thermostatMode_cmd_heat_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for heat\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_off.name, caps_thermostatMode_cmd_off_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for off\n"); + } + err = st_cap_cmd_set_cb(caps_data->handle, caps_helper_thermostatMode.cmd_setThermostatMode.name, caps_thermostatMode_cmd_setThermostatMode_cb, caps_data); + if (err) { + printf("fail to set cmd_cb for setThermostatMode\n"); + } + } else { + printf("fail to init thermostatMode handle\n"); } return caps_data; diff --git a/apps/esp8266/st_thermostat/main/caps_thermostatOperatingState.c b/apps/esp8266/st_thermostat/main/caps_thermostatOperatingState.c index 3d30c09a..5315f591 100644 --- a/apps/esp8266/st_thermostat/main/caps_thermostatOperatingState.c +++ b/apps/esp8266/st_thermostat/main/caps_thermostatOperatingState.c @@ -47,8 +47,17 @@ static void caps_thermostatOperatingState_attr_thermostatOperatingState_send(cap uint8_t evt_num = 1; int sequence_no; + if (!caps_data || !caps_data->handle) { + printf("fail to get handle\n"); + return; + } + cap_evt = st_cap_attr_create_string((char *)caps_helper_thermostatOperatingState.attr_thermostatOperatingState.name, caps_data->thermostatOperatingState_value, NULL); + if (!cap_evt) { + printf("fail to create cap_evt\n"); + return; + } sequence_no = st_cap_attr_send(caps_data->handle, evt_num, &cap_evt); if (sequence_no < 0) @@ -78,7 +87,6 @@ caps_thermostatOperatingState_data_t *caps_thermostatOperatingState_initialize(I memset(caps_data, 0, sizeof(caps_thermostatOperatingState_data_t)); - caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatOperatingState.id , caps_thermostatOperatingState_init_cb, caps_data); caps_data->init_usr_cb = init_usr_cb; caps_data->usr_data = usr_data; @@ -88,5 +96,12 @@ caps_thermostatOperatingState_data_t *caps_thermostatOperatingState_initialize(I caps_data->thermostatOperatingState_value = (char *)caps_helper_thermostatOperatingState.attr_thermostatOperatingState.values[CAPS_HELPER_THERMOSTAT_OPERATING_STATE_VALUE_IDLE]; + if (ctx) { + caps_data->handle = st_cap_handle_init(ctx, component, caps_helper_thermostatOperatingState.id , caps_thermostatOperatingState_init_cb, caps_data); + } + if (!caps_data->handle) { + printf("fail to init thermostatOperatingState handle\n"); + } + return caps_data; } diff --git a/apps/esp8266/st_thermostat/main/main.c b/apps/esp8266/st_thermostat/main/main.c index 3da7458c..70c21e2c 100644 --- a/apps/esp8266/st_thermostat/main/main.c +++ b/apps/esp8266/st_thermostat/main/main.c @@ -80,7 +80,7 @@ static int thermostat_mode_str2idx(const char *mode) return i; } - printf("%s: '%s' is not supported mode\n", __func__, mode); + printf("%s: '%s' is not supported mode\n\n", __func__, mode); return -1; } @@ -91,7 +91,7 @@ static void thermostat_set_mode(int mode) * YOUR CODE: * implement a ability to control the mode of thermostat */ - printf("%s: changed mode = %s", __func__, + printf("%s: changed mode = %s\n", __func__, caps_helper_thermostatMode.attr_thermostatMode.values[mode]); } @@ -101,7 +101,7 @@ static void thermostat_set_fan_mode(int mode) * YOUR CODE: * implement a ability to control the fan mode of thermostat */ - printf("%s: changed fan mode = %s", __func__, + printf("%s: changed fan mode = %s\n", __func__, caps_helper_thermostatFanMode.attr_thermostatFanMode.values[mode]); } @@ -111,7 +111,7 @@ static void thermostat_set_cooling_point(double point) * YOUR CODE: * implement a ability to set cooling point */ - printf("%s: changed cooling point = %lf", __func__, point); + printf("%s: changed cooling point = %d\n", __func__, (int)point); } static void thermostat_set_heating_point(double point) @@ -120,7 +120,7 @@ static void thermostat_set_heating_point(double point) * YOUR CODE: * implement a ability to set heating point */ - printf("%s: changed heating point = %lf", __func__, point); + printf("%s: changed heating point = %d\n", __func__, (int)point); } static double thermostat_get_temperature(void) @@ -132,9 +132,18 @@ static double thermostat_get_temperature(void) return 18.5; } +static int thermostat_get_operating_state(void) +{ + /* + * YOUR CODE: + * implement a ability to obtain operating state + */ + return CAPS_HELPER_THERMOSTAT_OPERATING_STATE_VALUE_IDLE; +} + static void cap_temperatureMeasurement_init_cb(struct caps_temperatureMeasurement_data *caps_data) { - const int initial_temperature_value = thermostat_get_temperature(); + int initial_temperature_value = thermostat_get_temperature(); const char *temperature_unit = caps_helper_temperatureMeasurement.attr_temperature.units[CAPS_HELPER_TEMPERATURE_MEASUREMENT_UNIT_C]; @@ -142,50 +151,10 @@ static void cap_temperatureMeasurement_init_cb(struct caps_temperatureMeasuremen caps_data->set_temperature_unit(caps_data, temperature_unit); } -static void cap_thermostatCoolingSetpoint_init_cb(struct caps_thermostatCoolingSetpoint_data *caps_data) -{ - const int initial_cooling_point_value = 30.5; - const char *cooling_point_unit = - caps_helper_thermostatCoolingSetpoint.attr_coolingSetpoint.units[CAPS_HELPER_THERMOSTAT_COOLING_SETPOINT_UNIT_C]; - - caps_data->set_coolingSetpoint_value(caps_data, initial_cooling_point_value); - caps_data->set_coolingSetpoint_unit(caps_data, cooling_point_unit); -} - -static void cap_thermostatHeatingSetpoint_init_cb(struct caps_thermostatHeatingSetpoint_data *caps_data) -{ - const int initial_heating_point_value = 13.5; - const char *heating_point_unit = - caps_helper_thermostatHeatingSetpoint.attr_heatingSetpoint.units[CAPS_HELPER_THERMOSTAT_HEATING_SETPOINT_UNIT_C]; - - caps_data->set_heatingSetpoint_value(caps_data, initial_heating_point_value); - caps_data->set_heatingSetpoint_unit(caps_data, heating_point_unit); -} - -static void cap_thermostatFanMode_init_cb(struct caps_thermostatFanMode_data *caps_data) -{ - const char *initial_fan_mode = - caps_helper_thermostatFanMode.attr_thermostatFanMode.values[CAPS_HELPER_THERMOSTAT_FAN_MODE_VALUE_AUTO]; - - caps_data->set_thermostatFanMode_value(caps_data, initial_fan_mode); - caps_data->set_supportedThermostatFanModes_value(caps_data, supported_fan_mode, sizeof(supported_fan_mode)/sizeof(char *)); -} - -static void cap_thermostatMode_init_cb(struct caps_thermostatMode_data *caps_data) -{ - const char* initial_mode = - caps_helper_thermostatMode.attr_thermostatMode.values[CAPS_HELPER_THERMOSTAT_MODE_VALUE_AUTO]; - - caps_data->set_thermostatMode_value(caps_data, initial_mode); - caps_data->set_supportedThermostatModes_value(caps_data, supported_mode, sizeof(supported_mode)/sizeof(char *)); - -} - static void cap_thermostatOperatingState_init_cb(struct caps_thermostatOperatingState_data *caps_data) { - const char* initial_op_state = - caps_helper_thermostatOperatingState.attr_thermostatOperatingState.values[CAPS_HELPER_THERMOSTAT_OPERATING_STATE_VALUE_IDLE]; - caps_data->set_thermostatOperatingState_value(caps_data, initial_op_state); + int initial_op_state = thermostat_get_operating_state(); + caps_data->set_thermostatOperatingState_value(caps_data, caps_helper_thermostatOperatingState.attr_thermostatOperatingState.values[initial_op_state]); } static void cap_thermostatCoolingSetpoint_cmd_cb(struct caps_thermostatCoolingSetpoint_data *caps_data) @@ -257,6 +226,36 @@ static void thermostat_task(void *arg) } } +static void device_init() +{ + const int initial_cooling_point_value = 30.5; + const int initial_heating_point_value = 13.5; + + const char *cooling_point_unit = + caps_helper_thermostatCoolingSetpoint.attr_coolingSetpoint.units[CAPS_HELPER_THERMOSTAT_COOLING_SETPOINT_UNIT_C]; + const char *heating_point_unit = + caps_helper_thermostatHeatingSetpoint.attr_heatingSetpoint.units[CAPS_HELPER_THERMOSTAT_HEATING_SETPOINT_UNIT_C]; + + const int initial_fan_mode = CAPS_HELPER_THERMOSTAT_FAN_MODE_VALUE_AUTO; + const int initial_mode = CAPS_HELPER_THERMOSTAT_MODE_VALUE_AUTO; + + cap_coolingsetpoint_handle->set_coolingSetpoint_value(cap_coolingsetpoint_handle, initial_cooling_point_value); + cap_coolingsetpoint_handle->set_coolingSetpoint_unit(cap_coolingsetpoint_handle, cooling_point_unit); + thermostat_set_cooling_point(initial_cooling_point_value); + + cap_heatingsetpoint_handle->set_heatingSetpoint_value(cap_heatingsetpoint_handle, initial_heating_point_value); + cap_heatingsetpoint_handle->set_heatingSetpoint_unit(cap_heatingsetpoint_handle, heating_point_unit); + thermostat_set_heating_point(initial_heating_point_value); + + cap_fanmode_handle->set_thermostatFanMode_value(cap_fanmode_handle, caps_helper_thermostatFanMode.attr_thermostatFanMode.values[initial_fan_mode]); + cap_fanmode_handle->set_supportedThermostatFanModes_value(cap_fanmode_handle, supported_fan_mode, sizeof(supported_fan_mode)/sizeof(char *)); + thermostat_set_fan_mode(initial_fan_mode); + + cap_mode_handle->set_thermostatMode_value(cap_mode_handle, caps_helper_thermostatMode.attr_thermostatMode.values[initial_mode]); + cap_mode_handle->set_supportedThermostatModes_value(cap_mode_handle, supported_mode, sizeof(supported_mode)/sizeof(char *)); + thermostat_set_mode(initial_mode); +} + void app_main(void) { /** @@ -296,24 +295,27 @@ void app_main(void) if (iot_err) printf("fail to set notification callback function\n"); + } else { + printf("fail to create the iot_context\n"); + } + // 2. create a handle to process capability // implement init_callback function - cap_temperature_handle = caps_temperatureMeasurement_initialize(ctx, "main", cap_temperatureMeasurement_init_cb, NULL); - cap_coolingsetpoint_handle = caps_thermostatCoolingSetpoint_initialize(ctx, "main", cap_thermostatCoolingSetpoint_init_cb, NULL); - cap_heatingsetpoint_handle = caps_thermostatHeatingSetpoint_initialize(ctx, "main", cap_thermostatHeatingSetpoint_init_cb, NULL); - cap_fanmode_handle = caps_thermostatFanMode_initialize(ctx, "main", cap_thermostatFanMode_init_cb, NULL); - cap_mode_handle = caps_thermostatMode_initialize(ctx, "main", cap_thermostatMode_init_cb, NULL); - cap_opstate_handle = caps_thermostatOperatingState_initialize(ctx, "main", cap_thermostatOperatingState_init_cb, NULL); + cap_temperature_handle = caps_temperatureMeasurement_initialize(ctx, "main", cap_temperatureMeasurement_init_cb, NULL); + cap_coolingsetpoint_handle = caps_thermostatCoolingSetpoint_initialize(ctx, "main", NULL, NULL); + cap_heatingsetpoint_handle = caps_thermostatHeatingSetpoint_initialize(ctx, "main", NULL, NULL); + cap_fanmode_handle = caps_thermostatFanMode_initialize(ctx, "main", NULL, NULL); + cap_mode_handle = caps_thermostatMode_initialize(ctx, "main", NULL, NULL); + cap_opstate_handle = caps_thermostatOperatingState_initialize(ctx, "main", cap_thermostatOperatingState_init_cb, NULL); // 3. register a callback function to process capability command when it comes from the SmartThings Server // implement callback function - cap_coolingsetpoint_handle->cmd_setCoolingSetpoint_usr_cb = cap_thermostatCoolingSetpoint_cmd_cb; - cap_heatingsetpoint_handle->cmd_setHeatingSetpoint_usr_cb = cap_thermostatHeatingSetpoint_cmd_cb; - cap_fanmode_handle->cmd_setThermostatFanMode_usr_cb = cap_thermostatFanMode_cmd_cb; - cap_mode_handle->cmd_setThermostatMode_usr_cb = cap_thermostatMode_cmd_cb; - } else { - printf("fail to create the iot_context\n"); - } + cap_coolingsetpoint_handle->cmd_setCoolingSetpoint_usr_cb = cap_thermostatCoolingSetpoint_cmd_cb; + cap_heatingsetpoint_handle->cmd_setHeatingSetpoint_usr_cb = cap_thermostatHeatingSetpoint_cmd_cb; + cap_fanmode_handle->cmd_setThermostatFanMode_usr_cb = cap_thermostatFanMode_cmd_cb; + cap_mode_handle->cmd_setThermostatMode_usr_cb = cap_thermostatMode_cmd_cb; + + device_init(); // 4. needed when it is necessary to keep monitoring the device status xTaskCreate(thermostat_task, "thermostat_task", 2048, NULL, 10, NULL);