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:
Mon Feb 12 17:23:14 2018 -0800
Revision:
6:59ba1113b3c6
Parent:
5:1652e04809fb
Child:
7:ccb3088ce5be
MOTE_L152RC set pd2 high

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 6:59ba1113b3c6 1 #include "user_platform.h"
dudmuck 0:cb38da4f4b04 2
dudmuck 3:d8b57eca8c45 3 SX127x_lora lora(radio);
dudmuck 0:cb38da4f4b04 4 Timer t;
dudmuck 3:d8b57eca8c45 5 #define CMD_PINA 0x02
dudmuck 3:d8b57eca8c45 6 #define CMD_PINB 0x03
dudmuck 3:d8b57eca8c45 7 #define CMD_PINC 0x06
dudmuck 3:d8b57eca8c45 8 #define CMD_PIND 0x08
dudmuck 0:cb38da4f4b04 9
dudmuck 0:cb38da4f4b04 10 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
dudmuck 0:cb38da4f4b04 11 {
dudmuck 0:cb38da4f4b04 12 // The CRC calculation follows CCITT
dudmuck 0:cb38da4f4b04 13 const uint16_t polynom = 0x1021;
dudmuck 0:cb38da4f4b04 14 // CRC initial value
dudmuck 0:cb38da4f4b04 15 uint16_t crc = 0x0000;
dudmuck 0:cb38da4f4b04 16
dudmuck 0:cb38da4f4b04 17 if( buffer == NULL )
dudmuck 0:cb38da4f4b04 18 {
dudmuck 0:cb38da4f4b04 19 return 0;
dudmuck 0:cb38da4f4b04 20 }
dudmuck 0:cb38da4f4b04 21
dudmuck 0:cb38da4f4b04 22 for( uint16_t i = 0; i < length; ++i )
dudmuck 0:cb38da4f4b04 23 {
dudmuck 0:cb38da4f4b04 24 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:cb38da4f4b04 25 for( uint16_t j = 0; j < 8; ++j )
dudmuck 0:cb38da4f4b04 26 {
dudmuck 0:cb38da4f4b04 27 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:cb38da4f4b04 28 }
dudmuck 0:cb38da4f4b04 29 }
dudmuck 0:cb38da4f4b04 30
dudmuck 0:cb38da4f4b04 31 return crc;
dudmuck 0:cb38da4f4b04 32 }
dudmuck 0:cb38da4f4b04 33
dudmuck 1:3199506bc2e5 34 void transmit(unsigned target, uint8_t cmd)
dudmuck 0:cb38da4f4b04 35 {
dudmuck 0:cb38da4f4b04 36 unsigned t_diff;
dudmuck 0:cb38da4f4b04 37 uint16_t crc;
dudmuck 0:cb38da4f4b04 38
dudmuck 1:3199506bc2e5 39 radio.tx_buf[0] = cmd;
dudmuck 0:cb38da4f4b04 40 t_diff = target - t.read_us();
dudmuck 0:cb38da4f4b04 41 radio.tx_buf[1] = t_diff >> 24;
dudmuck 0:cb38da4f4b04 42 radio.tx_buf[2] = t_diff >> 16;
dudmuck 0:cb38da4f4b04 43 radio.tx_buf[3] = t_diff >> 8;
dudmuck 0:cb38da4f4b04 44 radio.tx_buf[4] = t_diff & 0xff;
dudmuck 0:cb38da4f4b04 45 crc = crc_ccitt(radio.tx_buf, 5);
dudmuck 0:cb38da4f4b04 46 radio.tx_buf[5] = crc >> 8;
dudmuck 0:cb38da4f4b04 47 radio.tx_buf[6] = crc & 0xff;
dudmuck 0:cb38da4f4b04 48
dudmuck 0:cb38da4f4b04 49
dudmuck 0:cb38da4f4b04 50 lora.start_tx(lora.RegPayloadLength); /* begin transmission */
dudmuck 0:cb38da4f4b04 51
dudmuck 1:3199506bc2e5 52 while (lora.service() != SERVICE_TX_DONE) { /* wait for transmission to complete */
dudmuck 1:3199506bc2e5 53 }
dudmuck 0:cb38da4f4b04 54
dudmuck 0:cb38da4f4b04 55 printf("t_diff:%u crc:%04x\r\n", t_diff, crc);
dudmuck 0:cb38da4f4b04 56 }
dudmuck 0:cb38da4f4b04 57
dudmuck 0:cb38da4f4b04 58 #define TARGET_LATENCY 2000000
dudmuck 1:3199506bc2e5 59 void send_alarm(uint8_t cmd)
dudmuck 0:cb38da4f4b04 60 {
dudmuck 0:cb38da4f4b04 61 int i;
dudmuck 0:cb38da4f4b04 62 unsigned target = t.read_us() + TARGET_LATENCY;
dudmuck 0:cb38da4f4b04 63 printf("send_alarm() %u\n", target);
dudmuck 0:cb38da4f4b04 64
dudmuck 1:3199506bc2e5 65 for (i = 0; i < 5; i++) {
dudmuck 1:3199506bc2e5 66 transmit(target, cmd);
dudmuck 0:cb38da4f4b04 67 wait(0.1);
dudmuck 0:cb38da4f4b04 68 }
dudmuck 0:cb38da4f4b04 69 }
dudmuck 1:3199506bc2e5 70
dudmuck 1:3199506bc2e5 71 void debounce(DigitalIn* pin, uint8_t cmd)
dudmuck 1:3199506bc2e5 72 {
dudmuck 1:3199506bc2e5 73 if (!pin->read()) {
dudmuck 1:3199506bc2e5 74 int i;
dudmuck 1:3199506bc2e5 75 for (i = 0; i < 5; i++) {
dudmuck 1:3199506bc2e5 76 wait(0.01);
dudmuck 1:3199506bc2e5 77 if (pin->read()) {
dudmuck 1:3199506bc2e5 78 printf("trans\r\n");
dudmuck 1:3199506bc2e5 79 break;
dudmuck 1:3199506bc2e5 80 }
dudmuck 1:3199506bc2e5 81 }
dudmuck 1:3199506bc2e5 82 if (i == 5)
dudmuck 1:3199506bc2e5 83 send_alarm(cmd);
dudmuck 1:3199506bc2e5 84
dudmuck 1:3199506bc2e5 85 while (!pin->read())
dudmuck 1:3199506bc2e5 86 ;
dudmuck 1:3199506bc2e5 87 }
dudmuck 1:3199506bc2e5 88 }
dudmuck 2:0b7620bda2c9 89
dudmuck 4:19056d9707ef 90 void cmd_ocp(uint8_t ma)
dudmuck 4:19056d9707ef 91 {
dudmuck 4:19056d9707ef 92 if (ma < 130)
dudmuck 4:19056d9707ef 93 radio.RegOcp.bits.OcpTrim = (ma - 45) / 5;
dudmuck 4:19056d9707ef 94 else
dudmuck 4:19056d9707ef 95 radio.RegOcp.bits.OcpTrim = (ma + 30) / 10;
dudmuck 4:19056d9707ef 96 radio.write_reg(REG_OCP, radio.RegOcp.octet);
dudmuck 4:19056d9707ef 97
dudmuck 4:19056d9707ef 98 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 4:19056d9707ef 99 if (radio.RegOcp.bits.OcpTrim < 16)
dudmuck 4:19056d9707ef 100 ma = 45 + (5 * radio.RegOcp.bits.OcpTrim);
dudmuck 4:19056d9707ef 101 else if (radio.RegOcp.bits.OcpTrim < 28)
dudmuck 4:19056d9707ef 102 ma = (10 * radio.RegOcp.bits.OcpTrim) - 30;
dudmuck 4:19056d9707ef 103 else
dudmuck 4:19056d9707ef 104 ma = 240;
dudmuck 4:19056d9707ef 105 printf("Ocp: %dmA\r\n", ma);
dudmuck 4:19056d9707ef 106 }
dudmuck 4:19056d9707ef 107
dudmuck 0:cb38da4f4b04 108 int main()
dudmuck 0:cb38da4f4b04 109 {
dudmuck 0:cb38da4f4b04 110 printf("\r\nreset-tx\r\n");
dudmuck 0:cb38da4f4b04 111 t.start();
dudmuck 1:3199506bc2e5 112
dudmuck 3:d8b57eca8c45 113 pinA.mode(PullUp);
dudmuck 3:d8b57eca8c45 114 pinB.mode(PullUp);
dudmuck 3:d8b57eca8c45 115 pinC.mode(PullUp);
dudmuck 3:d8b57eca8c45 116 pinD.mode(PullUp);
dudmuck 1:3199506bc2e5 117
dudmuck 0:cb38da4f4b04 118 radio.rf_switch = rfsw_callback;
dudmuck 0:cb38da4f4b04 119
dudmuck 0:cb38da4f4b04 120 radio.set_frf_MHz(910.8);
dudmuck 0:cb38da4f4b04 121 lora.enable();
dudmuck 0:cb38da4f4b04 122 lora.setBw_KHz(500);
dudmuck 0:cb38da4f4b04 123 lora.setSf(11);
dudmuck 0:cb38da4f4b04 124
Wayne Roberts 5:1652e04809fb 125 board_init();
dudmuck 0:cb38da4f4b04 126
dudmuck 0:cb38da4f4b04 127 /* constant payload length */
dudmuck 0:cb38da4f4b04 128 lora.RegPayloadLength = 7;
dudmuck 0:cb38da4f4b04 129 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 4:19056d9707ef 130
dudmuck 4:19056d9707ef 131 /* lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 4:19056d9707ef 132 lora.RegModemConfig2.sx1276bits.TxContinuousMode = 1;
dudmuck 4:19056d9707ef 133 radio.write_reg(REG_LR_MODEMCONFIG2, lora.RegModemConfig2.octet);
dudmuck 4:19056d9707ef 134 */
dudmuck 0:cb38da4f4b04 135 for (;;) {
dudmuck 3:d8b57eca8c45 136 debounce(&pinA, CMD_PINA);
dudmuck 3:d8b57eca8c45 137 debounce(&pinB, CMD_PINB);
dudmuck 3:d8b57eca8c45 138 debounce(&pinC, CMD_PINC);
dudmuck 3:d8b57eca8c45 139 debounce(&pinD, CMD_PIND);
dudmuck 0:cb38da4f4b04 140 } // ..for (;;)
dudmuck 0:cb38da4f4b04 141 }