This program enables the use of the Semtech "SX1276 Starter Kit A" application to be used with the FRDM-KL25Z board. At the time of writing this, this app was available on Semtech's SX1276 page, in the "Docs & Resources"* tab, via the link "PC GUI (1.0.0Beta5)". This program was tested with the FRDM-KL25Z board, with a Modtronix inAir9 SX1276 board mounted in a Modtronix SHD3I shield. The inAir9 module is mounted in iMod port 3 of the SHD3I module. The SHD3I shield is mounted on the FRDM-KL25Z board.
Dependencies: SX127x_modtronix USBDevice_Semtech_GUI mbed
Fork of hid_test by
main.cpp@2:1972097c22d1, 2015-02-16 (annotated)
- Committer:
- modtronix
- Date:
- Mon Feb 16 02:14:45 2015 +0000
- Revision:
- 2:1972097c22d1
- Parent:
- 1:d25ba61cd2f3
Published program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudmuck | 0:f8bc33804548 | 1 | #include "mbed.h" |
dudmuck | 0:f8bc33804548 | 2 | #include "USBHID.h" |
dudmuck | 0:f8bc33804548 | 3 | #include "sx127x.h" |
dudmuck | 0:f8bc33804548 | 4 | |
dudmuck | 1:d25ba61cd2f3 | 5 | //#define _DEBUG_ |
dudmuck | 1:d25ba61cd2f3 | 6 | |
modtronix | 2:1972097c22d1 | 7 | /* |
modtronix | 2:1972097c22d1 | 8 | * This program is a modified version of the "hid_test" application by Wayne Roberts. All credits go |
modtronix | 2:1972097c22d1 | 9 | * to Wayne for writing it, I just did some minor modiciations! |
modtronix | 2:1972097c22d1 | 10 | * |
modtronix | 2:1972097c22d1 | 11 | * The program was tested with the FRDM-KL25Z board, with a Modtronix inAir9 SX1276 board mounted in |
modtronix | 2:1972097c22d1 | 12 | * a Modtronix SHD3I shield. The inAir9 module is mounted in iMod port 3 of the SHD3I module. The |
modtronix | 2:1972097c22d1 | 13 | * SHD3I shield is mounted on the FRDM-KL25Z board. |
modtronix | 2:1972097c22d1 | 14 | * It enables the use of the Semtech "SX1276 Starter Kit A" application to be used with this board. |
modtronix | 2:1972097c22d1 | 15 | * At the time of writing this, this app was available on Semtech's SX1276 page, in the "Docs & Resources" |
modtronix | 2:1972097c22d1 | 16 | * tab, via the link "PC GUI (1.0.0Beta5)". |
modtronix | 2:1972097c22d1 | 17 | * This app can be used for sending and receiving data via the SX1276. To use it: |
modtronix | 2:1972097c22d1 | 18 | * - Plug the FRDM-KL25Z into the PC via the USB marked "USB KL25Z" |
modtronix | 2:1972097c22d1 | 19 | * - Start Semtech "SX1276 Starter Kit A" app on PC |
modtronix | 2:1972097c22d1 | 20 | * - App should connect to board, enabling it to control board. |
modtronix | 2:1972097c22d1 | 21 | * |
modtronix | 2:1972097c22d1 | 22 | * ========== Firmware for KL25Z ========== |
modtronix | 2:1972097c22d1 | 23 | * The default firmware listed on mbed.org puts a clock pulse on pin A5. To fix this, use alternative |
modtronix | 2:1972097c22d1 | 24 | * firmware (or unsolder resistor R24). |
modtronix | 2:1972097c22d1 | 25 | * - Download "OpenSDA Firmware" from http://www.pemicro.com/opensda/ |
modtronix | 2:1972097c22d1 | 26 | * - Put KL25Z into bootloader mode (hold down button while plugging in SDA USB). |
modtronix | 2:1972097c22d1 | 27 | * - Drag "MSD-DEBUG-FRDM-KL25Z_Pemicro_v114.SDA" file onto it. |
modtronix | 2:1972097c22d1 | 28 | * - Reset KL25Z. |
modtronix | 2:1972097c22d1 | 29 | * - If the USB drivers do not automatically install, download and run "Windows USB Drivers" from |
modtronix | 2:1972097c22d1 | 30 | * www.pemicro.com/opensda. After this, when you plug in the KL25Z next time, all drivers should |
modtronix | 2:1972097c22d1 | 31 | * install correctly. |
modtronix | 2:1972097c22d1 | 32 | */ |
modtronix | 2:1972097c22d1 | 33 | |
modtronix | 2:1972097c22d1 | 34 | #define TARGET_KL25Z_SHD3I_INAIR8 /* FRDM-KL25Z + Modtronix inAir9 SX1276 board + SHD3I daughter board */ |
modtronix | 2:1972097c22d1 | 35 | |
modtronix | 2:1972097c22d1 | 36 | //Defines for the FRDM-KL25Z board, with Modtronix SHD3I with an inAir9 SX1276 module mounted in it. |
modtronix | 2:1972097c22d1 | 37 | #ifdef TARGET_KL25Z_SHD3I_INAIR8 |
modtronix | 2:1972097c22d1 | 38 | //SCLK=D13, MISO=D12, MOSI=D11 |
modtronix | 2:1972097c22d1 | 39 | //CS=D7, Reset=A5 |
modtronix | 2:1972097c22d1 | 40 | //DIO0=D2, DIO1=D8, DIO2=D4, DIO3=A4, DIO4=N.C., DIO5=D3 |
modtronix | 2:1972097c22d1 | 41 | // mosi, miso, sclk, cs, rst, dio0, dio1 |
modtronix | 2:1972097c22d1 | 42 | SX127x radio(D11, D12, D13, D7, A5, D2, D8); |
modtronix | 2:1972097c22d1 | 43 | #else |
modtronix | 2:1972097c22d1 | 44 | // pin: 3 8 1 7 10 12 5 |
modtronix | 2:1972097c22d1 | 45 | // mosi, miso, sclk, cs, rst, dio0, dio1 |
modtronix | 2:1972097c22d1 | 46 | // D11 D12 D13 D10 D9 D8 D2 |
modtronix | 2:1972097c22d1 | 47 | SX127x radio(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13, PTD4); |
modtronix | 2:1972097c22d1 | 48 | #endif |
modtronix | 2:1972097c22d1 | 49 | |
dudmuck | 1:d25ba61cd2f3 | 50 | #ifdef _DEBUG_ |
dudmuck | 1:d25ba61cd2f3 | 51 | #include "sx127x_lora.h" |
dudmuck | 1:d25ba61cd2f3 | 52 | SX127x_lora lora(radio); |
dudmuck | 1:d25ba61cd2f3 | 53 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 54 | |
dudmuck | 0:f8bc33804548 | 55 | //We declare a USBHID device. By default input and output reports are 64 bytes long. |
dudmuck | 0:f8bc33804548 | 56 | USBHID hid(64, 64, 0x47a, 0x0b); |
dudmuck | 0:f8bc33804548 | 57 | //USBHID (uint8_t output_report_length=64, uint8_t input_report_length=64, uint16_t vendor_id=0x1234, uint16_t product_id=0x0006, uint16_t product_release=0x0001, bool connect=true) |
dudmuck | 0:f8bc33804548 | 58 | |
dudmuck | 0:f8bc33804548 | 59 | Serial pc(USBTX, USBRX); |
dudmuck | 0:f8bc33804548 | 60 | |
dudmuck | 0:f8bc33804548 | 61 | //This report will contain data to be sent |
dudmuck | 0:f8bc33804548 | 62 | HID_REPORT send_report; |
dudmuck | 0:f8bc33804548 | 63 | HID_REPORT recv_report; |
dudmuck | 0:f8bc33804548 | 64 | |
dudmuck | 0:f8bc33804548 | 65 | DigitalOut l1(LED1); |
dudmuck | 0:f8bc33804548 | 66 | |
dudmuck | 0:f8bc33804548 | 67 | #define FW_VERSION "3.1.0" |
dudmuck | 0:f8bc33804548 | 68 | #define SK_NAME "mbed" |
dudmuck | 0:f8bc33804548 | 69 | |
dudmuck | 0:f8bc33804548 | 70 | #define HID_SK_RESET 0x00 |
dudmuck | 0:f8bc33804548 | 71 | #define HID_SK_GET_VERSION 0x01 |
dudmuck | 0:f8bc33804548 | 72 | #define HID_SK_GET_NAME 0x02 |
dudmuck | 0:f8bc33804548 | 73 | #define HID_SK_GET_PIN 0x10 |
dudmuck | 0:f8bc33804548 | 74 | #define HID_SK_SET_PIN 0x11 |
dudmuck | 0:f8bc33804548 | 75 | #define HID_SK_GET_PINS 0x14 |
dudmuck | 0:f8bc33804548 | 76 | #define HID_DEVICE_READ 0x80 |
dudmuck | 0:f8bc33804548 | 77 | #define HID_DEVICE_WRITE 0x81 |
dudmuck | 0:f8bc33804548 | 78 | #define HID_DEVICE_INIT 0x88 |
dudmuck | 0:f8bc33804548 | 79 | #define HID_DEVICE_RESET 0x89 |
dudmuck | 0:f8bc33804548 | 80 | #define HID_SK_CMD_NONE 0xFF |
dudmuck | 0:f8bc33804548 | 81 | |
dudmuck | 0:f8bc33804548 | 82 | typedef struct sHidCommand |
dudmuck | 0:f8bc33804548 | 83 | { |
dudmuck | 0:f8bc33804548 | 84 | uint8_t Cmd; |
dudmuck | 0:f8bc33804548 | 85 | uint8_t CmdOpt; |
dudmuck | 0:f8bc33804548 | 86 | uint8_t CmdDataSize; |
dudmuck | 0:f8bc33804548 | 87 | uint8_t *CmdData; |
dudmuck | 0:f8bc33804548 | 88 | } tHidCommand; |
dudmuck | 0:f8bc33804548 | 89 | |
dudmuck | 0:f8bc33804548 | 90 | typedef enum |
dudmuck | 0:f8bc33804548 | 91 | { |
dudmuck | 0:f8bc33804548 | 92 | SX_OK, |
dudmuck | 0:f8bc33804548 | 93 | SX_ERROR, |
dudmuck | 0:f8bc33804548 | 94 | SX_BUSY, |
dudmuck | 0:f8bc33804548 | 95 | SX_EMPTY, |
dudmuck | 0:f8bc33804548 | 96 | SX_DONE, |
dudmuck | 0:f8bc33804548 | 97 | SX_TIMEOUT, |
dudmuck | 0:f8bc33804548 | 98 | SX_UNSUPPORTED, |
dudmuck | 0:f8bc33804548 | 99 | SX_WAIT, |
dudmuck | 0:f8bc33804548 | 100 | SX_CLOSE, |
dudmuck | 0:f8bc33804548 | 101 | SX_YES, |
dudmuck | 0:f8bc33804548 | 102 | SX_NO, |
dudmuck | 0:f8bc33804548 | 103 | } tReturnCodes; |
dudmuck | 0:f8bc33804548 | 104 | |
dudmuck | 0:f8bc33804548 | 105 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 106 | char verbose = 0; |
dudmuck | 0:f8bc33804548 | 107 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 108 | |
modtronix | 2:1972097c22d1 | 109 | //Following code is from V7 |
modtronix | 2:1972097c22d1 | 110 | //DigitalOut rfsw1(PTC8); |
modtronix | 2:1972097c22d1 | 111 | //DigitalOut rfsw2(PTC9); |
modtronix | 2:1972097c22d1 | 112 | |
modtronix | 2:1972097c22d1 | 113 | void rfsw_callback() |
modtronix | 2:1972097c22d1 | 114 | { |
modtronix | 2:1972097c22d1 | 115 | /* |
modtronix | 2:1972097c22d1 | 116 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission |
modtronix | 2:1972097c22d1 | 117 | if (radio.HF) { |
modtronix | 2:1972097c22d1 | 118 | if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST |
modtronix | 2:1972097c22d1 | 119 | rfsw2 = 0; |
modtronix | 2:1972097c22d1 | 120 | rfsw1 = 1; |
modtronix | 2:1972097c22d1 | 121 | } else { // RFO to power amp |
modtronix | 2:1972097c22d1 | 122 | rfsw2 = 1; |
modtronix | 2:1972097c22d1 | 123 | rfsw1 = 0; |
modtronix | 2:1972097c22d1 | 124 | } |
modtronix | 2:1972097c22d1 | 125 | } else { |
modtronix | 2:1972097c22d1 | 126 | // todo: sx1276 |
modtronix | 2:1972097c22d1 | 127 | } |
modtronix | 2:1972097c22d1 | 128 | } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception |
modtronix | 2:1972097c22d1 | 129 | if (radio.HF) { |
modtronix | 2:1972097c22d1 | 130 | rfsw2 = 1; |
modtronix | 2:1972097c22d1 | 131 | rfsw1 = 1; |
modtronix | 2:1972097c22d1 | 132 | } else { |
modtronix | 2:1972097c22d1 | 133 | // todo: sx1276 |
modtronix | 2:1972097c22d1 | 134 | } |
modtronix | 2:1972097c22d1 | 135 | } else { // RF switch shutdown |
modtronix | 2:1972097c22d1 | 136 | rfsw2 = 0; |
modtronix | 2:1972097c22d1 | 137 | rfsw1 = 0; |
modtronix | 2:1972097c22d1 | 138 | } |
modtronix | 2:1972097c22d1 | 139 | */ |
modtronix | 2:1972097c22d1 | 140 | } |
modtronix | 2:1972097c22d1 | 141 | |
modtronix | 2:1972097c22d1 | 142 | |
dudmuck | 0:f8bc33804548 | 143 | void HidDecodeCommand( uint8_t *hidReport, tHidCommand *cmd ) |
dudmuck | 0:f8bc33804548 | 144 | { |
dudmuck | 0:f8bc33804548 | 145 | cmd->Cmd = hidReport[0]; |
dudmuck | 0:f8bc33804548 | 146 | cmd->CmdOpt = hidReport[1]; |
dudmuck | 0:f8bc33804548 | 147 | cmd->CmdDataSize = hidReport[2]; |
dudmuck | 0:f8bc33804548 | 148 | cmd->CmdData = hidReport + 3; |
dudmuck | 0:f8bc33804548 | 149 | } |
dudmuck | 0:f8bc33804548 | 150 | |
dudmuck | 0:f8bc33804548 | 151 | void HidEncodeCommandAns( uint8_t cmd, uint8_t stat, uint8_t dataSize, uint8_t *data ) |
dudmuck | 0:f8bc33804548 | 152 | { |
dudmuck | 0:f8bc33804548 | 153 | send_report.data[0] = cmd; |
dudmuck | 0:f8bc33804548 | 154 | send_report.data[1] = stat; |
dudmuck | 0:f8bc33804548 | 155 | |
dudmuck | 0:f8bc33804548 | 156 | // TimeStamp |
dudmuck | 0:f8bc33804548 | 157 | memset( send_report.data + 2, 0, 8 ); |
dudmuck | 0:f8bc33804548 | 158 | |
dudmuck | 0:f8bc33804548 | 159 | send_report.data[10] = dataSize; |
dudmuck | 0:f8bc33804548 | 160 | memcpy( send_report.data + 11, ( const void* )data, dataSize ); |
dudmuck | 0:f8bc33804548 | 161 | |
dudmuck | 0:f8bc33804548 | 162 | //send_report.length = 11 + dataSize; |
dudmuck | 0:f8bc33804548 | 163 | send_report.length = 64; |
dudmuck | 0:f8bc33804548 | 164 | hid.send(&send_report); |
dudmuck | 0:f8bc33804548 | 165 | } |
dudmuck | 0:f8bc33804548 | 166 | |
dudmuck | 0:f8bc33804548 | 167 | void HidCmdProcess(void) |
dudmuck | 0:f8bc33804548 | 168 | { |
dudmuck | 0:f8bc33804548 | 169 | uint8_t stat = SX_OK; |
dudmuck | 0:f8bc33804548 | 170 | uint8_t size = 0; |
dudmuck | 0:f8bc33804548 | 171 | uint8_t dataBuffer[64]; |
dudmuck | 0:f8bc33804548 | 172 | tHidCommand cmd = { HID_SK_CMD_NONE, 0, 0, NULL }; |
dudmuck | 0:f8bc33804548 | 173 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 174 | int i; |
dudmuck | 0:f8bc33804548 | 175 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 176 | |
dudmuck | 0:f8bc33804548 | 177 | HidDecodeCommand(recv_report.data, &cmd); |
dudmuck | 0:f8bc33804548 | 178 | |
dudmuck | 0:f8bc33804548 | 179 | switch (cmd.Cmd) { |
dudmuck | 0:f8bc33804548 | 180 | case HID_DEVICE_RESET: |
dudmuck | 0:f8bc33804548 | 181 | radio.hw_reset(); |
dudmuck | 0:f8bc33804548 | 182 | break; |
dudmuck | 0:f8bc33804548 | 183 | case HID_SK_RESET: |
dudmuck | 0:f8bc33804548 | 184 | case HID_DEVICE_INIT: |
dudmuck | 0:f8bc33804548 | 185 | radio.hw_reset(); |
dudmuck | 0:f8bc33804548 | 186 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 187 | if (verbose) |
dudmuck | 0:f8bc33804548 | 188 | printf("reset-init\r\n"); |
dudmuck | 0:f8bc33804548 | 189 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 190 | radio.init(); //SX1272Init( ); |
dudmuck | 0:f8bc33804548 | 191 | // Set FSK modem ON |
dudmuck | 1:d25ba61cd2f3 | 192 | radio.set_opmode(RF_OPMODE_SLEEP); |
dudmuck | 1:d25ba61cd2f3 | 193 | radio.RegOpMode.bits.LongRangeMode = 0; |
dudmuck | 1:d25ba61cd2f3 | 194 | radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); |
dudmuck | 1:d25ba61cd2f3 | 195 | //radio.SetLoRaOn( false ); //SX1272SetLoRaOn( false ); // Default radio setting |
dudmuck | 0:f8bc33804548 | 196 | // Default answer settings |
dudmuck | 0:f8bc33804548 | 197 | break; |
dudmuck | 0:f8bc33804548 | 198 | case HID_SK_GET_VERSION: |
dudmuck | 0:f8bc33804548 | 199 | strcpy( ( char* )dataBuffer, FW_VERSION ); |
dudmuck | 0:f8bc33804548 | 200 | size = strlen( FW_VERSION ); |
dudmuck | 0:f8bc33804548 | 201 | break; |
dudmuck | 0:f8bc33804548 | 202 | case HID_DEVICE_READ: |
dudmuck | 0:f8bc33804548 | 203 | // cmd.CmdData[0] = size |
dudmuck | 0:f8bc33804548 | 204 | // cmd.CmdData[1] = address |
dudmuck | 0:f8bc33804548 | 205 | size = cmd.CmdData[0]; |
dudmuck | 0:f8bc33804548 | 206 | radio.ReadBuffer( cmd.CmdData[1], dataBuffer, size ); |
dudmuck | 0:f8bc33804548 | 207 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 208 | if (verbose) { |
dudmuck | 0:f8bc33804548 | 209 | pc.printf("read %d bytes from %02x: ", size, cmd.CmdData[1]); |
dudmuck | 0:f8bc33804548 | 210 | for (i = 0; i < size; i++) |
dudmuck | 0:f8bc33804548 | 211 | pc.printf("%02x ", dataBuffer[i]); |
dudmuck | 0:f8bc33804548 | 212 | pc.printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 213 | } |
dudmuck | 0:f8bc33804548 | 214 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 215 | stat = SX_OK; |
dudmuck | 0:f8bc33804548 | 216 | break; |
dudmuck | 0:f8bc33804548 | 217 | case HID_SK_GET_PINS: |
dudmuck | 0:f8bc33804548 | 218 | dataBuffer[0] = 0; |
dudmuck | 0:f8bc33804548 | 219 | if (radio.dio0) |
dudmuck | 0:f8bc33804548 | 220 | dataBuffer[0] |= 0x01; |
dudmuck | 0:f8bc33804548 | 221 | if (radio.dio1) |
dudmuck | 0:f8bc33804548 | 222 | dataBuffer[0] |= 0x02; |
dudmuck | 0:f8bc33804548 | 223 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 224 | if (verbose && dataBuffer[0] != 0) |
dudmuck | 0:f8bc33804548 | 225 | printf("HID_SK_GET_PINS:%02x\r\n", dataBuffer[0]); |
dudmuck | 0:f8bc33804548 | 226 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 227 | /*dataBuffer[0] |= DIO1 << 1; |
dudmuck | 0:f8bc33804548 | 228 | dataBuffer[0] |= DIO2 << 2; |
dudmuck | 0:f8bc33804548 | 229 | dataBuffer[0] |= DIO3 << 3; |
dudmuck | 0:f8bc33804548 | 230 | dataBuffer[0] |= DIO4 << 4; |
dudmuck | 0:f8bc33804548 | 231 | dataBuffer[0] |= DIO5 << 5;*/ |
dudmuck | 0:f8bc33804548 | 232 | size = 1; |
dudmuck | 0:f8bc33804548 | 233 | break; |
dudmuck | 0:f8bc33804548 | 234 | case HID_SK_GET_PIN: |
dudmuck | 0:f8bc33804548 | 235 | // cmd.CmdData[0] = Pin id |
dudmuck | 0:f8bc33804548 | 236 | switch( cmd.CmdData[0] ) { |
dudmuck | 0:f8bc33804548 | 237 | case 11: // FEM_CPS_PIN |
modtronix | 2:1972097c22d1 | 238 | //MODTRONIX modified, we do not have a femcps pin |
modtronix | 2:1972097c22d1 | 239 | //dataBuffer[0] = radio.femcps; |
modtronix | 2:1972097c22d1 | 240 | dataBuffer[0] = 0; |
dudmuck | 0:f8bc33804548 | 241 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 242 | if (verbose) |
dudmuck | 0:f8bc33804548 | 243 | printf("HID_SK_GET_PIN femcps:%02x\r\n", dataBuffer[0]); |
dudmuck | 0:f8bc33804548 | 244 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 245 | break; |
dudmuck | 0:f8bc33804548 | 246 | case 12: // FEM_CTX_PIN |
modtronix | 2:1972097c22d1 | 247 | //MODTRONIX modified, we do not have a femctx pin |
modtronix | 2:1972097c22d1 | 248 | //dataBuffer[0] = radio.femctx; |
modtronix | 2:1972097c22d1 | 249 | dataBuffer[0] = 0; |
dudmuck | 0:f8bc33804548 | 250 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 251 | if (verbose) |
dudmuck | 0:f8bc33804548 | 252 | printf("HID_SK_GET_PIN femctx:%02x\r\n", dataBuffer[0]); |
dudmuck | 0:f8bc33804548 | 253 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 254 | break; |
dudmuck | 0:f8bc33804548 | 255 | default: |
dudmuck | 0:f8bc33804548 | 256 | dataBuffer[0] = 0xFF; // Signal ID error |
dudmuck | 0:f8bc33804548 | 257 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 258 | printf("HID_SK_GET_PIN %d\r\n", cmd.CmdData[0]); |
dudmuck | 0:f8bc33804548 | 259 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 260 | break; |
dudmuck | 0:f8bc33804548 | 261 | } // ...switch( cmd.CmdData[0] ) |
dudmuck | 0:f8bc33804548 | 262 | break; |
dudmuck | 0:f8bc33804548 | 263 | case HID_SK_SET_PIN: |
dudmuck | 0:f8bc33804548 | 264 | // cmd.CmdData[0] = Pin id |
dudmuck | 0:f8bc33804548 | 265 | // cmd.CmdData[1] = Pin state |
dudmuck | 0:f8bc33804548 | 266 | switch( cmd.CmdData[0] ) { |
dudmuck | 0:f8bc33804548 | 267 | case 6: |
dudmuck | 0:f8bc33804548 | 268 | case 7: |
dudmuck | 0:f8bc33804548 | 269 | case 8: |
dudmuck | 0:f8bc33804548 | 270 | // ignore LEDs |
dudmuck | 0:f8bc33804548 | 271 | break; |
dudmuck | 0:f8bc33804548 | 272 | case 11: // FEM_CPS_PIN |
modtronix | 2:1972097c22d1 | 273 | //MODTRONIX modified, we do not have a femcps pin |
modtronix | 2:1972097c22d1 | 274 | //radio.femcps = cmd.CmdData[1]; |
dudmuck | 0:f8bc33804548 | 275 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 276 | if (verbose) |
dudmuck | 0:f8bc33804548 | 277 | printf("HID_SK_SET_PIN femcps:%d\r\n", (int)radio.femcps); |
dudmuck | 0:f8bc33804548 | 278 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 279 | break; |
dudmuck | 0:f8bc33804548 | 280 | case 12: // FEM_CTX_PIN |
modtronix | 2:1972097c22d1 | 281 | //MODTRONIX modified, we do not have a femctx pin |
modtronix | 2:1972097c22d1 | 282 | //radio.femctx = cmd.CmdData[1]; |
dudmuck | 0:f8bc33804548 | 283 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 284 | if (verbose) |
dudmuck | 0:f8bc33804548 | 285 | printf("HID_SK_SET_PIN femctx:%d\r\n", (int)radio.femctx); |
dudmuck | 0:f8bc33804548 | 286 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 287 | break; |
dudmuck | 0:f8bc33804548 | 288 | default: |
dudmuck | 0:f8bc33804548 | 289 | stat = SX_UNSUPPORTED; |
dudmuck | 0:f8bc33804548 | 290 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 291 | pc.printf("HID_SK_SET_PIN %d %d\r\n", cmd.CmdData[0], cmd.CmdData[1]); |
dudmuck | 0:f8bc33804548 | 292 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 293 | break; |
dudmuck | 0:f8bc33804548 | 294 | } // ...switch( cmd.CmdData[0] ) |
dudmuck | 0:f8bc33804548 | 295 | |
dudmuck | 0:f8bc33804548 | 296 | break; |
dudmuck | 0:f8bc33804548 | 297 | case HID_DEVICE_WRITE: |
dudmuck | 0:f8bc33804548 | 298 | // cmd.CmdData[0] = size |
dudmuck | 0:f8bc33804548 | 299 | // cmd.CmdData[1] = address |
dudmuck | 0:f8bc33804548 | 300 | // cmd.CmdData[2] = Buffer first byte |
dudmuck | 0:f8bc33804548 | 301 | // cmd.CmdData[2+(size-1)] = Buffer last byte |
dudmuck | 0:f8bc33804548 | 302 | radio.WriteBuffer( cmd.CmdData[1], cmd.CmdData + 2, cmd.CmdData[0] ); |
dudmuck | 0:f8bc33804548 | 303 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 304 | if (verbose) { |
dudmuck | 0:f8bc33804548 | 305 | pc.printf("write %d bytes to %02x: ", cmd.CmdData[0], cmd.CmdData[1]); |
dudmuck | 0:f8bc33804548 | 306 | for (i = 0; i < cmd.CmdData[0]; i++) |
dudmuck | 0:f8bc33804548 | 307 | pc.printf("%02x ", cmd.CmdData[2+i]); |
dudmuck | 0:f8bc33804548 | 308 | pc.printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 309 | } |
dudmuck | 0:f8bc33804548 | 310 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 311 | stat = SX_OK; |
dudmuck | 0:f8bc33804548 | 312 | break; |
dudmuck | 0:f8bc33804548 | 313 | case HID_SK_GET_NAME: |
dudmuck | 0:f8bc33804548 | 314 | strcpy( ( char* )dataBuffer, SK_NAME ); |
dudmuck | 0:f8bc33804548 | 315 | size = strlen( SK_NAME ); |
dudmuck | 0:f8bc33804548 | 316 | break; |
dudmuck | 0:f8bc33804548 | 317 | default: |
dudmuck | 0:f8bc33804548 | 318 | pc.printf("%d: ", recv_report.length); |
dudmuck | 0:f8bc33804548 | 319 | for(int i = 0; i < recv_report.length; i++) { |
dudmuck | 0:f8bc33804548 | 320 | pc.printf("%02x ", recv_report.data[i]); |
dudmuck | 0:f8bc33804548 | 321 | } |
dudmuck | 0:f8bc33804548 | 322 | pc.printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 323 | stat = SX_UNSUPPORTED; |
dudmuck | 0:f8bc33804548 | 324 | break; |
dudmuck | 0:f8bc33804548 | 325 | } // ...switch (cmd.Cmd) |
dudmuck | 0:f8bc33804548 | 326 | |
dudmuck | 0:f8bc33804548 | 327 | HidEncodeCommandAns( cmd.Cmd, stat, size, dataBuffer); |
dudmuck | 0:f8bc33804548 | 328 | } |
dudmuck | 0:f8bc33804548 | 329 | |
dudmuck | 0:f8bc33804548 | 330 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 331 | void printOpMode() |
dudmuck | 0:f8bc33804548 | 332 | { |
dudmuck | 0:f8bc33804548 | 333 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:f8bc33804548 | 334 | switch (radio.RegOpMode.bits.Mode) { |
dudmuck | 0:f8bc33804548 | 335 | case RF_OPMODE_SLEEP: printf("[7msleep[0m"); break; |
dudmuck | 0:f8bc33804548 | 336 | case RF_OPMODE_STANDBY: printf("[7mstby[0m"); break; |
dudmuck | 0:f8bc33804548 | 337 | case RF_OPMODE_SYNTHESIZER_TX: printf("[33mfstx[0m"); break; |
dudmuck | 0:f8bc33804548 | 338 | case RF_OPMODE_TRANSMITTER: printf("[31mtx[0m"); break; |
dudmuck | 0:f8bc33804548 | 339 | case RF_OPMODE_SYNTHESIZER_RX: printf("[33mfsrx[0m"); break; |
dudmuck | 0:f8bc33804548 | 340 | case RF_OPMODE_RECEIVER: printf("[32mrx[0m"); break; |
dudmuck | 0:f8bc33804548 | 341 | case 6: |
dudmuck | 0:f8bc33804548 | 342 | if (radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:f8bc33804548 | 343 | printf("[42mrxs[0m"); |
dudmuck | 0:f8bc33804548 | 344 | else |
dudmuck | 0:f8bc33804548 | 345 | printf("-6-"); |
dudmuck | 0:f8bc33804548 | 346 | break; // todo: different lora/fsk |
dudmuck | 0:f8bc33804548 | 347 | case 7: |
dudmuck | 0:f8bc33804548 | 348 | if (radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:f8bc33804548 | 349 | printf("[45mcad[0m"); |
dudmuck | 0:f8bc33804548 | 350 | else |
dudmuck | 0:f8bc33804548 | 351 | printf("-7-"); |
dudmuck | 0:f8bc33804548 | 352 | break; // todo: different lora/fsk |
dudmuck | 0:f8bc33804548 | 353 | } |
dudmuck | 0:f8bc33804548 | 354 | } |
dudmuck | 0:f8bc33804548 | 355 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 356 | |
dudmuck | 0:f8bc33804548 | 357 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 358 | void |
dudmuck | 0:f8bc33804548 | 359 | printPa() |
dudmuck | 0:f8bc33804548 | 360 | { |
dudmuck | 0:f8bc33804548 | 361 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:f8bc33804548 | 362 | if (radio.RegPaConfig.bits.PaSelect) { |
dudmuck | 0:f8bc33804548 | 363 | float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower); |
dudmuck | 0:f8bc33804548 | 364 | printf(" PABOOST OutputPower=%.1fdBm", output_dBm); |
dudmuck | 0:f8bc33804548 | 365 | } else { |
dudmuck | 0:f8bc33804548 | 366 | float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8; |
dudmuck | 0:f8bc33804548 | 367 | float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower); |
dudmuck | 0:f8bc33804548 | 368 | printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm); |
dudmuck | 0:f8bc33804548 | 369 | } |
dudmuck | 0:f8bc33804548 | 370 | } |
dudmuck | 0:f8bc33804548 | 371 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 372 | |
dudmuck | 0:f8bc33804548 | 373 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 374 | void /* things always present, whether lora or fsk */ |
dudmuck | 0:f8bc33804548 | 375 | common_print_status() |
dudmuck | 0:f8bc33804548 | 376 | { |
dudmuck | 0:f8bc33804548 | 377 | printf("version:0x%02x %.3fMHz ", radio.read_reg(REG_VERSION), radio.get_frf_MHz()); |
dudmuck | 0:f8bc33804548 | 378 | printOpMode(); |
dudmuck | 0:f8bc33804548 | 379 | |
dudmuck | 0:f8bc33804548 | 380 | printPa(); |
dudmuck | 0:f8bc33804548 | 381 | |
dudmuck | 0:f8bc33804548 | 382 | radio.RegOcp.octet = radio.read_reg(REG_OCP); |
dudmuck | 0:f8bc33804548 | 383 | if (radio.RegOcp.bits.OcpOn) { |
dudmuck | 0:f8bc33804548 | 384 | int imax = 0; |
dudmuck | 0:f8bc33804548 | 385 | if (radio.RegOcp.bits.OcpTrim < 16) |
dudmuck | 0:f8bc33804548 | 386 | imax = 45 + (5 * radio.RegOcp.bits.OcpTrim); |
dudmuck | 0:f8bc33804548 | 387 | else if (radio.RegOcp.bits.OcpTrim < 28) |
dudmuck | 0:f8bc33804548 | 388 | imax = -30 + (10 * radio.RegOcp.bits.OcpTrim); |
dudmuck | 0:f8bc33804548 | 389 | else |
dudmuck | 0:f8bc33804548 | 390 | imax = 240; |
dudmuck | 0:f8bc33804548 | 391 | printf(" OcpOn %dmA ", imax); |
dudmuck | 0:f8bc33804548 | 392 | } else |
dudmuck | 0:f8bc33804548 | 393 | printf(" OcpOFF "); |
dudmuck | 0:f8bc33804548 | 394 | |
dudmuck | 0:f8bc33804548 | 395 | printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 396 | |
dudmuck | 0:f8bc33804548 | 397 | } |
dudmuck | 0:f8bc33804548 | 398 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 399 | |
dudmuck | 0:f8bc33804548 | 400 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 401 | void lora_print_dio() |
dudmuck | 0:f8bc33804548 | 402 | { |
dudmuck | 0:f8bc33804548 | 403 | radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2); |
dudmuck | 0:f8bc33804548 | 404 | printf("DIO5:"); |
dudmuck | 0:f8bc33804548 | 405 | switch (radio.RegDioMapping2.bits.Dio5Mapping) { |
dudmuck | 0:f8bc33804548 | 406 | case 0: printf("ModeReady"); break; |
dudmuck | 0:f8bc33804548 | 407 | case 1: printf("ClkOut"); break; |
dudmuck | 0:f8bc33804548 | 408 | case 2: printf("ClkOut"); break; |
dudmuck | 0:f8bc33804548 | 409 | } |
dudmuck | 0:f8bc33804548 | 410 | printf(" DIO4:"); |
dudmuck | 0:f8bc33804548 | 411 | switch (radio.RegDioMapping2.bits.Dio4Mapping) { |
dudmuck | 0:f8bc33804548 | 412 | case 0: printf("CadDetected"); break; |
dudmuck | 0:f8bc33804548 | 413 | case 1: printf("PllLock"); break; |
dudmuck | 0:f8bc33804548 | 414 | case 2: printf("PllLock"); break; |
dudmuck | 0:f8bc33804548 | 415 | } |
dudmuck | 0:f8bc33804548 | 416 | radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1); |
dudmuck | 0:f8bc33804548 | 417 | printf(" DIO3:"); |
dudmuck | 0:f8bc33804548 | 418 | switch (radio.RegDioMapping1.bits.Dio3Mapping) { |
dudmuck | 0:f8bc33804548 | 419 | case 0: printf("CadDone"); break; |
dudmuck | 0:f8bc33804548 | 420 | case 1: printf("ValidHeader"); break; |
dudmuck | 0:f8bc33804548 | 421 | case 2: printf("PayloadCrcError"); break; |
dudmuck | 0:f8bc33804548 | 422 | } |
dudmuck | 0:f8bc33804548 | 423 | printf(" DIO2:"); |
dudmuck | 0:f8bc33804548 | 424 | switch (radio.RegDioMapping1.bits.Dio2Mapping) { |
dudmuck | 0:f8bc33804548 | 425 | case 0: |
dudmuck | 0:f8bc33804548 | 426 | case 1: |
dudmuck | 0:f8bc33804548 | 427 | case 2: |
dudmuck | 0:f8bc33804548 | 428 | printf("FhssChangeChannel"); |
dudmuck | 0:f8bc33804548 | 429 | break; |
dudmuck | 0:f8bc33804548 | 430 | } |
dudmuck | 0:f8bc33804548 | 431 | printf(" DIO1:"); |
dudmuck | 0:f8bc33804548 | 432 | switch (radio.RegDioMapping1.bits.Dio1Mapping) { |
dudmuck | 0:f8bc33804548 | 433 | case 0: printf("RxTimeout"); break; |
dudmuck | 0:f8bc33804548 | 434 | case 1: printf("FhssChangeChannel"); break; |
dudmuck | 0:f8bc33804548 | 435 | case 2: printf("CadDetected"); break; |
dudmuck | 0:f8bc33804548 | 436 | } |
dudmuck | 0:f8bc33804548 | 437 | printf(" DIO0:"); |
dudmuck | 0:f8bc33804548 | 438 | switch (radio.RegDioMapping1.bits.Dio0Mapping) { |
dudmuck | 0:f8bc33804548 | 439 | case 0: printf("RxDone"); break; |
dudmuck | 0:f8bc33804548 | 440 | case 1: printf("TxDone"); break; |
dudmuck | 0:f8bc33804548 | 441 | case 2: printf("CadDone"); break; |
dudmuck | 0:f8bc33804548 | 442 | } |
dudmuck | 0:f8bc33804548 | 443 | |
dudmuck | 0:f8bc33804548 | 444 | printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 445 | } |
dudmuck | 0:f8bc33804548 | 446 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 447 | |
dudmuck | 0:f8bc33804548 | 448 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 449 | void |
dudmuck | 0:f8bc33804548 | 450 | printCodingRate(bool from_rx) |
dudmuck | 0:f8bc33804548 | 451 | { |
dudmuck | 1:d25ba61cd2f3 | 452 | uint8_t d = lora.getCodingRate(from_rx); |
dudmuck | 0:f8bc33804548 | 453 | printf("CodingRate:"); |
dudmuck | 0:f8bc33804548 | 454 | switch (d) { |
dudmuck | 0:f8bc33804548 | 455 | case 1: printf("4/5 "); break; |
dudmuck | 0:f8bc33804548 | 456 | case 2: printf("4/6 "); break; |
dudmuck | 0:f8bc33804548 | 457 | case 3: printf("4/7 "); break; |
dudmuck | 0:f8bc33804548 | 458 | case 4: printf("4/8 "); break; |
dudmuck | 0:f8bc33804548 | 459 | default: |
dudmuck | 0:f8bc33804548 | 460 | printf("%d ", d); |
dudmuck | 0:f8bc33804548 | 461 | break; |
dudmuck | 0:f8bc33804548 | 462 | } |
dudmuck | 0:f8bc33804548 | 463 | } |
dudmuck | 0:f8bc33804548 | 464 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 465 | |
dudmuck | 0:f8bc33804548 | 466 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 467 | void printHeaderMode() |
dudmuck | 0:f8bc33804548 | 468 | { |
dudmuck | 1:d25ba61cd2f3 | 469 | if (lora.getHeaderMode()) |
dudmuck | 0:f8bc33804548 | 470 | printf("implicit "); |
dudmuck | 0:f8bc33804548 | 471 | else |
dudmuck | 0:f8bc33804548 | 472 | printf("explicit "); |
dudmuck | 0:f8bc33804548 | 473 | } |
dudmuck | 0:f8bc33804548 | 474 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 475 | |
dudmuck | 0:f8bc33804548 | 476 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 477 | void printBw() |
dudmuck | 0:f8bc33804548 | 478 | { |
dudmuck | 1:d25ba61cd2f3 | 479 | uint8_t bw = lora.getBw(); |
dudmuck | 0:f8bc33804548 | 480 | |
dudmuck | 0:f8bc33804548 | 481 | printf("Bw:"); |
dudmuck | 0:f8bc33804548 | 482 | if (radio.type == SX1276) { |
dudmuck | 1:d25ba61cd2f3 | 483 | switch (lora.RegModemConfig.sx1276bits.Bw) { |
dudmuck | 0:f8bc33804548 | 484 | case 0: printf("7.8KHz "); break; |
dudmuck | 0:f8bc33804548 | 485 | case 1: printf("10.4KHz "); break; |
dudmuck | 0:f8bc33804548 | 486 | case 2: printf("15.6KHz "); break; |
dudmuck | 0:f8bc33804548 | 487 | case 3: printf("20.8KHz "); break; |
dudmuck | 0:f8bc33804548 | 488 | case 4: printf("31.25KHz "); break; |
dudmuck | 0:f8bc33804548 | 489 | case 5: printf("41.7KHz "); break; |
dudmuck | 0:f8bc33804548 | 490 | case 6: printf("62.5KHz "); break; |
dudmuck | 0:f8bc33804548 | 491 | case 7: printf("125KHz "); break; |
dudmuck | 0:f8bc33804548 | 492 | case 8: printf("250KHz "); break; |
dudmuck | 0:f8bc33804548 | 493 | case 9: printf("500KHz "); break; |
dudmuck | 1:d25ba61cd2f3 | 494 | default: printf("%x ", lora.RegModemConfig.sx1276bits.Bw); break; |
dudmuck | 0:f8bc33804548 | 495 | } |
dudmuck | 0:f8bc33804548 | 496 | } else if (radio.type == SX1272) { |
dudmuck | 1:d25ba61cd2f3 | 497 | switch (lora.RegModemConfig.sx1272bits.Bw) { |
dudmuck | 0:f8bc33804548 | 498 | case 0: printf("125KHz "); break; |
dudmuck | 0:f8bc33804548 | 499 | case 1: printf("250KHz "); break; |
dudmuck | 0:f8bc33804548 | 500 | case 2: printf("500KHz "); break; |
dudmuck | 0:f8bc33804548 | 501 | case 3: printf("11b "); break; |
dudmuck | 0:f8bc33804548 | 502 | } |
dudmuck | 0:f8bc33804548 | 503 | } |
dudmuck | 0:f8bc33804548 | 504 | } |
dudmuck | 0:f8bc33804548 | 505 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 506 | |
dudmuck | 0:f8bc33804548 | 507 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 508 | void printSf() |
dudmuck | 0:f8bc33804548 | 509 | { |
dudmuck | 0:f8bc33804548 | 510 | // spreading factor same between sx127[26] |
dudmuck | 1:d25ba61cd2f3 | 511 | printf("sf:%d ", lora.getSf()); |
dudmuck | 0:f8bc33804548 | 512 | } |
dudmuck | 0:f8bc33804548 | 513 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 514 | |
dudmuck | 0:f8bc33804548 | 515 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 516 | void printTxContinuousMode() |
dudmuck | 0:f8bc33804548 | 517 | { |
dudmuck | 1:d25ba61cd2f3 | 518 | printf("TxContinuousMode:%d ", lora.RegModemConfig2.sx1276bits.TxContinuousMode); // same for sx1272 and sx1276 |
dudmuck | 0:f8bc33804548 | 519 | } |
dudmuck | 0:f8bc33804548 | 520 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 521 | |
dudmuck | 0:f8bc33804548 | 522 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 523 | void printAgcAutoOn() |
dudmuck | 0:f8bc33804548 | 524 | { |
dudmuck | 1:d25ba61cd2f3 | 525 | printf("AgcAutoOn:%d", lora.getAgcAutoOn()); |
dudmuck | 0:f8bc33804548 | 526 | } |
dudmuck | 0:f8bc33804548 | 527 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 528 | |
dudmuck | 0:f8bc33804548 | 529 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 530 | void printRxPayloadCrcOn() |
dudmuck | 0:f8bc33804548 | 531 | { |
dudmuck | 1:d25ba61cd2f3 | 532 | bool on = lora.getRxPayloadCrcOn(); |
dudmuck | 0:f8bc33804548 | 533 | //printf("RxPayloadCrcOn:%s ", on ? "on" : "off"); |
dudmuck | 0:f8bc33804548 | 534 | if (on) |
dudmuck | 0:f8bc33804548 | 535 | printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n"); |
dudmuck | 0:f8bc33804548 | 536 | else |
dudmuck | 0:f8bc33804548 | 537 | printf("RxPayloadCrcOn:1 = no Tx CRC\r\n"); |
dudmuck | 0:f8bc33804548 | 538 | } |
dudmuck | 0:f8bc33804548 | 539 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 540 | |
dudmuck | 0:f8bc33804548 | 541 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 542 | void printLoraIrqs_(bool clear) |
dudmuck | 0:f8bc33804548 | 543 | { |
dudmuck | 0:f8bc33804548 | 544 | //in radio class -- RegIrqFlags_t RegIrqFlags; |
dudmuck | 0:f8bc33804548 | 545 | |
dudmuck | 0:f8bc33804548 | 546 | //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); |
dudmuck | 0:f8bc33804548 | 547 | printf("\r\nIrqFlags:"); |
dudmuck | 1:d25ba61cd2f3 | 548 | if (lora.RegIrqFlags.bits.CadDetected) |
dudmuck | 0:f8bc33804548 | 549 | printf("CadDetected "); |
dudmuck | 1:d25ba61cd2f3 | 550 | if (lora.RegIrqFlags.bits.FhssChangeChannel) { |
dudmuck | 0:f8bc33804548 | 551 | //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL); |
dudmuck | 1:d25ba61cd2f3 | 552 | printf("FhssChangeChannel:%d ", lora.RegHopChannel.bits.FhssPresentChannel); |
dudmuck | 0:f8bc33804548 | 553 | } |
dudmuck | 1:d25ba61cd2f3 | 554 | if (lora.RegIrqFlags.bits.CadDone) |
dudmuck | 0:f8bc33804548 | 555 | printf("CadDone "); |
dudmuck | 1:d25ba61cd2f3 | 556 | if (lora.RegIrqFlags.bits.TxDone) |
dudmuck | 0:f8bc33804548 | 557 | printf("TxDone "); |
dudmuck | 1:d25ba61cd2f3 | 558 | if (lora.RegIrqFlags.bits.ValidHeader) |
dudmuck | 0:f8bc33804548 | 559 | printf("[42mValidHeader[0m "); |
dudmuck | 1:d25ba61cd2f3 | 560 | if (lora.RegIrqFlags.bits.PayloadCrcError) |
dudmuck | 0:f8bc33804548 | 561 | printf("[41mPayloadCrcError[0m "); |
dudmuck | 1:d25ba61cd2f3 | 562 | if (lora.RegIrqFlags.bits.RxDone) |
dudmuck | 0:f8bc33804548 | 563 | printf("[42mRxDone[0m "); |
dudmuck | 1:d25ba61cd2f3 | 564 | if (lora.RegIrqFlags.bits.RxTimeout) |
dudmuck | 0:f8bc33804548 | 565 | printf("RxTimeout "); |
dudmuck | 0:f8bc33804548 | 566 | |
dudmuck | 0:f8bc33804548 | 567 | printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 568 | |
dudmuck | 0:f8bc33804548 | 569 | if (clear) |
dudmuck | 1:d25ba61cd2f3 | 570 | radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet); |
dudmuck | 0:f8bc33804548 | 571 | |
dudmuck | 0:f8bc33804548 | 572 | } |
dudmuck | 0:f8bc33804548 | 573 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 574 | |
dudmuck | 0:f8bc33804548 | 575 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 576 | void lora_print_status() |
dudmuck | 0:f8bc33804548 | 577 | { |
dudmuck | 0:f8bc33804548 | 578 | uint8_t d; |
dudmuck | 0:f8bc33804548 | 579 | |
dudmuck | 0:f8bc33804548 | 580 | if (radio.type == SX1276) |
dudmuck | 0:f8bc33804548 | 581 | printf("\r\nSX1276 "); |
dudmuck | 0:f8bc33804548 | 582 | else if (radio.type == SX1272) |
dudmuck | 0:f8bc33804548 | 583 | printf("\r\nSX1272 "); |
dudmuck | 0:f8bc33804548 | 584 | |
dudmuck | 0:f8bc33804548 | 585 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:f8bc33804548 | 586 | if (!radio.RegOpMode.bits.LongRangeMode) { |
dudmuck | 0:f8bc33804548 | 587 | printf("FSK\r\n"); |
dudmuck | 0:f8bc33804548 | 588 | return; |
dudmuck | 0:f8bc33804548 | 589 | } |
dudmuck | 0:f8bc33804548 | 590 | |
dudmuck | 0:f8bc33804548 | 591 | lora_print_dio(); |
dudmuck | 0:f8bc33804548 | 592 | printf("LoRa "); |
dudmuck | 0:f8bc33804548 | 593 | |
dudmuck | 0:f8bc33804548 | 594 | // printing LoRa registers at 0x0d -> 0x3f |
dudmuck | 0:f8bc33804548 | 595 | |
dudmuck | 1:d25ba61cd2f3 | 596 | lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 1:d25ba61cd2f3 | 597 | lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 0:f8bc33804548 | 598 | |
dudmuck | 0:f8bc33804548 | 599 | printCodingRate(false); // false: transmitted coding rate |
dudmuck | 0:f8bc33804548 | 600 | printHeaderMode(); |
dudmuck | 0:f8bc33804548 | 601 | printBw(); |
dudmuck | 0:f8bc33804548 | 602 | printSf(); |
dudmuck | 0:f8bc33804548 | 603 | printRxPayloadCrcOn(); |
dudmuck | 0:f8bc33804548 | 604 | // RegModemStat |
dudmuck | 0:f8bc33804548 | 605 | printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT)); |
dudmuck | 0:f8bc33804548 | 606 | |
dudmuck | 0:f8bc33804548 | 607 | // fifo ptrs: |
dudmuck | 1:d25ba61cd2f3 | 608 | lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH); |
dudmuck | 1:d25ba61cd2f3 | 609 | lora.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH); |
dudmuck | 0:f8bc33804548 | 610 | printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x", |
dudmuck | 0:f8bc33804548 | 611 | radio.read_reg(REG_LR_FIFOADDRPTR), |
dudmuck | 0:f8bc33804548 | 612 | radio.read_reg(REG_LR_FIFOTXBASEADDR), |
dudmuck | 0:f8bc33804548 | 613 | radio.read_reg(REG_LR_FIFORXBASEADDR), |
dudmuck | 1:d25ba61cd2f3 | 614 | lora.RegPayloadLength, |
dudmuck | 1:d25ba61cd2f3 | 615 | lora.RegRxMaxPayloadLength |
dudmuck | 0:f8bc33804548 | 616 | ); |
dudmuck | 0:f8bc33804548 | 617 | |
dudmuck | 1:d25ba61cd2f3 | 618 | lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); |
dudmuck | 0:f8bc33804548 | 619 | printLoraIrqs_(false); |
dudmuck | 0:f8bc33804548 | 620 | |
dudmuck | 1:d25ba61cd2f3 | 621 | lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD); |
dudmuck | 1:d25ba61cd2f3 | 622 | if (lora.RegHopPeriod != 0) { |
dudmuck | 1:d25ba61cd2f3 | 623 | printf("\r\nHopPeriod:0x%02x\r\n", lora.RegHopPeriod); |
dudmuck | 0:f8bc33804548 | 624 | } |
dudmuck | 0:f8bc33804548 | 625 | |
dudmuck | 0:f8bc33804548 | 626 | printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff); |
dudmuck | 0:f8bc33804548 | 627 | |
dudmuck | 1:d25ba61cd2f3 | 628 | lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB); |
dudmuck | 1:d25ba61cd2f3 | 629 | printf("PreambleLength:0x%03x ", lora.RegPreamble); |
dudmuck | 0:f8bc33804548 | 630 | |
dudmuck | 0:f8bc33804548 | 631 | |
dudmuck | 0:f8bc33804548 | 632 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) { |
dudmuck | 0:f8bc33804548 | 633 | d = radio.read_reg(REG_LR_RSSIVALUE); |
dudmuck | 0:f8bc33804548 | 634 | printf("rssi:%ddBm ", d-120); |
dudmuck | 0:f8bc33804548 | 635 | } |
dudmuck | 0:f8bc33804548 | 636 | |
dudmuck | 0:f8bc33804548 | 637 | printTxContinuousMode(); |
dudmuck | 0:f8bc33804548 | 638 | |
dudmuck | 0:f8bc33804548 | 639 | printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 640 | printAgcAutoOn(); |
dudmuck | 0:f8bc33804548 | 641 | if (radio.type == SX1272) { |
dudmuck | 1:d25ba61cd2f3 | 642 | printf(" LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize); |
dudmuck | 0:f8bc33804548 | 643 | } |
dudmuck | 0:f8bc33804548 | 644 | |
dudmuck | 0:f8bc33804548 | 645 | printf("\r\nHeaderCount:%d PacketCount:%d, ", |
dudmuck | 0:f8bc33804548 | 646 | radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB)); |
dudmuck | 0:f8bc33804548 | 647 | |
dudmuck | 0:f8bc33804548 | 648 | printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD)); |
dudmuck | 1:d25ba61cd2f3 | 649 | lora.RegTest31.octet = radio.read_reg(REG_LR_TEST31); |
dudmuck | 1:d25ba61cd2f3 | 650 | printf("detect_trig_same_peaks_nb:%d\r\n", lora.RegTest31.bits.detect_trig_same_peaks_nb); |
dudmuck | 0:f8bc33804548 | 651 | |
dudmuck | 0:f8bc33804548 | 652 | if (radio.type == SX1272) { |
dudmuck | 1:d25ba61cd2f3 | 653 | lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 1:d25ba61cd2f3 | 654 | printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize); |
dudmuck | 0:f8bc33804548 | 655 | } else if (radio.type == SX1276) { |
dudmuck | 1:d25ba61cd2f3 | 656 | lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3); |
dudmuck | 1:d25ba61cd2f3 | 657 | printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize); |
dudmuck | 0:f8bc33804548 | 658 | } |
dudmuck | 0:f8bc33804548 | 659 | |
dudmuck | 0:f8bc33804548 | 660 | printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 661 | //printf("A %02x\r\n", radio.RegModemConfig2.octet); |
dudmuck | 0:f8bc33804548 | 662 | } |
dudmuck | 0:f8bc33804548 | 663 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 664 | |
dudmuck | 1:d25ba61cd2f3 | 665 | /*void |
dudmuck | 0:f8bc33804548 | 666 | service_radio() |
dudmuck | 0:f8bc33804548 | 667 | { |
dudmuck | 0:f8bc33804548 | 668 | service_action_e act = radio.service(); |
dudmuck | 0:f8bc33804548 | 669 | |
dudmuck | 0:f8bc33804548 | 670 | switch (act) { |
dudmuck | 0:f8bc33804548 | 671 | case SERVICE_READ_FIFO: |
dudmuck | 0:f8bc33804548 | 672 | printf("SERVICE_READ_FIFO\r\n"); |
dudmuck | 0:f8bc33804548 | 673 | // clear Irq flags |
dudmuck | 0:f8bc33804548 | 674 | radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet); |
dudmuck | 0:f8bc33804548 | 675 | break; |
dudmuck | 0:f8bc33804548 | 676 | case SERVICE_TX_DONE: |
dudmuck | 0:f8bc33804548 | 677 | printf("SERVICE_TX_DONE\r\n"); |
dudmuck | 0:f8bc33804548 | 678 | break; |
dudmuck | 0:f8bc33804548 | 679 | case SERVICE_ERROR: |
dudmuck | 0:f8bc33804548 | 680 | printf("error\r\n"); |
dudmuck | 0:f8bc33804548 | 681 | break; |
dudmuck | 0:f8bc33804548 | 682 | } // ...switch (act) |
dudmuck | 1:d25ba61cd2f3 | 683 | }*/ |
dudmuck | 0:f8bc33804548 | 684 | |
dudmuck | 0:f8bc33804548 | 685 | int |
dudmuck | 0:f8bc33804548 | 686 | main(void) |
dudmuck | 0:f8bc33804548 | 687 | { |
dudmuck | 0:f8bc33804548 | 688 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 689 | pc.baud(57600); |
dudmuck | 0:f8bc33804548 | 690 | pc.printf("\r\nstart\r\n"); |
dudmuck | 0:f8bc33804548 | 691 | #endif /* _DEBUG_ */ |
modtronix | 2:1972097c22d1 | 692 | |
modtronix | 2:1972097c22d1 | 693 | //Required for V7 of SX127x library, but V7 doesn't work for this program! |
modtronix | 2:1972097c22d1 | 694 | radio.rf_switch.attach(rfsw_callback); |
dudmuck | 0:f8bc33804548 | 695 | |
dudmuck | 0:f8bc33804548 | 696 | while (1) { |
dudmuck | 0:f8bc33804548 | 697 | //try to read a msg |
dudmuck | 0:f8bc33804548 | 698 | if (hid.readNB(&recv_report)) { |
dudmuck | 0:f8bc33804548 | 699 | HidCmdProcess(); |
dudmuck | 0:f8bc33804548 | 700 | } |
dudmuck | 0:f8bc33804548 | 701 | |
dudmuck | 0:f8bc33804548 | 702 | #ifdef _DEBUG_ |
dudmuck | 0:f8bc33804548 | 703 | if (pc.readable()) { |
dudmuck | 0:f8bc33804548 | 704 | char c = pc.getc(); |
dudmuck | 0:f8bc33804548 | 705 | if (c == 'v') { |
dudmuck | 0:f8bc33804548 | 706 | pc.printf("verbose "); |
dudmuck | 0:f8bc33804548 | 707 | if (verbose) { |
dudmuck | 0:f8bc33804548 | 708 | verbose = 0; |
dudmuck | 0:f8bc33804548 | 709 | pc.printf("off"); |
dudmuck | 0:f8bc33804548 | 710 | } else { |
dudmuck | 0:f8bc33804548 | 711 | verbose = 1; |
dudmuck | 0:f8bc33804548 | 712 | pc.printf("on"); |
dudmuck | 0:f8bc33804548 | 713 | } |
dudmuck | 0:f8bc33804548 | 714 | pc.printf("\r\n"); |
dudmuck | 0:f8bc33804548 | 715 | } else if (c == '.') { |
dudmuck | 0:f8bc33804548 | 716 | common_print_status(); |
dudmuck | 0:f8bc33804548 | 717 | if (radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:f8bc33804548 | 718 | lora_print_status(); |
dudmuck | 0:f8bc33804548 | 719 | else |
dudmuck | 0:f8bc33804548 | 720 | printf("FSK\r\n"); |
dudmuck | 0:f8bc33804548 | 721 | } else if (c == 't') { |
dudmuck | 0:f8bc33804548 | 722 | int i; |
dudmuck | 0:f8bc33804548 | 723 | printf("tx\r\n"); |
dudmuck | 0:f8bc33804548 | 724 | radio.set_opmode(RF_OPMODE_TRANSMITTER); |
dudmuck | 0:f8bc33804548 | 725 | for (i = 0; i < 20; i++) { |
dudmuck | 0:f8bc33804548 | 726 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:f8bc33804548 | 727 | printf("opmode:%02x\r\n", radio.RegOpMode.octet); |
dudmuck | 0:f8bc33804548 | 728 | } |
dudmuck | 0:f8bc33804548 | 729 | } else if (c == 'T') { |
dudmuck | 0:f8bc33804548 | 730 | printf("start_tx\r\n"); |
dudmuck | 1:d25ba61cd2f3 | 731 | lora.RegPayloadLength = 8; |
dudmuck | 1:d25ba61cd2f3 | 732 | radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); |
dudmuck | 1:d25ba61cd2f3 | 733 | lora.start_tx(8); |
dudmuck | 1:d25ba61cd2f3 | 734 | } /*else if (c == 'e') { |
dudmuck | 0:f8bc33804548 | 735 | printf("service_radio\r\n"); |
dudmuck | 0:f8bc33804548 | 736 | service_radio(); |
dudmuck | 1:d25ba61cd2f3 | 737 | }*/ else if (c == 's') { |
dudmuck | 0:f8bc33804548 | 738 | radio.set_opmode(RF_OPMODE_STANDBY); |
dudmuck | 0:f8bc33804548 | 739 | printf("standby\r\n"); |
dudmuck | 0:f8bc33804548 | 740 | } else if (c == 'h') { |
dudmuck | 0:f8bc33804548 | 741 | printf("hwreset\r\n"); |
dudmuck | 0:f8bc33804548 | 742 | radio.hw_reset(); |
dudmuck | 0:f8bc33804548 | 743 | radio.init(); //SX1272Init( ); |
dudmuck | 1:d25ba61cd2f3 | 744 | } /*else if (c == 'l') { |
dudmuck | 0:f8bc33804548 | 745 | radio.SetLoRaOn(!radio.RegOpMode.bits.LongRangeMode); |
dudmuck | 0:f8bc33804548 | 746 | printf("LongRangeMode:%d\r\n", radio.RegOpMode.bits.LongRangeMode); |
dudmuck | 1:d25ba61cd2f3 | 747 | }*/ else if (c == '?') { |
dudmuck | 0:f8bc33804548 | 748 | printf("s standby\r\n"); |
dudmuck | 0:f8bc33804548 | 749 | printf("T lora_start_tx(8)\r\n"); |
dudmuck | 0:f8bc33804548 | 750 | printf(". print status\r\n"); |
dudmuck | 0:f8bc33804548 | 751 | printf("v toggle verbose\r\n"); |
dudmuck | 0:f8bc33804548 | 752 | printf("t tx mode test\r\n"); |
dudmuck | 0:f8bc33804548 | 753 | printf("e manualy service radio once\r\n"); |
dudmuck | 0:f8bc33804548 | 754 | printf("h hwreset, init\r\n"); |
dudmuck | 0:f8bc33804548 | 755 | printf("l toggle lora mode\r\n"); |
dudmuck | 0:f8bc33804548 | 756 | } |
dudmuck | 0:f8bc33804548 | 757 | } // ...if (pc.readable()) |
dudmuck | 0:f8bc33804548 | 758 | #endif /* _DEBUG_ */ |
dudmuck | 0:f8bc33804548 | 759 | |
dudmuck | 0:f8bc33804548 | 760 | } // ...while (1) |
dudmuck | 0:f8bc33804548 | 761 | } |