aboutsummaryrefslogtreecommitdiff
path: root/app.cpp
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2015-01-04 21:02:45 +0100
committerTrygve Laugstøl <trygvis@inamo.no>2015-01-04 21:02:45 +0100
commit2f50ae8864aa2ba9e5807432eb878552389a9cb2 (patch)
treed4d028587942f109f10fcead918d9682a70f9bad /app.cpp
parent7c0e1f7ffb750813a788940fdd55e9800c2f701d (diff)
downloadtrygvisio_soil_moisture-2f50ae8864aa2ba9e5807432eb878552389a9cb2.tar.gz
trygvisio_soil_moisture-2f50ae8864aa2ba9e5807432eb878552389a9cb2.tar.bz2
trygvisio_soil_moisture-2f50ae8864aa2ba9e5807432eb878552389a9cb2.tar.xz
trygvisio_soil_moisture-2f50ae8864aa2ba9e5807432eb878552389a9cb2.zip
o Reworking the code after implementing much more on the Android app.
Diffstat (limited to 'app.cpp')
-rw-r--r--app.cpp234
1 files changed, 192 insertions, 42 deletions
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);
+}