seems to work

This commit is contained in:
sessionm21 2020-05-16 07:51:15 +01:00
parent 869b2cab3c
commit 0b55fce9b8
1 changed files with 28 additions and 62 deletions

View File

@ -27,7 +27,7 @@ static const u4_t DEVADDR = 0x260212B6;
// } // }
void debug_function(char *str) { void debug_function(char *str) {
Serial.println(str); // Serial.println(str);
} }
@ -68,7 +68,7 @@ float * const polyy = polyx + N_POLY_MAX;
* of vertices * of vertices
* - https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html * - https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html
***************************************************/ ***************************************************/
const int pnpoly inline const int pnpoly
(const uint8_t nvert, const float *vertx, const float *verty, const float testx, const float testy) (const uint8_t nvert, const float *vertx, const float *verty, const float testx, const float testy)
{ {
uint8_t i, j, c = 0; uint8_t i, j, c = 0;
@ -85,7 +85,7 @@ const int pnpoly
* - takes current GPS coordinates * - takes current GPS coordinates
* - return 1 if in bounds * - return 1 if in bounds
***************************************************/ ***************************************************/
const int check_bounds(const float x, const float y) { inline const int check_bounds(const float x, const float y) {
return pnpoly(n_poly, polyx, polyy, x, y); return pnpoly(n_poly, polyx, polyy, x, y);
} }
@ -95,8 +95,6 @@ const int check_bounds(const float x, const float y) {
* - loading arrays in nanopb does not appear * - loading arrays in nanopb does not appear
* to work. * to work.
***************************************************/ ***************************************************/
static volatile uint8_t data_available = 0;
static volatile uint8_t done_sending = 0;
inline void import_protobuf(const uint8_t *protobuffer, const uint8_t size) { inline void import_protobuf(const uint8_t *protobuffer, const uint8_t size) {
if(size != 122) { if(size != 122) {
Serial.println("nmd"); Serial.println("nmd");
@ -108,25 +106,19 @@ inline void import_protobuf(const uint8_t *protobuffer, const uint8_t size) {
if(isr>N_POLY_MAX) isr = 0; if(isr>N_POLY_MAX) isr = 0;
const uint8_t *ptr = protobuffer + 5; const uint8_t *ptr = protobuffer + 5;
for(uint8_t i=0;i<isr && i<N_POLY_MAX;i++) { for(uint8_t i=0;i<isr && i<N_POLY_MAX;i++) {
memcpy(&polyx[i], ptr + i*12, 4); memcpy(&polyy[i], ptr + i*12, 4);
memcpy(&polyy[i], ptr + i*12+5, 4); memcpy(&polyx[i], ptr + i*12+5, 4);
} }
n_poly = isr; n_poly = isr;
data_available = 1;
} }
void do_send(osjob_t* j); void do_send(osjob_t* j);
void onEvent (ev_t ev) { void onEvent (ev_t ev) {
if(ev == EV_TXCOMPLETE) { if(ev == EV_TXCOMPLETE) {
// Serial.print(F("- EV_TXCOMPLETE"));
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen) { if (LMIC.dataLen) {
Serial.println(F("Received ")); Serial.print(F(" -Received: "));
Serial.println(LMIC.dataLen); Serial.println(LMIC.dataLen);
Serial.println(F(" bytes of payload"));
} }
// Schedule next transmission // Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send); os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
@ -134,13 +126,6 @@ void onEvent (ev_t ev) {
if (LMIC.dataLen) { if (LMIC.dataLen) {
import_protobuf(LMIC.frame + LMIC.dataBeg, LMIC.dataLen); import_protobuf(LMIC.frame + LMIC.dataBeg, LMIC.dataLen);
} }
done_sending = 1;
}
else if(ev == EV_TXSTART) {
// Serial.print(F("- EV_TXSTART"));
}
else {
Serial.print(F("- Unknown event: "));
} }
} }
@ -157,12 +142,7 @@ volatile uint8_t state;
volatile uint32_t since; volatile uint32_t since;
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
softserial_init();
Serial.println(F("Starting"));
softserial_init();
// softserial_init();
// pinMode(LED_BUILTIN, OUTPUT);
os_init(); os_init();
LMIC_reset(); LMIC_reset();
@ -186,31 +166,25 @@ void setup() {
delay(1000); delay(1000);
data_available = 0;
state = START_GPS; state = START_GPS;
do_send(&sendjob); do_send(&sendjob);
} }
inline void read_gps() { inline void read_gps() {
uint8_t available = softserial_available(); uint8_t available = softserial_available();
while(available> 0) { while(available) {
gps.encode(softserial_read()); gps.encode(softserial_read());
available--; available--;
} }
} }
inline void on_start_gps() { inline void on_start_gps() {
Serial.println("Starting gps");
state = WAIT_GPS; state = WAIT_GPS;
} }
inline void on_wait_gps() { inline void on_wait_gps() {
Serial.println("Waiting for gps");
if(gps.location.isValid()) { if(gps.location.isValid()) {
state = START_LORA; state = START_LORA;
Serial.println("end of gps");
} }
} }
@ -222,8 +196,8 @@ inline void on_wait_gps() {
#define FIELD_TWO_VARIANT 0x10 #define FIELD_TWO_VARIANT 0x10
const char oob[] = "OUT OF BOUNDS"; const char oob[] = " -OUT OF BOUNDS";
const char inb[] = "IN BOUNDS"; const char inb[] = " -IN BOUNDS";
uint8_t buffer[] = { uint8_t buffer[] = {
TYPE_STRING, TYPE_STRING,
PROTO_LEN, PROTO_LEN,
@ -237,12 +211,11 @@ void on_start_lora() {
void send_lora() { void send_lora() {
if (LMIC.opmode & OP_TXRXPEND) { if (LMIC.opmode & OP_TXRXPEND) {
Serial.print(" -cns"); Serial.print(" -cns");
done_sending = 1;
} else { } else {
const float latitude = gps.location.lat(); const float latitude = gps.location.lat();
const float longitude = gps.location.lng(); const float longitude = gps.location.lng();
if(n_poly>0) { if(n_poly>0) {
const uint8_t out_of_bounds = 0;//!check_bounds(latitude, longitude); const uint8_t out_of_bounds = check_bounds(latitude, longitude);
if(out_of_bounds) { if(out_of_bounds) {
Serial.println(oob); Serial.println(oob);
} else { } else {
@ -268,13 +241,13 @@ void do_send(osjob_t* j){
#define TIMEOUT TX_INTERVAL * 2 * 1000UL #define TIMEOUT TX_INTERVAL * 2 * 1000UL
void on_wait_lora() { void on_wait_lora() {
if(millis()- since > TX_INTERVAL*1000UL || done_sending) { if(millis()- since > TX_INTERVAL*1000UL) {
Serial.println(" -Lora Done Sending"); Serial.println(" -Lora Done Sending");
done_sending = 0;
state = START_GPS; state = START_GPS;
} }
if(millis()- since > TIMEOUT) { if(millis() - since > TIMEOUT) {
Serial.println(" -Scheduling another job");
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send); os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
} }
} }
@ -290,14 +263,12 @@ void loop() {
Serial.print('.'); Serial.print('.');
if(state == START_GPS) { if(state == START_GPS) {
// softserial_init();
on_start_gps(); on_start_gps();
} }
else if(state == WAIT_GPS) { else if(state == WAIT_GPS) {
on_wait_gps(); on_wait_gps();
} }
else if(state == START_LORA) { else if(state == START_LORA) {
// softserial_end();
on_start_lora(); on_start_lora();
} }
else if(state == WAIT_LORA) { else if(state == WAIT_LORA) {
@ -306,23 +277,18 @@ void loop() {
} else { } else {
// Serial.print('.'); // Serial.print('.');
} }
if(data_available) { // if(data_available) {
Serial.println("Data available"); // Serial.println("Data available");
for(uint8_t i=0;i<n_poly;i++) { // for(uint8_t i=0;i<n_poly;i++) {
Serial.print('('); // Serial.print('(');
Serial.print((int)(polyy[i]*100)); // Serial.print((int)(polyy[i]*100));
Serial.print(','); // Serial.print(',');
Serial.print((int)(polyx[i]*100)); // Serial.print((int)(polyx[i]*100));
Serial.print(')'); // Serial.print(')');
Serial.print(','); // Serial.print(',');
} // }
data_available = 0; // data_available = 0;
} // }
if(state == WAIT_GPS) read_gps();
read_gps();
os_runloop_once(); os_runloop_once();
// Serial.print(time);
// Serial.print(':');
// Serial.println(state);
// delay(100);
} }