point-2-point demo

Dependencies:   sx12xx_hal

radio chip selection

Radio chip driver is not included, because these options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

TX trigger selection

Edit main.h to define DIGITAL_TRIGGER or ANALOG_TRIGGER to chose whether transmit is initiated by digital pin (button/jumper) or analog pin(s) level change.

This project is intended to be used on two LoRa shields.

Each board sits in continuous RX mode, waiting for request packet.
If the received packet has good CRC, the packet is acknowledged along with read of ADC sample from the replying device.
The original request packet also contains instruction to set level of output pin.

Both sides of the link are running the same code, and each can initiate a transmission at any time.
No addressing is used, so only two nodes can operate on the radio channel.

Committer:
Wayne Roberts
Date:
Wed Aug 01 15:04:11 2018 -0700
Revision:
5:e35b1b281466
Parent:
1:d95d135a4fb4
move analog to separate source file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 1:d95d135a4fb4 1 #include <mbed.h>
Wayne Roberts 5:e35b1b281466 2 #include "main.h"
dudmuck 1:d95d135a4fb4 3
Wayne Roberts 5:e35b1b281466 4 PwmOut pwmA(PB_11); /* CN10-18 */
Wayne Roberts 5:e35b1b281466 5 PwmOut pwmB(PA_15); /* CN7-17 */
Wayne Roberts 5:e35b1b281466 6 PwmOut pwmC(PB_1); /* CN10-24 */
Wayne Roberts 5:e35b1b281466 7 PwmOut pwmD(PC_6); /* CN10-4 */
dudmuck 1:d95d135a4fb4 8
dudmuck 1:d95d135a4fb4 9 RawSerial pc(USBTX, USBRX);
dudmuck 1:d95d135a4fb4 10 char pcbuf[128];
dudmuck 1:d95d135a4fb4 11 int pcbuf_len;
dudmuck 1:d95d135a4fb4 12
dudmuck 1:d95d135a4fb4 13 bool initialized = false;
dudmuck 1:d95d135a4fb4 14
dudmuck 1:d95d135a4fb4 15 /* return true for parsed */
dudmuck 1:d95d135a4fb4 16 bool parse_radio_rx(uint8_t* rx_buf)
dudmuck 1:d95d135a4fb4 17 {
Wayne Roberts 5:e35b1b281466 18 PwmOut* pwmPtr;
Wayne Roberts 5:e35b1b281466 19
Wayne Roberts 5:e35b1b281466 20 switch (rx_buf[0]) {
Wayne Roberts 5:e35b1b281466 21 case CMD_PWM_A: pwmPtr = &pwmA; break;
Wayne Roberts 5:e35b1b281466 22 case CMD_PWM_B: pwmPtr = &pwmB; break;
Wayne Roberts 5:e35b1b281466 23 case CMD_PWM_C: pwmPtr = &pwmC; break;
Wayne Roberts 5:e35b1b281466 24 case CMD_PWM_D: pwmPtr = &pwmD; break;
Wayne Roberts 5:e35b1b281466 25 default: return false;
dudmuck 1:d95d135a4fb4 26 }
dudmuck 1:d95d135a4fb4 27
Wayne Roberts 5:e35b1b281466 28 pwmPtr->period(1.0 / rx_buf[1]); // rx_buf[1] is Hz
Wayne Roberts 5:e35b1b281466 29 pwmPtr->write(rx_buf[2] / 255.0);
Wayne Roberts 5:e35b1b281466 30 printf("%uHz, duty:%.2f\r\n", rx_buf[1], rx_buf[2]/255.0);
Wayne Roberts 5:e35b1b281466 31 return true;
dudmuck 1:d95d135a4fb4 32 }
dudmuck 1:d95d135a4fb4 33
dudmuck 1:d95d135a4fb4 34 void cmd_pwm(uint8_t idx)
dudmuck 1:d95d135a4fb4 35 {
dudmuck 1:d95d135a4fb4 36 uint8_t buf[4];
Wayne Roberts 5:e35b1b281466 37 unsigned ch, p, d;
dudmuck 1:d95d135a4fb4 38
Wayne Roberts 5:e35b1b281466 39 if (sscanf(pcbuf+idx, "%u %u %u", &ch, &p, &d) != 3) {
dudmuck 1:d95d135a4fb4 40 printf("parse fail\r\n");
dudmuck 1:d95d135a4fb4 41 return;
dudmuck 1:d95d135a4fb4 42 }
dudmuck 1:d95d135a4fb4 43
Wayne Roberts 5:e35b1b281466 44 switch (ch) {
Wayne Roberts 5:e35b1b281466 45 case 0: buf[0] = CMD_PWM_A; break;
Wayne Roberts 5:e35b1b281466 46 case 1: buf[0] = CMD_PWM_B; break;
Wayne Roberts 5:e35b1b281466 47 case 2: buf[0] = CMD_PWM_C; break;
Wayne Roberts 5:e35b1b281466 48 case 3: buf[0] = CMD_PWM_D; break;
Wayne Roberts 5:e35b1b281466 49 }
dudmuck 1:d95d135a4fb4 50 buf[1] = p;
dudmuck 1:d95d135a4fb4 51 buf[2] = d;
dudmuck 1:d95d135a4fb4 52 radio_tx(buf, 3);
dudmuck 1:d95d135a4fb4 53 }
dudmuck 1:d95d135a4fb4 54
dudmuck 1:d95d135a4fb4 55 void cmd_help(uint8_t args_at);
dudmuck 1:d95d135a4fb4 56
dudmuck 1:d95d135a4fb4 57 typedef struct {
dudmuck 1:d95d135a4fb4 58 const char* const cmd;
dudmuck 1:d95d135a4fb4 59 void (*handler)(uint8_t args_at);
dudmuck 1:d95d135a4fb4 60 const char* const arg_descr;
dudmuck 1:d95d135a4fb4 61 const char* const description;
dudmuck 1:d95d135a4fb4 62 } menu_item_t;
dudmuck 1:d95d135a4fb4 63
dudmuck 1:d95d135a4fb4 64 const menu_item_t menu_items[] =
dudmuck 1:d95d135a4fb4 65 { /* after first character, command names must be [A-Za-z] */
dudmuck 1:d95d135a4fb4 66 { "?", cmd_help, "","show available commands"},
dudmuck 1:d95d135a4fb4 67 { "p", cmd_pwm, "%u %u", "set pwm period, duty"},
dudmuck 1:d95d135a4fb4 68 { NULL, NULL, NULL, NULL }
dudmuck 1:d95d135a4fb4 69 };
dudmuck 1:d95d135a4fb4 70
dudmuck 1:d95d135a4fb4 71 void cmd_help(uint8_t args_at)
dudmuck 1:d95d135a4fb4 72 {
dudmuck 1:d95d135a4fb4 73 int i;
dudmuck 1:d95d135a4fb4 74 for (i = 0; menu_items[i].cmd != NULL ; i++) {
dudmuck 1:d95d135a4fb4 75 printf("%s%s\t%s\r\n", menu_items[i].cmd, menu_items[i].arg_descr, menu_items[i].description);
dudmuck 1:d95d135a4fb4 76 }
dudmuck 1:d95d135a4fb4 77 }
dudmuck 1:d95d135a4fb4 78
dudmuck 1:d95d135a4fb4 79 void rx_callback()
dudmuck 1:d95d135a4fb4 80 {
dudmuck 1:d95d135a4fb4 81 static uint8_t pcbuf_idx = 0;
dudmuck 1:d95d135a4fb4 82 static uint8_t prev_len = 0;;
dudmuck 1:d95d135a4fb4 83 char c = pc.getc();
dudmuck 1:d95d135a4fb4 84
dudmuck 1:d95d135a4fb4 85 if (c == 8) {
dudmuck 1:d95d135a4fb4 86 if (pcbuf_idx > 0) {
dudmuck 1:d95d135a4fb4 87 pc.putc(8);
dudmuck 1:d95d135a4fb4 88 pc.putc(' ');
dudmuck 1:d95d135a4fb4 89 pc.putc(8);
dudmuck 1:d95d135a4fb4 90 pcbuf_idx--;
dudmuck 1:d95d135a4fb4 91 }
dudmuck 1:d95d135a4fb4 92 } else if (c == 3) { // ctrl-C
dudmuck 1:d95d135a4fb4 93 pcbuf_len = -1;
dudmuck 1:d95d135a4fb4 94 } else if (c == '\r') {
dudmuck 1:d95d135a4fb4 95 if (pcbuf_idx == 0) {
dudmuck 1:d95d135a4fb4 96 pcbuf_len = prev_len;
dudmuck 1:d95d135a4fb4 97 } else {
dudmuck 1:d95d135a4fb4 98 pcbuf[pcbuf_idx] = 0; // null terminate
dudmuck 1:d95d135a4fb4 99 prev_len = pcbuf_idx;
dudmuck 1:d95d135a4fb4 100 pcbuf_idx = 0;
dudmuck 1:d95d135a4fb4 101 pcbuf_len = prev_len;
dudmuck 1:d95d135a4fb4 102 }
dudmuck 1:d95d135a4fb4 103 } else if (pcbuf_idx < sizeof(pcbuf)) {
dudmuck 1:d95d135a4fb4 104 pcbuf[pcbuf_idx++] = c;
dudmuck 1:d95d135a4fb4 105 pc.putc(c);
dudmuck 1:d95d135a4fb4 106 }
dudmuck 1:d95d135a4fb4 107 }
dudmuck 1:d95d135a4fb4 108
dudmuck 1:d95d135a4fb4 109 void uart_service()
dudmuck 1:d95d135a4fb4 110 {
dudmuck 1:d95d135a4fb4 111 int i;
dudmuck 1:d95d135a4fb4 112 uint8_t user_cmd_len;
dudmuck 1:d95d135a4fb4 113
dudmuck 1:d95d135a4fb4 114 if (!initialized) {
dudmuck 1:d95d135a4fb4 115 pc.attach(&rx_callback);
dudmuck 1:d95d135a4fb4 116 initialized = true;
dudmuck 1:d95d135a4fb4 117 }
dudmuck 1:d95d135a4fb4 118
dudmuck 1:d95d135a4fb4 119 if (pcbuf_len < 0) { // ctrl-C
dudmuck 1:d95d135a4fb4 120 return;
dudmuck 1:d95d135a4fb4 121 }
dudmuck 1:d95d135a4fb4 122 if (pcbuf_len == 0)
dudmuck 1:d95d135a4fb4 123 return;
dudmuck 1:d95d135a4fb4 124
dudmuck 1:d95d135a4fb4 125 printf("\r\n");
dudmuck 1:d95d135a4fb4 126
dudmuck 1:d95d135a4fb4 127 /* get end of user-entered command */
dudmuck 1:d95d135a4fb4 128 user_cmd_len = 1; // first character can be any character
dudmuck 1:d95d135a4fb4 129 for (i = 1; i <= pcbuf_len; i++) {
dudmuck 1:d95d135a4fb4 130 if (pcbuf[i] < 'A' || (pcbuf[i] > 'Z' && pcbuf[i] < 'a') || pcbuf[i] > 'z') {
dudmuck 1:d95d135a4fb4 131 user_cmd_len = i;
dudmuck 1:d95d135a4fb4 132 break;
dudmuck 1:d95d135a4fb4 133 }
dudmuck 1:d95d135a4fb4 134 }
dudmuck 1:d95d135a4fb4 135
dudmuck 1:d95d135a4fb4 136 for (i = 0; menu_items[i].cmd != NULL ; i++) {
dudmuck 1:d95d135a4fb4 137 int mi_len = strlen(menu_items[i].cmd);
dudmuck 1:d95d135a4fb4 138
dudmuck 1:d95d135a4fb4 139 if (menu_items[i].handler && user_cmd_len == mi_len && (strncmp(pcbuf, menu_items[i].cmd, mi_len) == 0)) {
dudmuck 1:d95d135a4fb4 140 while (pcbuf[mi_len] == ' ') // skip past spaces
dudmuck 1:d95d135a4fb4 141 mi_len++;
dudmuck 1:d95d135a4fb4 142 menu_items[i].handler(mi_len);
dudmuck 1:d95d135a4fb4 143 break;
dudmuck 1:d95d135a4fb4 144 }
dudmuck 1:d95d135a4fb4 145 }
dudmuck 1:d95d135a4fb4 146
dudmuck 1:d95d135a4fb4 147 pcbuf_len = 0;
dudmuck 1:d95d135a4fb4 148 printf("> ");
dudmuck 1:d95d135a4fb4 149 fflush(stdout);
dudmuck 1:d95d135a4fb4 150 }