Smartage application

Dependencies:   BufferedSerial SX1276GenericLib USBDeviceHT mbed Crypto X_NUCLEO_IKS01A2

Fork of STM32L0_LoRa by Helmut Tschemernjak

Committer:
marcozecchini
Date:
Mon Sep 17 22:16:48 2018 +0000
Revision:
34:8393ded26b4f
Parent:
29:04e1489f8fe2
Bug fixed 4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 29:04e1489f8fe2 1 #include "main.h"
Helmut64 17:98f2528e8399 2
Helmut64 17:98f2528e8399 3 time_t cvt_date(char const *date, char const *time);
Helmut64 17:98f2528e8399 4
Helmut64 17:98f2528e8399 5 BufferedSerial *ser;
Helmut64 17:98f2528e8399 6 #ifdef FEATURE_USBSERIAL
Helmut64 17:98f2528e8399 7 USBSerialBuffered *usb;
Helmut64 17:98f2528e8399 8 #endif
Helmut64 17:98f2528e8399 9 bool _useDprintf;
Helmut64 17:98f2528e8399 10
Helmut64 17:98f2528e8399 11 void InitSerial(int timeout, DigitalOut *led)
Helmut64 17:98f2528e8399 12 {
Helmut64 17:98f2528e8399 13 _useDprintf = true;
Helmut64 17:98f2528e8399 14 bool uartActive;
Helmut64 17:98f2528e8399 15 {
Helmut64 17:98f2528e8399 16 {
Helmut64 17:98f2528e8399 17 // need to turn rx low to avoid floating signal
Helmut64 17:98f2528e8399 18 DigitalOut rx(USBRX);
Helmut64 17:98f2528e8399 19 rx = 0;
Helmut64 17:98f2528e8399 20 }
Helmut64 17:98f2528e8399 21 DigitalIn uartRX(USBRX);
Helmut64 17:98f2528e8399 22 uartActive = uartRX.read();
Helmut64 17:98f2528e8399 23 }
Helmut64 17:98f2528e8399 24 #ifdef FEATURE_USBSERIAL
Helmut64 17:98f2528e8399 25 if (!uartActive) {
Helmut64 17:98f2528e8399 26 usb = new USBSerialBuffered();
Helmut64 17:98f2528e8399 27 Timer t;
Helmut64 17:98f2528e8399 28 t.start();
Helmut64 17:98f2528e8399 29 while(!usb->connected()) {
Helmut64 17:98f2528e8399 30 if (led)
Helmut64 17:98f2528e8399 31 *led = !*led;
Helmut64 17:98f2528e8399 32 wait_ms(100);
Helmut64 17:98f2528e8399 33 if (timeout) {
Helmut64 17:98f2528e8399 34 if (t.read_ms() >= timeout)
Helmut64 17:98f2528e8399 35 return;
Helmut64 17:98f2528e8399 36 }
Helmut64 17:98f2528e8399 37 }
Helmut64 17:98f2528e8399 38 return;
Helmut64 17:98f2528e8399 39 } else {
Helmut64 17:98f2528e8399 40 #else
Helmut64 17:98f2528e8399 41 {
Helmut64 17:98f2528e8399 42 #endif
Helmut64 17:98f2528e8399 43 ser = new BufferedSerial(USBTX, USBRX);
Helmut64 17:98f2528e8399 44 ser->baud(230400);
Helmut64 17:98f2528e8399 45 ser->format(8);
Helmut64 17:98f2528e8399 46 }
Helmut64 17:98f2528e8399 47 time_t t = cvt_date(__DATE__, __TIME__);
Helmut64 17:98f2528e8399 48 if (t > time(NULL)) {
Helmut64 17:98f2528e8399 49 set_time(t);
Helmut64 17:98f2528e8399 50 }
Helmut64 17:98f2528e8399 51
Helmut64 17:98f2528e8399 52 }
Helmut64 17:98f2528e8399 53
Helmut64 17:98f2528e8399 54 void printTimeStamp()
Helmut64 17:98f2528e8399 55 {
Helmut64 17:98f2528e8399 56 static LowPowerTimer *timer;
Helmut64 17:98f2528e8399 57 if (!timer) {
Helmut64 17:98f2528e8399 58 timer = new LowPowerTimer();
Helmut64 17:98f2528e8399 59 timer->start();
Helmut64 17:98f2528e8399 60 }
Helmut64 17:98f2528e8399 61 time_t seconds = time(NULL);
Helmut64 17:98f2528e8399 62 struct tm *tm = localtime(&seconds);
Helmut64 17:98f2528e8399 63 int usecs = timer->read_us();
Helmut64 17:98f2528e8399 64 if (usecs < 0) {
Helmut64 17:98f2528e8399 65 usecs = 0;
Helmut64 17:98f2528e8399 66 timer->stop();
Helmut64 17:98f2528e8399 67 timer->reset();
Helmut64 17:98f2528e8399 68 timer->start();
Helmut64 17:98f2528e8399 69 }
Helmut64 17:98f2528e8399 70 int msecs = usecs % 1000000;
Helmut64 17:98f2528e8399 71
Helmut64 17:98f2528e8399 72 rprintf("%02d:%02d:%02d.%06d ", tm->tm_hour, tm->tm_min, tm->tm_sec, msecs);
Helmut64 17:98f2528e8399 73 }
Helmut64 17:98f2528e8399 74
Helmut64 17:98f2528e8399 75 void dprintf(const char *format, ...)
Helmut64 17:98f2528e8399 76 {
Helmut64 17:98f2528e8399 77 std::va_list arg;
Helmut64 17:98f2528e8399 78
Helmut64 17:98f2528e8399 79 va_start(arg, format);
Helmut64 17:98f2528e8399 80 VAprintf(true, true, _useDprintf, format, arg);
Helmut64 17:98f2528e8399 81 va_end(arg);
Helmut64 17:98f2528e8399 82 }
Helmut64 17:98f2528e8399 83
Helmut64 17:98f2528e8399 84 void rprintf(const char *format, ...)
Helmut64 17:98f2528e8399 85 {
Helmut64 17:98f2528e8399 86 std::va_list arg;
Helmut64 17:98f2528e8399 87
Helmut64 17:98f2528e8399 88 va_start(arg, format);
Helmut64 17:98f2528e8399 89 VAprintf(false, false, _useDprintf, format, arg);
Helmut64 17:98f2528e8399 90 va_end(arg);
Helmut64 17:98f2528e8399 91 }
Helmut64 17:98f2528e8399 92
Helmut64 17:98f2528e8399 93 void VAprintf(bool timstamp, bool newline, bool printEnabled, const char *format, va_list arg)
Helmut64 17:98f2528e8399 94 {
Helmut64 17:98f2528e8399 95 if (!printEnabled)
Helmut64 17:98f2528e8399 96 return;
Helmut64 17:98f2528e8399 97
Helmut64 17:98f2528e8399 98 if (timstamp)
Helmut64 17:98f2528e8399 99 printTimeStamp();
Helmut64 17:98f2528e8399 100 #ifdef FEATURE_USBSERIAL
Helmut64 17:98f2528e8399 101 if (usb) {
Helmut64 17:98f2528e8399 102 usb->vprintf_irqsafe(format, arg);
Helmut64 17:98f2528e8399 103 if (newline)
Helmut64 17:98f2528e8399 104 usb->printf_irqsafe("\r\n");
Helmut64 17:98f2528e8399 105 #else
Helmut64 17:98f2528e8399 106 if (0) {
Helmut64 17:98f2528e8399 107 #endif
Helmut64 17:98f2528e8399 108 } else if (ser) {
Helmut64 17:98f2528e8399 109 // serial jas
Helmut64 17:98f2528e8399 110 int r = 0;
Helmut64 17:98f2528e8399 111 r = vsnprintf(NULL, 0, format, arg);
Helmut64 17:98f2528e8399 112 if (r < 82) {
Helmut64 17:98f2528e8399 113 char buffer[82+1];
Helmut64 17:98f2528e8399 114
Helmut64 17:98f2528e8399 115 vsnprintf(buffer, sizeof(buffer), format, arg);
Helmut64 17:98f2528e8399 116 r = ser->write(buffer, r);
Helmut64 17:98f2528e8399 117 } else {
Helmut64 17:98f2528e8399 118 char *buffer = new char[r+1];
Helmut64 17:98f2528e8399 119 if (buffer) {
Helmut64 17:98f2528e8399 120 vsnprintf(buffer, r+1, format, arg);
Helmut64 17:98f2528e8399 121 r = ser->write(buffer, r);
Helmut64 17:98f2528e8399 122 delete[] buffer;
Helmut64 17:98f2528e8399 123 } else {
Helmut64 17:98f2528e8399 124 error("%s %d cannot alloc memory (%d bytes)!\r\n", __FILE__, __LINE__, r+1);
Helmut64 17:98f2528e8399 125 r = 0;
Helmut64 17:98f2528e8399 126 }
Helmut64 17:98f2528e8399 127 }
Helmut64 17:98f2528e8399 128 if (newline)
Helmut64 17:98f2528e8399 129 ser->write("\r\n", 2);
Helmut64 17:98f2528e8399 130 }
Helmut64 17:98f2528e8399 131 }
Helmut64 17:98f2528e8399 132
Helmut64 17:98f2528e8399 133
Helmut64 17:98f2528e8399 134 void dump(const char *title, const void *data, int len, bool dwords)
Helmut64 17:98f2528e8399 135 {
Helmut64 17:98f2528e8399 136 dprintf("dump(\"%s\", 0x%x, %d bytes)", title, data, len);
Helmut64 17:98f2528e8399 137
Helmut64 17:98f2528e8399 138 int i, j, cnt;
Helmut64 17:98f2528e8399 139 unsigned char *u;
Helmut64 17:98f2528e8399 140 const int width = 16;
Helmut64 17:98f2528e8399 141 const int seppos = 7;
Helmut64 17:98f2528e8399 142
Helmut64 17:98f2528e8399 143 cnt = 0;
Helmut64 17:98f2528e8399 144 u = (unsigned char *)data;
Helmut64 17:98f2528e8399 145 while (len > 0) {
Helmut64 17:98f2528e8399 146 rprintf("%08x: ", (unsigned int)data + cnt);
Helmut64 17:98f2528e8399 147 if (dwords) {
Helmut64 17:98f2528e8399 148 unsigned int *ip = ( unsigned int *)u;
Helmut64 17:98f2528e8399 149 rprintf(" 0x%08x\r\n", *ip);
Helmut64 17:98f2528e8399 150 u+= 4;
Helmut64 17:98f2528e8399 151 len -= 4;
Helmut64 17:98f2528e8399 152 cnt += 4;
Helmut64 17:98f2528e8399 153 continue;
Helmut64 17:98f2528e8399 154 }
Helmut64 17:98f2528e8399 155 cnt += width;
Helmut64 17:98f2528e8399 156 j = len < width ? len : width;
Helmut64 17:98f2528e8399 157 for (i = 0; i < j; i++) {
Helmut64 17:98f2528e8399 158 rprintf("%2.2x ", *(u + i));
Helmut64 17:98f2528e8399 159 if (i == seppos)
Helmut64 17:98f2528e8399 160 rprintf(" ");
Helmut64 17:98f2528e8399 161 }
Helmut64 17:98f2528e8399 162 rprintf(" ");
Helmut64 17:98f2528e8399 163 if (j < width) {
Helmut64 17:98f2528e8399 164 i = width - j;
Helmut64 17:98f2528e8399 165 if (i > seppos + 1)
Helmut64 17:98f2528e8399 166 rprintf(" ");
Helmut64 17:98f2528e8399 167 while (i--) {
Helmut64 17:98f2528e8399 168 rprintf("%s", " ");
Helmut64 17:98f2528e8399 169 }
Helmut64 17:98f2528e8399 170 }
Helmut64 17:98f2528e8399 171 for (i = 0; i < j; i++) {
Helmut64 17:98f2528e8399 172 int c = *(u + i);
Helmut64 17:98f2528e8399 173 if (c >= ' ' && c <= '~')
Helmut64 17:98f2528e8399 174 rprintf("%c", c);
Helmut64 17:98f2528e8399 175 else
Helmut64 17:98f2528e8399 176 rprintf(".");
Helmut64 17:98f2528e8399 177 if (i == seppos)
Helmut64 17:98f2528e8399 178 rprintf(" ");
Helmut64 17:98f2528e8399 179 }
Helmut64 17:98f2528e8399 180 len -= width;
Helmut64 17:98f2528e8399 181 u += width;
Helmut64 17:98f2528e8399 182 rprintf("\r\n");
Helmut64 17:98f2528e8399 183 }
Helmut64 17:98f2528e8399 184 rprintf("--\r\n");
Helmut64 17:98f2528e8399 185 }
Helmut64 17:98f2528e8399 186
Helmut64 17:98f2528e8399 187 /*
Helmut64 17:98f2528e8399 188 * Convert compile time to system time
Helmut64 17:98f2528e8399 189 */
Helmut64 17:98f2528e8399 190 time_t
Helmut64 17:98f2528e8399 191 cvt_date(char const *date, char const *time)
Helmut64 17:98f2528e8399 192 {
Helmut64 17:98f2528e8399 193 char s_month[5];
Helmut64 17:98f2528e8399 194 int year;
Helmut64 17:98f2528e8399 195 struct tm t;
Helmut64 17:98f2528e8399 196 static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
Helmut64 17:98f2528e8399 197 sscanf(date, "%s %d %d", s_month, &t.tm_mday, &year);
Helmut64 17:98f2528e8399 198 sscanf(time, "%2d %*c %2d %*c %2d", &t.tm_hour, &t.tm_min, &t.tm_sec);
Helmut64 17:98f2528e8399 199 // Find where is s_month in month_names. Deduce month value.
Helmut64 17:98f2528e8399 200 t.tm_mon = (strstr(month_names, s_month) - month_names) / 3;
Helmut64 17:98f2528e8399 201 t.tm_year = year - 1900;
Helmut64 17:98f2528e8399 202 return (int)mktime(&t);
Helmut64 17:98f2528e8399 203 }