May 2021 Commit

Dependencies:   sx128x sx12xx_hal

Committer:
fengineering
Date:
Thu Nov 28 05:54:24 2019 +0000
Revision:
9:28f69b9b6a4c
Parent:
8:efd5ceb87878
Child:
10:e262a92550c6
In this version, user can transmit command via either the command line interface or through input pins and blue push button to send

Who changed what in which revision?

UserRevisionLine numberNew contents of line
grit 8:efd5ceb87878 1 #include "mbed.h"
Wayne Roberts 7:ccb3088ce5be 2 #include "radio.h"
Wayne Roberts 7:ccb3088ce5be 3
grit 8:efd5ceb87878 4 #include "mbed-client-cli/ns_cmdline.h"
grit 8:efd5ceb87878 5 #include "mbed-trace/mbed_trace.h"
grit 8:efd5ceb87878 6 #define TRACE_GROUP "mast"
grit 8:efd5ceb87878 7
Wayne Roberts 7:ccb3088ce5be 8 #if defined(SX127x_H) || defined(SX126x_H)
Wayne Roberts 7:ccb3088ce5be 9 #define BW_KHZ 500
Wayne Roberts 7:ccb3088ce5be 10 #define SPREADING_FACTOR 11
Wayne Roberts 7:ccb3088ce5be 11 #define CF_HZ 910800000
Wayne Roberts 7:ccb3088ce5be 12 #if defined(SX126x_H)
Wayne Roberts 7:ccb3088ce5be 13 #define TX_DBM (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14)
Wayne Roberts 7:ccb3088ce5be 14 #else
Wayne Roberts 7:ccb3088ce5be 15 #define TX_DBM 17
Wayne Roberts 7:ccb3088ce5be 16 #endif
Wayne Roberts 7:ccb3088ce5be 17 #elif defined(SX128x_H)
Wayne Roberts 7:ccb3088ce5be 18 #define BW_KHZ 200
Wayne Roberts 7:ccb3088ce5be 19 #define SPREADING_FACTOR 11
Wayne Roberts 7:ccb3088ce5be 20 #define CF_HZ 2487000000
Wayne Roberts 7:ccb3088ce5be 21
Wayne Roberts 7:ccb3088ce5be 22 #define TX_DBM 5
Wayne Roberts 7:ccb3088ce5be 23 #endif
dudmuck 0:cb38da4f4b04 24
dudmuck 0:cb38da4f4b04 25 Timer t;
fengineering 9:28f69b9b6a4c 26 InterruptIn UserButtonPB2(PB_2);
fengineering 9:28f69b9b6a4c 27 DigitalIn b[8] = {PB_5,PB_6,PB_8,PB_9,PB_12,PB_13,PB_14,PB_15};
fengineering 9:28f69b9b6a4c 28 Thread thread;
fengineering 9:28f69b9b6a4c 29 // Create a queue that can hold a maximum of 32 events
fengineering 9:28f69b9b6a4c 30 EventQueue queue(32 * EVENTS_EVENT_SIZE);
fengineering 9:28f69b9b6a4c 31
fengineering 9:28f69b9b6a4c 32
Wayne Roberts 7:ccb3088ce5be 33 volatile bool tx_done;
fengineering 9:28f69b9b6a4c 34 uint8_t sendCommandFlag = 0;
Wayne Roberts 7:ccb3088ce5be 35
dudmuck 0:cb38da4f4b04 36 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
dudmuck 0:cb38da4f4b04 37 {
grit 8:efd5ceb87878 38 tr_debug(__func__);
grit 8:efd5ceb87878 39 const uint16_t polynom = 0x1021; // The CRC calculation follows CCITT
grit 8:efd5ceb87878 40 uint16_t crc = 0x0000; // CRC initial value
dudmuck 0:cb38da4f4b04 41
grit 8:efd5ceb87878 42 if( buffer == NULL ) return 0;
dudmuck 0:cb38da4f4b04 43
dudmuck 0:cb38da4f4b04 44 for( uint16_t i = 0; i < length; ++i )
dudmuck 0:cb38da4f4b04 45 {
dudmuck 0:cb38da4f4b04 46 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:cb38da4f4b04 47 for( uint16_t j = 0; j < 8; ++j )
dudmuck 0:cb38da4f4b04 48 {
dudmuck 0:cb38da4f4b04 49 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:cb38da4f4b04 50 }
dudmuck 0:cb38da4f4b04 51 }
dudmuck 0:cb38da4f4b04 52 return crc;
dudmuck 0:cb38da4f4b04 53 }
dudmuck 0:cb38da4f4b04 54
dudmuck 1:3199506bc2e5 55 void transmit(unsigned target, uint8_t cmd)
dudmuck 0:cb38da4f4b04 56 {
grit 8:efd5ceb87878 57 tr_debug(__func__);
dudmuck 0:cb38da4f4b04 58 unsigned t_diff;
dudmuck 0:cb38da4f4b04 59 uint16_t crc;
dudmuck 0:cb38da4f4b04 60
Wayne Roberts 7:ccb3088ce5be 61 Radio::radio.tx_buf[0] = cmd;
dudmuck 0:cb38da4f4b04 62 t_diff = target - t.read_us();
Wayne Roberts 7:ccb3088ce5be 63 Radio::radio.tx_buf[1] = t_diff >> 24;
Wayne Roberts 7:ccb3088ce5be 64 Radio::radio.tx_buf[2] = t_diff >> 16;
Wayne Roberts 7:ccb3088ce5be 65 Radio::radio.tx_buf[3] = t_diff >> 8;
Wayne Roberts 7:ccb3088ce5be 66 Radio::radio.tx_buf[4] = t_diff & 0xff;
Wayne Roberts 7:ccb3088ce5be 67 crc = crc_ccitt(Radio::radio.tx_buf, 5);
Wayne Roberts 7:ccb3088ce5be 68 Radio::radio.tx_buf[5] = crc >> 8;
Wayne Roberts 7:ccb3088ce5be 69 Radio::radio.tx_buf[6] = crc & 0xff;
Wayne Roberts 7:ccb3088ce5be 70 Radio::Send(7, 0, 0, 0);
dudmuck 0:cb38da4f4b04 71
grit 8:efd5ceb87878 72 for (tx_done=false;!tx_done;)
grit 8:efd5ceb87878 73 {
Wayne Roberts 7:ccb3088ce5be 74 Radio::service();
grit 8:efd5ceb87878 75 }
grit 8:efd5ceb87878 76 tr_debug("t_diff:%u crc:%04x\r\n", t_diff, crc);
dudmuck 0:cb38da4f4b04 77 }
dudmuck 0:cb38da4f4b04 78
dudmuck 0:cb38da4f4b04 79 #define TARGET_LATENCY 2000000
grit 8:efd5ceb87878 80 static void send_alarm(uint8_t cmd)
dudmuck 0:cb38da4f4b04 81 {
grit 8:efd5ceb87878 82 tr_debug(__func__);
dudmuck 0:cb38da4f4b04 83 int i;
dudmuck 0:cb38da4f4b04 84 unsigned target = t.read_us() + TARGET_LATENCY;
grit 8:efd5ceb87878 85 tr_debug("send_alarm() %u\n", target);
dudmuck 0:cb38da4f4b04 86
grit 8:efd5ceb87878 87 for (i = 0; i < 5; i++)
grit 8:efd5ceb87878 88 {
dudmuck 1:3199506bc2e5 89 transmit(target, cmd);
dudmuck 0:cb38da4f4b04 90 wait(0.1);
dudmuck 0:cb38da4f4b04 91 }
dudmuck 0:cb38da4f4b04 92 }
dudmuck 1:3199506bc2e5 93
Wayne Roberts 7:ccb3088ce5be 94 void txDoneCB()
Wayne Roberts 7:ccb3088ce5be 95 {
Wayne Roberts 7:ccb3088ce5be 96 tx_done = true;
Wayne Roberts 7:ccb3088ce5be 97 }
Wayne Roberts 7:ccb3088ce5be 98
Wayne Roberts 7:ccb3088ce5be 99 void rxDoneCB(uint8_t size, float Rssi, float Snr)
dudmuck 4:19056d9707ef 100 {
dudmuck 4:19056d9707ef 101 }
dudmuck 4:19056d9707ef 102
grit 8:efd5ceb87878 103 const RadioEvents_t rev =
grit 8:efd5ceb87878 104 {
Wayne Roberts 7:ccb3088ce5be 105 /* Dio0_top_half */ NULL,
Wayne Roberts 7:ccb3088ce5be 106 /* TxDone_topHalf */ NULL,
Wayne Roberts 7:ccb3088ce5be 107 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 7:ccb3088ce5be 108 /* TxTimeout */ NULL,
Wayne Roberts 7:ccb3088ce5be 109 /* RxDone */ rxDoneCB,
Wayne Roberts 7:ccb3088ce5be 110 /* RxTimeout */ NULL,
Wayne Roberts 7:ccb3088ce5be 111 /* RxError */ NULL,
Wayne Roberts 7:ccb3088ce5be 112 /* FhssChangeChannel */NULL,
Wayne Roberts 7:ccb3088ce5be 113 /* CadDone */ NULL
Wayne Roberts 7:ccb3088ce5be 114 };
Wayne Roberts 7:ccb3088ce5be 115
grit 8:efd5ceb87878 116
grit 8:efd5ceb87878 117 static Mutex serialOutMutex;
grit 8:efd5ceb87878 118 static void serial_out_mutex_wait()
grit 8:efd5ceb87878 119 {
grit 8:efd5ceb87878 120 serialOutMutex.lock();
grit 8:efd5ceb87878 121 }
grit 8:efd5ceb87878 122
grit 8:efd5ceb87878 123 static void serial_out_mutex_release()
grit 8:efd5ceb87878 124 {
grit 8:efd5ceb87878 125 osStatus s = serialOutMutex.unlock();
grit 8:efd5ceb87878 126 MBED_ASSERT(s == osOK);
grit 8:efd5ceb87878 127 }
grit 8:efd5ceb87878 128
grit 8:efd5ceb87878 129 static int cmd_transmitByte(int argc, char *argv[])
grit 8:efd5ceb87878 130 {
grit 8:efd5ceb87878 131 tr_debug("%s args: %d",__FUNCTION__,argc);
grit 8:efd5ceb87878 132 if(argc != 2)
grit 8:efd5ceb87878 133 {
grit 8:efd5ceb87878 134 tr_debug("Invalid argument count");
grit 8:efd5ceb87878 135 return CMDLINE_RETCODE_INVALID_PARAMETERS;
grit 8:efd5ceb87878 136 }
grit 8:efd5ceb87878 137 uint8_t byte = atoi(argv[1]);
grit 8:efd5ceb87878 138 tr_debug("sending byte: %d",byte);
grit 8:efd5ceb87878 139 send_alarm(byte);
grit 8:efd5ceb87878 140 return CMDLINE_RETCODE_SUCCESS;
grit 8:efd5ceb87878 141 }
grit 8:efd5ceb87878 142
fengineering 9:28f69b9b6a4c 143 static void manual_transmission_queue_callback(void)
fengineering 9:28f69b9b6a4c 144 {
fengineering 9:28f69b9b6a4c 145 uint8_t byte = 0;
fengineering 9:28f69b9b6a4c 146 uint8_t value = 0;
fengineering 9:28f69b9b6a4c 147 tr_debug("Parallel Port Data Input");
fengineering 9:28f69b9b6a4c 148 for (int i = 0; i< 8; i++)
fengineering 9:28f69b9b6a4c 149 {
fengineering 9:28f69b9b6a4c 150 value = 0;
fengineering 9:28f69b9b6a4c 151 value = b[i].read();
fengineering 9:28f69b9b6a4c 152 //tr_debug("bit %d, value: %d",i,value);
fengineering 9:28f69b9b6a4c 153 value = value << i;
fengineering 9:28f69b9b6a4c 154 //tr_debug("value shifted: %d",value);
fengineering 9:28f69b9b6a4c 155 byte |= value;
fengineering 9:28f69b9b6a4c 156 //tr_debug("byte: %d",byte);
fengineering 9:28f69b9b6a4c 157 }
fengineering 9:28f69b9b6a4c 158 tr_debug("sending byte: %d",byte);
fengineering 9:28f69b9b6a4c 159 send_alarm(byte);
fengineering 9:28f69b9b6a4c 160 }
fengineering 9:28f69b9b6a4c 161
fengineering 9:28f69b9b6a4c 162 static void manual_transmission(void)
fengineering 9:28f69b9b6a4c 163 {
fengineering 9:28f69b9b6a4c 164 CriticalSectionLock::enable();
fengineering 9:28f69b9b6a4c 165 sendCommandFlag = 1;
fengineering 9:28f69b9b6a4c 166 CriticalSectionLock::disable();
fengineering 9:28f69b9b6a4c 167 }
fengineering 9:28f69b9b6a4c 168 static void interrupt_check_in(void)
fengineering 9:28f69b9b6a4c 169 {
fengineering 9:28f69b9b6a4c 170 if(sendCommandFlag)
fengineering 9:28f69b9b6a4c 171 {
fengineering 9:28f69b9b6a4c 172 queue.call(manual_transmission_queue_callback);
fengineering 9:28f69b9b6a4c 173 CriticalSectionLock::enable();
fengineering 9:28f69b9b6a4c 174 sendCommandFlag = 0;
fengineering 9:28f69b9b6a4c 175 CriticalSectionLock::disable();
fengineering 9:28f69b9b6a4c 176 }
fengineering 9:28f69b9b6a4c 177 }
fengineering 9:28f69b9b6a4c 178
fengineering 9:28f69b9b6a4c 179
dudmuck 0:cb38da4f4b04 180 int main()
dudmuck 0:cb38da4f4b04 181 {
fengineering 9:28f69b9b6a4c 182
fengineering 9:28f69b9b6a4c 183
grit 8:efd5ceb87878 184 mbed_trace_mutex_wait_function_set( serial_out_mutex_wait );
grit 8:efd5ceb87878 185 mbed_trace_mutex_release_function_set( serial_out_mutex_release );
grit 8:efd5ceb87878 186 mbed_trace_init();
grit 8:efd5ceb87878 187 tr_debug(__FUNCTION__);
fengineering 9:28f69b9b6a4c 188 tr_debug("Program Entry");
fengineering 9:28f69b9b6a4c 189
fengineering 9:28f69b9b6a4c 190 thread.start(callback(&queue, &EventQueue::dispatch_forever));
fengineering 9:28f69b9b6a4c 191 queue.call_every(100, interrupt_check_in);
fengineering 9:28f69b9b6a4c 192 UserButtonPB2.rise(&manual_transmission);
dudmuck 1:3199506bc2e5 193
Wayne Roberts 7:ccb3088ce5be 194 wait(0.05);
Wayne Roberts 7:ccb3088ce5be 195 t.start();
Wayne Roberts 7:ccb3088ce5be 196
Wayne Roberts 7:ccb3088ce5be 197 Radio::Init(&rev);
Wayne Roberts 7:ccb3088ce5be 198 Radio::Standby();
Wayne Roberts 7:ccb3088ce5be 199 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 7:ccb3088ce5be 200 Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 7:ccb3088ce5be 201 Radio::SetChannel(CF_HZ);
Wayne Roberts 7:ccb3088ce5be 202 Radio::set_tx_dbm(TX_DBM);
Wayne Roberts 7:ccb3088ce5be 203
grit 8:efd5ceb87878 204 tr_debug("Initializing Command Line");
grit 8:efd5ceb87878 205 cmd_init(0);
grit 8:efd5ceb87878 206 cmd_mutex_wait_func( serial_out_mutex_wait );
grit 8:efd5ceb87878 207 cmd_mutex_release_func( serial_out_mutex_release );
grit 8:efd5ceb87878 208 cmd_add("transmit-byte", cmd_transmitByte,"Transmit Byte","Transmit a decimal byte over LoRa radio");
fengineering 9:28f69b9b6a4c 209
fengineering 9:28f69b9b6a4c 210
grit 8:efd5ceb87878 211 while(true)
grit 8:efd5ceb87878 212 {
fengineering 9:28f69b9b6a4c 213
grit 8:efd5ceb87878 214 int c = getchar();
grit 8:efd5ceb87878 215 if (c != EOF)
grit 8:efd5ceb87878 216 {
grit 8:efd5ceb87878 217 cmd_char_input(c);
grit 8:efd5ceb87878 218 }
grit 8:efd5ceb87878 219 }
dudmuck 0:cb38da4f4b04 220 }