May 2021 Commit

Dependencies:   sx128x sx12xx_hal

Committer:
lightshow
Date:
Sun May 09 19:28:51 2021 +0000
Revision:
11:cb574782844e
Parent:
10:e262a92550c6
May 2021 Commit

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 10:e262a92550c6 164
fengineering 10:e262a92550c6 165 queue.call(manual_transmission_queue_callback);
fengineering 9:28f69b9b6a4c 166 }
fengineering 10:e262a92550c6 167
fengineering 9:28f69b9b6a4c 168
fengineering 9:28f69b9b6a4c 169
dudmuck 0:cb38da4f4b04 170 int main()
dudmuck 0:cb38da4f4b04 171 {
fengineering 9:28f69b9b6a4c 172
fengineering 9:28f69b9b6a4c 173
grit 8:efd5ceb87878 174 mbed_trace_mutex_wait_function_set( serial_out_mutex_wait );
grit 8:efd5ceb87878 175 mbed_trace_mutex_release_function_set( serial_out_mutex_release );
grit 8:efd5ceb87878 176 mbed_trace_init();
grit 8:efd5ceb87878 177 tr_debug(__FUNCTION__);
fengineering 9:28f69b9b6a4c 178 tr_debug("Program Entry");
fengineering 9:28f69b9b6a4c 179
fengineering 9:28f69b9b6a4c 180 thread.start(callback(&queue, &EventQueue::dispatch_forever));
fengineering 9:28f69b9b6a4c 181 UserButtonPB2.rise(&manual_transmission);
dudmuck 1:3199506bc2e5 182
Wayne Roberts 7:ccb3088ce5be 183 wait(0.05);
Wayne Roberts 7:ccb3088ce5be 184 t.start();
Wayne Roberts 7:ccb3088ce5be 185
Wayne Roberts 7:ccb3088ce5be 186 Radio::Init(&rev);
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 Radio::set_tx_dbm(TX_DBM);
Wayne Roberts 7:ccb3088ce5be 192
grit 8:efd5ceb87878 193 tr_debug("Initializing Command Line");
grit 8:efd5ceb87878 194 cmd_init(0);
grit 8:efd5ceb87878 195 cmd_mutex_wait_func( serial_out_mutex_wait );
grit 8:efd5ceb87878 196 cmd_mutex_release_func( serial_out_mutex_release );
grit 8:efd5ceb87878 197 cmd_add("transmit-byte", cmd_transmitByte,"Transmit Byte","Transmit a decimal byte over LoRa radio");
fengineering 9:28f69b9b6a4c 198
fengineering 9:28f69b9b6a4c 199
grit 8:efd5ceb87878 200 while(true)
grit 8:efd5ceb87878 201 {
fengineering 9:28f69b9b6a4c 202
grit 8:efd5ceb87878 203 int c = getchar();
grit 8:efd5ceb87878 204 if (c != EOF)
grit 8:efd5ceb87878 205 {
grit 8:efd5ceb87878 206 cmd_char_input(c);
grit 8:efd5ceb87878 207 }
grit 8:efd5ceb87878 208 }
dudmuck 0:cb38da4f4b04 209 }