May 2021 Commit
Dependencies: sx128x sx12xx_hal
main.cpp@10:e262a92550c6, 2019-11-28 (annotated)
- Committer:
- fengineering
- Date:
- Thu Nov 28 06:08:53 2019 +0000
- Revision:
- 10:e262a92550c6
- Parent:
- 9:28f69b9b6a4c
minor update removes unnecessary timed callback
Who changed what in which revision?
User | Revision | Line number | New 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 | } |