Alarm generator, transmitter side

Dependencies:   sx12xx_hal

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
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.

This is transmitter project; Receiver side is Alarm Slave project.
This project generates alarm (transmits) from grounding certain pins.
To find the actual pins used, refer to the code where pin[A-D] is declared as DigitalIn.

Alarm message is sent N times with future timestamp indicating when alarm is to occur. This accommodates dropped packets, resulting in alarm occurring when as few as 1 packet is received.

Committer:
Wayne Roberts
Date:
Wed Jul 18 18:52:35 2018 -0700
Revision:
7:ccb3088ce5be
Parent:
6:59ba1113b3c6
use sx12xx_hal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 7:ccb3088ce5be 1 //#include "user_platform.h"
Wayne Roberts 7:ccb3088ce5be 2 #include "radio.h"
Wayne Roberts 7:ccb3088ce5be 3
Wayne Roberts 7:ccb3088ce5be 4 #if defined(SX127x_H) || defined(SX126x_H)
Wayne Roberts 7:ccb3088ce5be 5 #define BW_KHZ 500
Wayne Roberts 7:ccb3088ce5be 6 #define SPREADING_FACTOR 11
Wayne Roberts 7:ccb3088ce5be 7 #define CF_HZ 910800000
Wayne Roberts 7:ccb3088ce5be 8 #if defined(SX126x_H)
Wayne Roberts 7:ccb3088ce5be 9 #define TX_DBM (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14)
Wayne Roberts 7:ccb3088ce5be 10 #else
Wayne Roberts 7:ccb3088ce5be 11 #define TX_DBM 17
Wayne Roberts 7:ccb3088ce5be 12 #endif
Wayne Roberts 7:ccb3088ce5be 13 #elif defined(SX128x_H)
Wayne Roberts 7:ccb3088ce5be 14 #define BW_KHZ 200
Wayne Roberts 7:ccb3088ce5be 15 #define SPREADING_FACTOR 11
Wayne Roberts 7:ccb3088ce5be 16 #define CF_HZ 2487000000
Wayne Roberts 7:ccb3088ce5be 17
Wayne Roberts 7:ccb3088ce5be 18 #define TX_DBM 5
Wayne Roberts 7:ccb3088ce5be 19 #endif
Wayne Roberts 7:ccb3088ce5be 20
Wayne Roberts 7:ccb3088ce5be 21 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 7:ccb3088ce5be 22 DigitalIn pinA(PB_12);
Wayne Roberts 7:ccb3088ce5be 23 DigitalIn pinB(PB_13);
Wayne Roberts 7:ccb3088ce5be 24 DigitalIn pinC(PB_14);
Wayne Roberts 7:ccb3088ce5be 25 DigitalIn pinD(PB_15);
Wayne Roberts 7:ccb3088ce5be 26 #elif defined(TARGET_FF_MORPHO)
Wayne Roberts 7:ccb3088ce5be 27 DigitalIn pinA(PC_3);
Wayne Roberts 7:ccb3088ce5be 28 DigitalIn pinB(PC_2);
Wayne Roberts 7:ccb3088ce5be 29 DigitalIn pinC(PC_6);
Wayne Roberts 7:ccb3088ce5be 30 DigitalIn pinD(PC_8);
Wayne Roberts 7:ccb3088ce5be 31 #endif
Wayne Roberts 7:ccb3088ce5be 32
Wayne Roberts 7:ccb3088ce5be 33 volatile struct _f_ {
Wayne Roberts 7:ccb3088ce5be 34 uint8_t enable_pin_A : 1;
Wayne Roberts 7:ccb3088ce5be 35 uint8_t enable_pin_B : 1;
Wayne Roberts 7:ccb3088ce5be 36 uint8_t enable_pin_C : 1;
Wayne Roberts 7:ccb3088ce5be 37 uint8_t enable_pin_D : 1;
Wayne Roberts 7:ccb3088ce5be 38 } flags;
dudmuck 0:cb38da4f4b04 39
dudmuck 0:cb38da4f4b04 40 Timer t;
dudmuck 3:d8b57eca8c45 41 #define CMD_PINA 0x02
dudmuck 3:d8b57eca8c45 42 #define CMD_PINB 0x03
dudmuck 3:d8b57eca8c45 43 #define CMD_PINC 0x06
dudmuck 3:d8b57eca8c45 44 #define CMD_PIND 0x08
dudmuck 0:cb38da4f4b04 45
Wayne Roberts 7:ccb3088ce5be 46 volatile bool tx_done;
Wayne Roberts 7:ccb3088ce5be 47
dudmuck 0:cb38da4f4b04 48 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
dudmuck 0:cb38da4f4b04 49 {
dudmuck 0:cb38da4f4b04 50 // The CRC calculation follows CCITT
dudmuck 0:cb38da4f4b04 51 const uint16_t polynom = 0x1021;
dudmuck 0:cb38da4f4b04 52 // CRC initial value
dudmuck 0:cb38da4f4b04 53 uint16_t crc = 0x0000;
dudmuck 0:cb38da4f4b04 54
dudmuck 0:cb38da4f4b04 55 if( buffer == NULL )
dudmuck 0:cb38da4f4b04 56 {
dudmuck 0:cb38da4f4b04 57 return 0;
dudmuck 0:cb38da4f4b04 58 }
dudmuck 0:cb38da4f4b04 59
dudmuck 0:cb38da4f4b04 60 for( uint16_t i = 0; i < length; ++i )
dudmuck 0:cb38da4f4b04 61 {
dudmuck 0:cb38da4f4b04 62 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:cb38da4f4b04 63 for( uint16_t j = 0; j < 8; ++j )
dudmuck 0:cb38da4f4b04 64 {
dudmuck 0:cb38da4f4b04 65 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:cb38da4f4b04 66 }
dudmuck 0:cb38da4f4b04 67 }
dudmuck 0:cb38da4f4b04 68
dudmuck 0:cb38da4f4b04 69 return crc;
dudmuck 0:cb38da4f4b04 70 }
dudmuck 0:cb38da4f4b04 71
dudmuck 1:3199506bc2e5 72 void transmit(unsigned target, uint8_t cmd)
dudmuck 0:cb38da4f4b04 73 {
dudmuck 0:cb38da4f4b04 74 unsigned t_diff;
dudmuck 0:cb38da4f4b04 75 uint16_t crc;
dudmuck 0:cb38da4f4b04 76
Wayne Roberts 7:ccb3088ce5be 77 Radio::radio.tx_buf[0] = cmd;
dudmuck 0:cb38da4f4b04 78 t_diff = target - t.read_us();
Wayne Roberts 7:ccb3088ce5be 79 Radio::radio.tx_buf[1] = t_diff >> 24;
Wayne Roberts 7:ccb3088ce5be 80 Radio::radio.tx_buf[2] = t_diff >> 16;
Wayne Roberts 7:ccb3088ce5be 81 Radio::radio.tx_buf[3] = t_diff >> 8;
Wayne Roberts 7:ccb3088ce5be 82 Radio::radio.tx_buf[4] = t_diff & 0xff;
Wayne Roberts 7:ccb3088ce5be 83 crc = crc_ccitt(Radio::radio.tx_buf, 5);
Wayne Roberts 7:ccb3088ce5be 84 Radio::radio.tx_buf[5] = crc >> 8;
Wayne Roberts 7:ccb3088ce5be 85 Radio::radio.tx_buf[6] = crc & 0xff;
dudmuck 0:cb38da4f4b04 86
Wayne Roberts 7:ccb3088ce5be 87 Radio::Send(7, 0, 0, 0);
dudmuck 0:cb38da4f4b04 88
Wayne Roberts 7:ccb3088ce5be 89 for (tx_done = false; !tx_done; )
Wayne Roberts 7:ccb3088ce5be 90 Radio::service();
dudmuck 0:cb38da4f4b04 91
dudmuck 0:cb38da4f4b04 92 printf("t_diff:%u crc:%04x\r\n", t_diff, crc);
dudmuck 0:cb38da4f4b04 93 }
dudmuck 0:cb38da4f4b04 94
dudmuck 0:cb38da4f4b04 95 #define TARGET_LATENCY 2000000
dudmuck 1:3199506bc2e5 96 void send_alarm(uint8_t cmd)
dudmuck 0:cb38da4f4b04 97 {
dudmuck 0:cb38da4f4b04 98 int i;
dudmuck 0:cb38da4f4b04 99 unsigned target = t.read_us() + TARGET_LATENCY;
dudmuck 0:cb38da4f4b04 100 printf("send_alarm() %u\n", target);
dudmuck 0:cb38da4f4b04 101
dudmuck 1:3199506bc2e5 102 for (i = 0; i < 5; i++) {
dudmuck 1:3199506bc2e5 103 transmit(target, cmd);
dudmuck 0:cb38da4f4b04 104 wait(0.1);
dudmuck 0:cb38da4f4b04 105 }
dudmuck 0:cb38da4f4b04 106 }
dudmuck 1:3199506bc2e5 107
dudmuck 1:3199506bc2e5 108 void debounce(DigitalIn* pin, uint8_t cmd)
dudmuck 1:3199506bc2e5 109 {
dudmuck 1:3199506bc2e5 110 if (!pin->read()) {
dudmuck 1:3199506bc2e5 111 int i;
dudmuck 1:3199506bc2e5 112 for (i = 0; i < 5; i++) {
dudmuck 1:3199506bc2e5 113 wait(0.01);
dudmuck 1:3199506bc2e5 114 if (pin->read()) {
dudmuck 1:3199506bc2e5 115 printf("trans\r\n");
dudmuck 1:3199506bc2e5 116 break;
dudmuck 1:3199506bc2e5 117 }
dudmuck 1:3199506bc2e5 118 }
dudmuck 1:3199506bc2e5 119 if (i == 5)
dudmuck 1:3199506bc2e5 120 send_alarm(cmd);
dudmuck 1:3199506bc2e5 121
dudmuck 1:3199506bc2e5 122 while (!pin->read())
dudmuck 1:3199506bc2e5 123 ;
dudmuck 1:3199506bc2e5 124 }
dudmuck 1:3199506bc2e5 125 }
dudmuck 2:0b7620bda2c9 126
Wayne Roberts 7:ccb3088ce5be 127 void txDoneCB()
Wayne Roberts 7:ccb3088ce5be 128 {
Wayne Roberts 7:ccb3088ce5be 129 tx_done = true;
Wayne Roberts 7:ccb3088ce5be 130 }
Wayne Roberts 7:ccb3088ce5be 131
Wayne Roberts 7:ccb3088ce5be 132 void rxDoneCB(uint8_t size, float Rssi, float Snr)
dudmuck 4:19056d9707ef 133 {
dudmuck 4:19056d9707ef 134 }
dudmuck 4:19056d9707ef 135
Wayne Roberts 7:ccb3088ce5be 136 const RadioEvents_t rev = {
Wayne Roberts 7:ccb3088ce5be 137 /* Dio0_top_half */ NULL,
Wayne Roberts 7:ccb3088ce5be 138 /* TxDone_topHalf */ NULL,
Wayne Roberts 7:ccb3088ce5be 139 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 7:ccb3088ce5be 140 /* TxTimeout */ NULL,
Wayne Roberts 7:ccb3088ce5be 141 /* RxDone */ rxDoneCB,
Wayne Roberts 7:ccb3088ce5be 142 /* RxTimeout */ NULL,
Wayne Roberts 7:ccb3088ce5be 143 /* RxError */ NULL,
Wayne Roberts 7:ccb3088ce5be 144 /* FhssChangeChannel */NULL,
Wayne Roberts 7:ccb3088ce5be 145 /* CadDone */ NULL
Wayne Roberts 7:ccb3088ce5be 146 };
Wayne Roberts 7:ccb3088ce5be 147
dudmuck 0:cb38da4f4b04 148 int main()
dudmuck 0:cb38da4f4b04 149 {
dudmuck 0:cb38da4f4b04 150 printf("\r\nreset-tx\r\n");
dudmuck 1:3199506bc2e5 151
dudmuck 3:d8b57eca8c45 152 pinA.mode(PullUp);
dudmuck 3:d8b57eca8c45 153 pinB.mode(PullUp);
dudmuck 3:d8b57eca8c45 154 pinC.mode(PullUp);
dudmuck 3:d8b57eca8c45 155 pinD.mode(PullUp);
dudmuck 1:3199506bc2e5 156
Wayne Roberts 7:ccb3088ce5be 157 wait(0.05);
Wayne Roberts 7:ccb3088ce5be 158
Wayne Roberts 7:ccb3088ce5be 159 if (pinA.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 160 printf("pinA-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 161 flags.enable_pin_A = 0;
Wayne Roberts 7:ccb3088ce5be 162 } else
Wayne Roberts 7:ccb3088ce5be 163 flags.enable_pin_A = 1;
Wayne Roberts 7:ccb3088ce5be 164
Wayne Roberts 7:ccb3088ce5be 165 if (pinB.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 166 printf("pinB-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 167 flags.enable_pin_B = 0;
Wayne Roberts 7:ccb3088ce5be 168 } else
Wayne Roberts 7:ccb3088ce5be 169 flags.enable_pin_B = 1;
Wayne Roberts 7:ccb3088ce5be 170
Wayne Roberts 7:ccb3088ce5be 171 if (pinC.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 172 printf("pinC-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 173 flags.enable_pin_C = 0;
Wayne Roberts 7:ccb3088ce5be 174 } else
Wayne Roberts 7:ccb3088ce5be 175 flags.enable_pin_C = 1;
Wayne Roberts 7:ccb3088ce5be 176
Wayne Roberts 7:ccb3088ce5be 177 if (pinD.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 178 printf("pinD-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 179 flags.enable_pin_D = 0;
Wayne Roberts 7:ccb3088ce5be 180 } else
Wayne Roberts 7:ccb3088ce5be 181 flags.enable_pin_D = 1;
Wayne Roberts 7:ccb3088ce5be 182
Wayne Roberts 7:ccb3088ce5be 183 t.start();
Wayne Roberts 7:ccb3088ce5be 184
Wayne Roberts 7:ccb3088ce5be 185 Radio::Init(&rev);
Wayne Roberts 7:ccb3088ce5be 186
Wayne Roberts 7:ccb3088ce5be 187 Radio::Standby();
Wayne Roberts 7:ccb3088ce5be 188 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 7:ccb3088ce5be 189 Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 7:ccb3088ce5be 190 Radio::SetChannel(CF_HZ);
Wayne Roberts 7:ccb3088ce5be 191
Wayne Roberts 7:ccb3088ce5be 192 Radio::set_tx_dbm(TX_DBM);
dudmuck 0:cb38da4f4b04 193
dudmuck 0:cb38da4f4b04 194 for (;;) {
Wayne Roberts 7:ccb3088ce5be 195 if (flags.enable_pin_A)
Wayne Roberts 7:ccb3088ce5be 196 debounce(&pinA, CMD_PINA);
Wayne Roberts 7:ccb3088ce5be 197
Wayne Roberts 7:ccb3088ce5be 198 if (flags.enable_pin_B)
Wayne Roberts 7:ccb3088ce5be 199 debounce(&pinB, CMD_PINB);
Wayne Roberts 7:ccb3088ce5be 200
Wayne Roberts 7:ccb3088ce5be 201 if (flags.enable_pin_C)
Wayne Roberts 7:ccb3088ce5be 202 debounce(&pinC, CMD_PINC);
Wayne Roberts 7:ccb3088ce5be 203
Wayne Roberts 7:ccb3088ce5be 204 if (flags.enable_pin_D)
Wayne Roberts 7:ccb3088ce5be 205 debounce(&pinD, CMD_PIND);
dudmuck 0:cb38da4f4b04 206 } // ..for (;;)
dudmuck 0:cb38da4f4b04 207 }