Compare commits

..

3 Commits

Author SHA1 Message Date
Ryan Alder
97dbf3facb Switch to 32-bit floats 2020-02-17 15:52:28 -08:00
Ryan Alder
2cda6935ab Add database API example 2020-02-17 15:51:57 -08:00
Ryan Alder
c3b29387fd Add database API 2020-02-17 15:51:44 -08:00
5 changed files with 85 additions and 6 deletions

View File

@ -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

53
database.c Normal file
View File

@ -0,0 +1,53 @@
#include "database.h"
#include <assert.h>
#include <stdio.h>
#include <stddef.h>
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);
}

14
database.h Normal file
View File

@ -0,0 +1,14 @@
#include <sqlite3.h>
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);
}

View File

@ -3,8 +3,8 @@ syntax = "proto2";
package Fenceless;
message Coordinate {
required double x = 1;
required double y = 2;
required float x = 1;
required float y = 2;
}
message CollarResponse {

9
sample.c Normal file
View File

@ -0,0 +1,9 @@
#include "database.h"
int main() {
struct database_state state;
database_state_init(&state, "data.sqlite");
database_write_active(&state, 1, 1);
database_write_location(&state, 1, 5.0, 5.0);
database_state_free(&state);
}