May 2021 Commit

Dependencies:   sx128x sx12xx_hal

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?

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;
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 }