library for enebular edge agent board(version p1)

Dependents:   ina-hack-2nd

Revision:
2:d48fcae8b5bd
Parent:
1:da9fd2252ed5
Child:
3:f80f2838a956
--- a/Eeabp1.cpp	Sat Oct 21 07:26:52 2017 +0000
+++ b/Eeabp1.cpp	Sun Oct 22 01:22:24 2017 +0000
@@ -1,7 +1,6 @@
 #include "Eeabp1.h"
-//#include "rtos.h"
+#include <string.h>
 
-//Thread thread;
 static const int lora_msg_max_len = 11;
 
 Eeabp1::Eeabp1() : pwr_en(P0_0), led(P0_23), 
@@ -77,6 +76,7 @@
     return ret;
 }
 
+static char linebuf[64];
 int Eeabp1::setLoRaPower(bool on)
 {
     int ret;
@@ -93,6 +93,7 @@
         serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効
         wait(1);
         flushSerial();
+
         serial->printf("mod factory_reset\r\n"); // ファクトリーリセットを行い鍵をリフレッシュ
         ret = chkSerialCharOk();
         if (ret != 0)
@@ -122,7 +123,7 @@
         lora_power= 0;
         lora_enabled = false;
     }
-
+    
     return 0;
 }
 
@@ -149,6 +150,56 @@
     return 0;
 }
 
+int Eeabp1::sendLoRaStringAndReceiveResponse(char res[], const char * format, ...)
+{
+    char str[lora_msg_max_len+1] = {0x00, };
+    char msg[64];
+    char *p = msg;
+//    int count;
+    char *tp;
+    int ret;
+
+    std::va_list arg;
+    va_start(arg, format);
+    vsnprintf(str, sizeof(str), format, arg);
+    va_end(arg);
+
+    p += sprintf(msg, "lorawan tx ucnf 3 ");
+    for (unsigned int i = 0; i < strlen(str); i++) {
+        p += sprintf(p, "%02x", str[i]);
+    }
+    sprintf(p, "\r\n");
+
+    flushSerial();
+    serial->puts(msg);
+
+    getline(linebuf, sizeof(linebuf), 10000);
+//    count = getline(linebuf, sizeof(linebuf), 10000);
+//    this->debug("%d '%s'\r\n", count, linebuf);
+    
+    ret = -1;
+    res[0] = '\0';
+    tp = strtok(linebuf, " \r\n");
+    while(tp != NULL){
+//        this->debug("%s\r\n", tp);
+        if (strcmp(tp, "tx_ok") == 0) {
+            ret = 0;
+        } else if (strcmp(tp, "err") == 0) {
+            ret = -2;
+        } else if (strcmp(tp, "rx") == 0) {
+//            this->debug("rx found\r\n");
+            tp = strtok(NULL, " \r\n");
+//            this->debug("%s\r\n", tp);
+            tp = strtok(NULL, " \r\n");
+//            this->debug("%s\r\n", tp);
+            strcpy(res, tp);
+        }
+        tp = strtok(NULL, " \r\n");
+    }
+
+    return ret;
+}
+
 int Eeabp1::sendLoRaBinary(const char *payload, size_t len)
 {
     char msg[64];
@@ -438,7 +489,47 @@
     }
 }
 
-int Eeabp1::chkSerialChar(const char ch,uint16_t timeout_ms)
+inline ssize_t Eeabp1::getline(char *buf, size_t bufsize, int timeout_ms)
+{
+    char c;
+    size_t receivedChars = 0;
+    Timer t;
+
+    t.start();
+
+    *buf = '\0';
+    do {
+        if (!serial->readable()) {
+            wait_us(50);
+            continue;
+        }
+
+        c = serial->getc();
+        /*
+        if (c == '\r' || c == '\n') {
+            if (receivedChars == 0) {
+                continue; //Ignore if first character is delimiter    
+            }
+            if (serial->readable()) {
+                continue; //continue to read next line    
+            }
+            break;
+        }
+        */
+        if (receivedChars < bufsize - 1)
+        {
+            *buf++ = c;
+            receivedChars++;
+        }
+    } while(t.read_ms() < timeout_ms);
+    *buf++ = '\0';
+
+    t.stop();
+
+    return receivedChars;
+}
+
+int Eeabp1::chkSerialChar(const char ch, uint16_t timeout_ms)
 {
     uint32_t timeoutCount = 0;