From 2f50ae8864aa2ba9e5807432eb878552389a9cb2 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 4 Jan 2015 21:02:45 +0100 Subject: o Reworking the code after implementing much more on the Android app. --- app.cpp | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 192 insertions(+), 42 deletions(-) (limited to 'app.cpp') diff --git a/app.cpp b/app.cpp index 909a097..b72b07d 100644 --- a/app.cpp +++ b/app.cpp @@ -11,10 +11,13 @@ // See http://redbearlab.com/blendmicro/ struct sm_sensor { - uint8_t pin; - uint8_t value; -} gauges[SENSOR_COUNT] = { - { 9, 0}, + uint8_t pin; + uint8_t value; + uint16_t warning_value; + uint8_t name_length; + uint8_t name[SENSOR_NAME_LEN]; +} sensors[SENSOR_COUNT] = { + {9, 0, 10, 9, 'sensor #1'}, }; void on_loop() { @@ -25,67 +28,214 @@ void on_loop() { now = millis(); if (now - last > 3000) { last = now; - sm_res data; - data.len = sizeof(struct sm_get_sensor_level_res); - data.code = SM_CMD_GET_SENSOR_LEVEL; - data.get_sensor_level.level = x; + + struct sm_res res; + res.code = SM_CMD_GET_VALUE; + res.get_value.value = x; + x++; if(x == 0) { x = 10; } - if(x % 2 == 0) { - notify_soil_moisture(&data); - } else { - notify_battery_level(x); - } +// if(x % 2 == 0) { +// notify_soil_moisture(res); +// } else { +// notify_battery_level(x); +// } + notify_soil_moisture(res, sizeof(sm_get_value_res)); + } +} + +#ifdef SM_DEBUG + +static void write_name(uint8_t const* name, uint8_t len) { + for(int i = 0; i < len; i++) { + Serial.print((char)name[i]); + } +} + +void write_req(struct sm_req const& req) { + int i; + + Serial.print(">> "); + + switch(req.code) { + case SM_CMD_GET_SENSOR_COUNT: + Serial.print("SM_CMD_GET_SENSOR_COUNT"); + break; + + case SM_CMD_GET_VALUE: + Serial.print("SM_CMD_GET_VALUE"); + Serial.print(": sensor="); + Serial.print(req.get_value.sensor, DEC); + break; + + case SM_CMD_SET_WARNING_VALUE: + Serial.print("SM_CMD_SET_WARNING_VALUE"); + Serial.print(": sensor="); + Serial.print(req.set_warning_value.sensor, DEC); + Serial.print(", warning_value="); + Serial.print(req.set_warning_value.warning_value, DEC); + break; + + case SM_CMD_GET_WARNING_VALUE: + Serial.print("SM_CMD_GET_WARNING_VALUE"); + Serial.print(": sensor="); + Serial.print(req.get_warning_value.sensor, DEC); + break; + + case SM_CMD_SET_SENSOR_NAME: + Serial.print("SM_CMD_SET_SENSOR_NAME"); + Serial.print(": sensor="); + Serial.print(req.set_sensor_name.sensor, DEC); + Serial.print(", name="); + write_name(req.set_sensor_name.name, req.set_sensor_name.length); + break; + + case SM_CMD_GET_SENSOR_NAME: + Serial.print("SM_CMD_GET_SENSOR_NAME"); + break; + + default: + Serial.print("Unknown command!"); } + Serial.println(); } -void on_soil_moisture(uint8_t *data, uint8_t len) { - Serial.print(F("on_soil_moisture, data[0]=")); - Serial.print(data[0], HEX); - Serial.print(F(", data[1]=")); - Serial.println(data[1], HEX); +void write_res(struct sm_res const& res) { + int i; + + Serial.print("<< "); + + switch(res.code) { + case SM_CMD_GET_SENSOR_COUNT: + Serial.print("SM_CMD_GET_SENSOR_COUNT"); + Serial.print(": count="); + Serial.print(res.get_sensor_count.count, DEC); + break; - struct sm_req *cmd = (struct sm_req *) data; + case SM_CMD_GET_VALUE: + Serial.print("SM_CMD_GET_VALUE"); + Serial.print(": value="); + Serial.print(res.get_value.value, DEC); + break; + + case SM_CMD_SET_WARNING_VALUE: + Serial.print("SM_CMD_SET_WARNING_VALUE"); + break; + + case SM_CMD_GET_WARNING_VALUE: + Serial.print("SM_CMD_GET_WARNING_VALUE"); + Serial.print(": warning_value="); + Serial.print(res.get_warning_value.warning_value, DEC); + break; + + case SM_CMD_SET_SENSOR_NAME: + Serial.print("SM_CMD_SET_SENSOR_NAME"); + break; + + case SM_CMD_GET_SENSOR_NAME: + Serial.print("SM_CMD_GET_SENSOR_NAME"); + Serial.print(": name="); + write_name(res.get_sensor_name.name, res.get_sensor_name.length); + break; + + default: + Serial.print("Unknown command!"); + } + Serial.println(); +} +#endif + +void on_soil_moisture_ctrl(uint8_t *data, uint8_t len) { + struct sm_req *req = (struct sm_req *) data; struct sm_res res; + uint8_t sensor; - res.code = cmd->code; +#if SM_DEBUG == 1 + write_req(*req); +#endif - Serial.print("code="); - Serial.println(cmd->code, DEC); + res.code = req->code; + uint8_t body_len; - switch(cmd->code) { + switch(req->code) { case SM_CMD_GET_SENSOR_COUNT: - res.len = sizeof(struct sm_get_sensor_count_res); + body_len = sizeof(sm_get_sensor_count_res); res.get_sensor_count.count = SENSOR_COUNT; break; - case SM_CMD_SET_SENSOR_THRESHOLD: -// res.len = sizeof(struct fsp_set_gauge_res); -// if (cmd->set_gauge.gauge < GAUGE_COUNT) { -// analogWrite(gauges[cmd->set_gauge.gauge].pin, cmd->set_gauge.value); -// gauges[cmd->set_gauge.gauge].value = cmd->set_gauge.value; -// } + case SM_CMD_GET_VALUE: + body_len = sizeof(sm_get_value_res); + sensor = req->get_value.sensor; + + if (sensor < SENSOR_COUNT) { + // TODO: update the sensor's value + res.get_value.value = sensors[sensor].value; + } else { + res.code = SM_CMD_FAIL; + } break; - case SM_CMD_GET_SENSOR_LEVEL: -// res.len = sizeof(struct fsp_get_gauge_res); -// if (cmd->get_gauge.gauge < GAUGE_COUNT) { -// res.get_gauge.gauge = cmd->get_gauge.gauge; -// res.get_gauge.value = gauges[cmd->get_gauge.gauge].value; -// } else { -// res.code = FSP_CMD_FAIL; -// res.len = 0; -// } + + case SM_CMD_SET_WARNING_VALUE: + body_len = sizeof(sm_set_warning_value_res); + sensor = req->set_warning_value.sensor; + + if (sensor < SENSOR_COUNT) { + sensors[sensor].warning_value = req->set_warning_value.warning_value; + } else { + res.code = SM_CMD_FAIL; + } + break; + + case SM_CMD_GET_WARNING_VALUE: + body_len = sizeof(sm_get_warning_value_res); + sensor = req->get_warning_value.sensor; + + if (sensor < SENSOR_COUNT) { + res.get_warning_value.warning_value = sensors[sensor].warning_value; + } else { + res.code = SM_CMD_FAIL; + } + break; + + case SM_CMD_SET_SENSOR_NAME: + body_len = sizeof(sm_set_sensor_name_res); + sensor = req->set_sensor_name.sensor; + + if (sensor < SENSOR_COUNT) { + sensors[sensor].name_length = min(req->set_sensor_name.length, SENSOR_NAME_LEN); + memcpy(sensors[sensor].name, req->set_sensor_name.name, sensors[sensor].name_length); + } else { + res.code = SM_CMD_FAIL; + } + break; + + case SM_CMD_GET_SENSOR_NAME: + body_len = sizeof(sm_get_sensor_name_res); + sensor = req->get_sensor_name.sensor; + Serial.print("sensor="); Serial.print(sensor, DEC); + + if (sensor < SENSOR_COUNT) { + res.get_sensor_name.length = sensors[sensor].name_length; + memcpy(res.get_sensor_name.name, sensors[sensor].name, SENSOR_NAME_LEN); + } else { + res.code = SM_CMD_FAIL; + } break; + default: res.code = SM_CMD_FAIL; - res.len = 0; break; } -// tx_soil_moisture(&res); -} + Serial.println(); + + if (res.code == SM_CMD_FAIL) { + body_len = 0; + } + notify_soil_moisture(res, body_len); +} -- cgit v1.2.3