diff --git a/Makefile b/Makefile index 91d1039..f0a8279 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,13 @@ # Single lora testing app CC=g++ -CFLAGS=-c -Wall `pkg-config --cflags 'libprotobuf-c >= 1.0.0'` -LIBS=-lwiringPi -lprotobuf-c +CFLAGS=-c -Wall `pkg-config --cflags sqlite3 'libprotobuf-c >= 1.0.0'` +LIBS=-lwiringPi -lprotobuf-c -lsqlite3 all: dragino_lora_app -dragino_lora_app: main.o protobuf.o message.pb-c.o - $(CC) main.o protobuf.o message.pb-c.o $(LIBS) -o dragino_lora_app +dragino_lora_app: main.o protobuf.o message.pb-c.o database.o + $(CC) main.o protobuf.o database.o message.pb-c.o $(LIBS) -o dragino_lora_app main.o: main.c protobuf.h $(CC) $(CFLAGS) main.c @@ -18,6 +18,9 @@ protobuf.o: message.pb-c.h protobuf.c protobuf.h protobuf.h: message.pb-c.h +database.o: database.c database.h + $(CC) $(CFLAGS) database.c -o database.o + message.pb-c.o: message.pb-c.h message.pb-c.c $(CC) $(CFLAGS) message.pb-c.c -o message.pb-c.o diff --git a/database.c b/database.c new file mode 100644 index 0000000..638bf7a --- /dev/null +++ b/database.c @@ -0,0 +1,53 @@ +#include "database.h" +#include +#include +#include + +void database_state_init(struct database_state* s, const char* db_path) { + int return_code; + return_code = sqlite3_open_v2(db_path, &s->vm, SQLITE_OPEN_READWRITE, NULL); + assert(return_code == SQLITE_OK); +} + +void database_state_free(struct database_state* s) { + sqlite3_close_v2(s->vm); +} + +void database_write_active(struct database_state* s, int collar_id, int active_status) { + const char query[] = "UPDATE collar SET active=? WHERE id=?"; + int return_code; + + sqlite3_stmt* stmt; + return_code = sqlite3_prepare_v2(s->vm, query, sizeof(query), &stmt, NULL); + assert(return_code == SQLITE_OK); + return_code = sqlite3_bind_int(stmt, 1, active_status); + assert(return_code == SQLITE_OK); + return_code = sqlite3_bind_int(stmt, 2, collar_id); + assert(return_code == SQLITE_OK); + + do { + return_code = sqlite3_step(stmt); + } while(return_code == SQLITE_ROW); + assert(return_code == SQLITE_DONE); +} + +void database_write_location(struct database_state* s, int collar_id, double x, double y) { + const char query[] = "INSERT INTO data_point(collar_id, longitude, latitude, datetime)" + "VALUES (?, ?, ?, datetime('now'))"; + int return_code; + + sqlite3_stmt* stmt; + return_code = sqlite3_prepare_v2(s->vm, query, sizeof(query), &stmt, NULL); + assert(return_code == SQLITE_OK); + return_code = sqlite3_bind_int(stmt, 1, collar_id); + assert(return_code == SQLITE_OK); + return_code = sqlite3_bind_double(stmt, 2, x); + assert(return_code == SQLITE_OK); + return_code = sqlite3_bind_double(stmt, 3, y); + assert(return_code == SQLITE_OK); + + do { + return_code = sqlite3_step(stmt); + } while(return_code == SQLITE_ROW); + assert(return_code == SQLITE_DONE); +} diff --git a/database.h b/database.h new file mode 100644 index 0000000..484eafb --- /dev/null +++ b/database.h @@ -0,0 +1,14 @@ +#include + +extern "C" { + +struct database_state { + sqlite3* vm; +}; + +void database_state_init(struct database_state* s, const char* db_path); +void database_state_free(struct database_state* s); +void database_write_active(struct database_state* s, int collar_id, int active_status); +void database_write_location(struct database_state* s, int collar_id, double x, double y); + +}