May 2021 Commit
Dependencies: sx128x sx12xx_hal
main.cpp@8:efd5ceb87878, 2019-08-19 (annotated)
- Committer:
- grit
- Date:
- Mon Aug 19 01:28:02 2019 +0000
- Revision:
- 8:efd5ceb87878
- Parent:
- 7:ccb3088ce5be
- Child:
- 9:28f69b9b6a4c
initial
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; |
Wayne Roberts |
7:ccb3088ce5be | 26 | volatile bool tx_done; |
Wayne Roberts |
7:ccb3088ce5be | 27 | |
dudmuck | 0:cb38da4f4b04 | 28 | static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length ) |
dudmuck | 0:cb38da4f4b04 | 29 | { |
grit | 8:efd5ceb87878 | 30 | tr_debug(__func__); |
grit | 8:efd5ceb87878 | 31 | const uint16_t polynom = 0x1021; // The CRC calculation follows CCITT |
grit | 8:efd5ceb87878 | 32 | uint16_t crc = 0x0000; // CRC initial value |
dudmuck | 0:cb38da4f4b04 | 33 | |
grit | 8:efd5ceb87878 | 34 | if( buffer == NULL ) return 0; |
dudmuck | 0:cb38da4f4b04 | 35 | |
dudmuck | 0:cb38da4f4b04 | 36 | for( uint16_t i = 0; i < length; ++i ) |
dudmuck | 0:cb38da4f4b04 | 37 | { |
dudmuck | 0:cb38da4f4b04 | 38 | crc ^= ( uint16_t ) buffer[i] << 8; |
dudmuck | 0:cb38da4f4b04 | 39 | for( uint16_t j = 0; j < 8; ++j ) |
dudmuck | 0:cb38da4f4b04 | 40 | { |
dudmuck | 0:cb38da4f4b04 | 41 | crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 ); |
dudmuck | 0:cb38da4f4b04 | 42 | } |
dudmuck | 0:cb38da4f4b04 | 43 | } |
dudmuck | 0:cb38da4f4b04 | 44 | return crc; |
dudmuck | 0:cb38da4f4b04 | 45 | } |
dudmuck | 0:cb38da4f4b04 | 46 | |
dudmuck | 1:3199506bc2e5 | 47 | void transmit(unsigned target, uint8_t cmd) |
dudmuck | 0:cb38da4f4b04 | 48 | { |
grit | 8:efd5ceb87878 | 49 | tr_debug(__func__); |
dudmuck | 0:cb38da4f4b04 | 50 | unsigned t_diff; |
dudmuck | 0:cb38da4f4b04 | 51 | uint16_t crc; |
dudmuck | 0:cb38da4f4b04 | 52 | |
Wayne Roberts |
7:ccb3088ce5be | 53 | Radio::radio.tx_buf[0] = cmd; |
dudmuck | 0:cb38da4f4b04 | 54 | t_diff = target - t.read_us(); |
Wayne Roberts |
7:ccb3088ce5be | 55 | Radio::radio.tx_buf[1] = t_diff >> 24; |
Wayne Roberts |
7:ccb3088ce5be | 56 | Radio::radio.tx_buf[2] = t_diff >> 16; |
Wayne Roberts |
7:ccb3088ce5be | 57 | Radio::radio.tx_buf[3] = t_diff >> 8; |
Wayne Roberts |
7:ccb3088ce5be | 58 | Radio::radio.tx_buf[4] = t_diff & 0xff; |
Wayne Roberts |
7:ccb3088ce5be | 59 | crc = crc_ccitt(Radio::radio.tx_buf, 5); |
Wayne Roberts |
7:ccb3088ce5be | 60 | Radio::radio.tx_buf[5] = crc >> 8; |
Wayne Roberts |
7:ccb3088ce5be | 61 | Radio::radio.tx_buf[6] = crc & 0xff; |
Wayne Roberts |
7:ccb3088ce5be | 62 | Radio::Send(7, 0, 0, 0); |
dudmuck | 0:cb38da4f4b04 | 63 | |
grit | 8:efd5ceb87878 | 64 | for (tx_done=false;!tx_done;) |
grit | 8:efd5ceb87878 | 65 | { |
Wayne Roberts |
7:ccb3088ce5be | 66 | Radio::service(); |
grit | 8:efd5ceb87878 | 67 | } |
grit | 8:efd5ceb87878 | 68 | tr_debug("t_diff:%u crc:%04x\r\n", t_diff, crc); |
dudmuck | 0:cb38da4f4b04 | 69 | } |
dudmuck | 0:cb38da4f4b04 | 70 | |
dudmuck | 0:cb38da4f4b04 | 71 | #define TARGET_LATENCY 2000000 |
grit | 8:efd5ceb87878 | 72 | static void send_alarm(uint8_t cmd) |
dudmuck | 0:cb38da4f4b04 | 73 | { |
grit | 8:efd5ceb87878 | 74 | tr_debug(__func__); |
dudmuck | 0:cb38da4f4b04 | 75 | int i; |
dudmuck | 0:cb38da4f4b04 | 76 | unsigned target = t.read_us() + TARGET_LATENCY; |
grit | 8:efd5ceb87878 | 77 | tr_debug("send_alarm() %u\n", target); |
dudmuck | 0:cb38da4f4b04 | 78 | |
grit | 8:efd5ceb87878 | 79 | for (i = 0; i < 5; i++) |
grit | 8:efd5ceb87878 | 80 | { |
dudmuck | 1:3199506bc2e5 | 81 | transmit(target, cmd); |
dudmuck | 0:cb38da4f4b04 | 82 | wait(0.1); |
dudmuck | 0:cb38da4f4b04 | 83 | } |
dudmuck | 0:cb38da4f4b04 | 84 | } |
dudmuck | 1:3199506bc2e5 | 85 | |
Wayne Roberts |
7:ccb3088ce5be | 86 | void txDoneCB() |
Wayne Roberts |
7:ccb3088ce5be | 87 | { |
Wayne Roberts |
7:ccb3088ce5be | 88 | tx_done = true; |
Wayne Roberts |
7:ccb3088ce5be | 89 | } |
Wayne Roberts |
7:ccb3088ce5be | 90 | |
Wayne Roberts |
7:ccb3088ce5be | 91 | void rxDoneCB(uint8_t size, float Rssi, float Snr) |
dudmuck | 4:19056d9707ef | 92 | { |
dudmuck | 4:19056d9707ef | 93 | } |
dudmuck | 4:19056d9707ef | 94 | |
grit | 8:efd5ceb87878 | 95 | const RadioEvents_t rev = |
grit | 8:efd5ceb87878 | 96 | { |
Wayne Roberts |
7:ccb3088ce5be | 97 | /* Dio0_top_half */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 98 | /* TxDone_topHalf */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 99 | /* TxDone_botHalf */ txDoneCB, |
Wayne Roberts |
7:ccb3088ce5be | 100 | /* TxTimeout */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 101 | /* RxDone */ rxDoneCB, |
Wayne Roberts |
7:ccb3088ce5be | 102 | /* RxTimeout */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 103 | /* RxError */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 104 | /* FhssChangeChannel */NULL, |
Wayne Roberts |
7:ccb3088ce5be | 105 | /* CadDone */ NULL |
Wayne Roberts |
7:ccb3088ce5be | 106 | }; |
Wayne Roberts |
7:ccb3088ce5be | 107 | |
grit | 8:efd5ceb87878 | 108 | |
grit | 8:efd5ceb87878 | 109 | static Mutex serialOutMutex; |
grit | 8:efd5ceb87878 | 110 | static void serial_out_mutex_wait() |
grit | 8:efd5ceb87878 | 111 | { |
grit | 8:efd5ceb87878 | 112 | serialOutMutex.lock(); |
grit | 8:efd5ceb87878 | 113 | } |
grit | 8:efd5ceb87878 | 114 | |
grit | 8:efd5ceb87878 | 115 | static void serial_out_mutex_release() |
grit | 8:efd5ceb87878 | 116 | { |
grit | 8:efd5ceb87878 | 117 | osStatus s = serialOutMutex.unlock(); |
grit | 8:efd5ceb87878 | 118 | MBED_ASSERT(s == osOK); |
grit | 8:efd5ceb87878 | 119 | } |
grit | 8:efd5ceb87878 | 120 | |
grit | 8:efd5ceb87878 | 121 | static int cmd_transmitByte(int argc, char *argv[]) |
grit | 8:efd5ceb87878 | 122 | { |
grit | 8:efd5ceb87878 | 123 | tr_debug("%s args: %d",__FUNCTION__,argc); |
grit | 8:efd5ceb87878 | 124 | if(argc != 2) |
grit | 8:efd5ceb87878 | 125 | { |
grit | 8:efd5ceb87878 | 126 | tr_debug("Invalid argument count"); |
grit | 8:efd5ceb87878 | 127 | return CMDLINE_RETCODE_INVALID_PARAMETERS; |
grit | 8:efd5ceb87878 | 128 | } |
grit | 8:efd5ceb87878 | 129 | uint8_t byte = atoi(argv[1]); |
grit | 8:efd5ceb87878 | 130 | tr_debug("sending byte: %d",byte); |
grit | 8:efd5ceb87878 | 131 | send_alarm(byte); |
grit | 8:efd5ceb87878 | 132 | return CMDLINE_RETCODE_SUCCESS; |
grit | 8:efd5ceb87878 | 133 | } |
grit | 8:efd5ceb87878 | 134 | |
dudmuck | 0:cb38da4f4b04 | 135 | int main() |
dudmuck | 0:cb38da4f4b04 | 136 | { |
grit | 8:efd5ceb87878 | 137 | mbed_trace_mutex_wait_function_set( serial_out_mutex_wait ); |
grit | 8:efd5ceb87878 | 138 | mbed_trace_mutex_release_function_set( serial_out_mutex_release ); |
grit | 8:efd5ceb87878 | 139 | mbed_trace_init(); |
grit | 8:efd5ceb87878 | 140 | tr_debug(__FUNCTION__); |
dudmuck | 1:3199506bc2e5 | 141 | |
Wayne Roberts |
7:ccb3088ce5be | 142 | wait(0.05); |
Wayne Roberts |
7:ccb3088ce5be | 143 | t.start(); |
Wayne Roberts |
7:ccb3088ce5be | 144 | |
Wayne Roberts |
7:ccb3088ce5be | 145 | Radio::Init(&rev); |
Wayne Roberts |
7:ccb3088ce5be | 146 | Radio::Standby(); |
Wayne Roberts |
7:ccb3088ce5be | 147 | Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1); |
Wayne Roberts |
7:ccb3088ce5be | 148 | Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ |
Wayne Roberts |
7:ccb3088ce5be | 149 | Radio::SetChannel(CF_HZ); |
Wayne Roberts |
7:ccb3088ce5be | 150 | Radio::set_tx_dbm(TX_DBM); |
Wayne Roberts |
7:ccb3088ce5be | 151 | |
grit | 8:efd5ceb87878 | 152 | tr_debug("Initializing Command Line"); |
grit | 8:efd5ceb87878 | 153 | cmd_init(0); |
grit | 8:efd5ceb87878 | 154 | cmd_mutex_wait_func( serial_out_mutex_wait ); |
grit | 8:efd5ceb87878 | 155 | cmd_mutex_release_func( serial_out_mutex_release ); |
grit | 8:efd5ceb87878 | 156 | cmd_add("transmit-byte", cmd_transmitByte,"Transmit Byte","Transmit a decimal byte over LoRa radio"); |
grit | 8:efd5ceb87878 | 157 | |
grit | 8:efd5ceb87878 | 158 | while(true) |
grit | 8:efd5ceb87878 | 159 | { |
grit | 8:efd5ceb87878 | 160 | int c = getchar(); |
grit | 8:efd5ceb87878 | 161 | if (c != EOF) |
grit | 8:efd5ceb87878 | 162 | { |
grit | 8:efd5ceb87878 | 163 | cmd_char_input(c); |
grit | 8:efd5ceb87878 | 164 | } |
grit | 8:efd5ceb87878 | 165 | } |
dudmuck | 0:cb38da4f4b04 | 166 | } |