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 wayne roberts

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?

UserRevisionLine numberNew 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("sleep"); break;
dudmuck 0:f8bc33804548 336 case RF_OPMODE_STANDBY: printf("stby"); break;
dudmuck 0:f8bc33804548 337 case RF_OPMODE_SYNTHESIZER_TX: printf("fstx"); break;
dudmuck 0:f8bc33804548 338 case RF_OPMODE_TRANSMITTER: printf("tx"); break;
dudmuck 0:f8bc33804548 339 case RF_OPMODE_SYNTHESIZER_RX: printf("fsrx"); break;
dudmuck 0:f8bc33804548 340 case RF_OPMODE_RECEIVER: printf("rx"); break;
dudmuck 0:f8bc33804548 341 case 6:
dudmuck 0:f8bc33804548 342 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:f8bc33804548 343 printf("rxs");
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("cad");
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("ValidHeader ");
dudmuck 1:d25ba61cd2f3 560 if (lora.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:f8bc33804548 561 printf("PayloadCrcError ");
dudmuck 1:d25ba61cd2f3 562 if (lora.RegIrqFlags.bits.RxDone)
dudmuck 0:f8bc33804548 563 printf("RxDone ");
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 }