library for enebular edge agent board(version p1)
Diff: Eeabp1.cpp
- Revision:
- 2:d48fcae8b5bd
- Parent:
- 1:da9fd2252ed5
- Child:
- 3:f80f2838a956
diff -r da9fd2252ed5 -r d48fcae8b5bd Eeabp1.cpp --- 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;