May 2021 Commit
Dependencies: sx128x sx12xx_hal
main.cpp@9:28f69b9b6a4c, 2019-11-28 (annotated)
- 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?
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 | 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 | } |