USB HID bridge between SX127x device and PC GUI

Dependencies:   SX127x USBDevice mbed

/media/uploads/dudmuck/lora.png

This application is a USB bridge between SX1272 or SX1276 transceiver chip and PC GUI. You can use Freescale Freedom instead of an expensive Open4, or another board supported by USBHID. Later, you might then use the freedom board for your own firmware development.

The pre-existing PC GUI checks for product device name of USB device to match a specific string of text.

After you import this program, you will have your own private copy of USB HID driver.

Edit the file USBDevice -> USBHID -> USBHID.cpp:

modification to USB HID driver

/*uint8_t * USBHID::stringIproductDesc() {
    static uint8_t stringIproductDescriptor[] = {
        0x16,                                                       //bLength
        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
        'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device
    };
    return stringIproductDescriptor;
}*/

uint8_t * USBHID::stringIproductDesc() {
    static uint8_t stringIproductDescriptor[] = {
        0x18,                                                       //bLength
        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
        'S',0,'X',0,'1',0,'2',0,'x',0,'x',0,'E',0,'i',0,'g',0,'e',0,'r',0 //bString iProduct - HID device
    };
    return stringIproductDescriptor;
}

Committer:
dudmuck
Date:
Wed Apr 30 23:06:39 2014 +0000
Revision:
1:d25ba61cd2f3
Parent:
0:f8bc33804548
Child:
2:d17ce14e02d7
updated to build with updated sx127x library

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
dudmuck 0:f8bc33804548 7 // pin: 3 8 1 7 10 12 5 20 18
dudmuck 0:f8bc33804548 8 // mosi, miso, sclk, cs, rst, dio0, dio1, fctx, fcps
dudmuck 0:f8bc33804548 9 SX127x radio(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13, PTD4, PTC9, PTC8);
dudmuck 1:d25ba61cd2f3 10 #ifdef _DEBUG_
dudmuck 1:d25ba61cd2f3 11 #include "sx127x_lora.h"
dudmuck 1:d25ba61cd2f3 12 SX127x_lora lora(radio);
dudmuck 1:d25ba61cd2f3 13 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 14
dudmuck 0:f8bc33804548 15 //We declare a USBHID device. By default input and output reports are 64 bytes long.
dudmuck 0:f8bc33804548 16 USBHID hid(64, 64, 0x47a, 0x0b);
dudmuck 0:f8bc33804548 17 //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 18
dudmuck 0:f8bc33804548 19 Serial pc(USBTX, USBRX);
dudmuck 0:f8bc33804548 20
dudmuck 0:f8bc33804548 21 //This report will contain data to be sent
dudmuck 0:f8bc33804548 22 HID_REPORT send_report;
dudmuck 0:f8bc33804548 23 HID_REPORT recv_report;
dudmuck 0:f8bc33804548 24
dudmuck 0:f8bc33804548 25 DigitalOut l1(LED1);
dudmuck 0:f8bc33804548 26
dudmuck 0:f8bc33804548 27 #define FW_VERSION "3.1.0"
dudmuck 0:f8bc33804548 28 #define SK_NAME "mbed"
dudmuck 0:f8bc33804548 29
dudmuck 0:f8bc33804548 30 #define HID_SK_RESET 0x00
dudmuck 0:f8bc33804548 31 #define HID_SK_GET_VERSION 0x01
dudmuck 0:f8bc33804548 32 #define HID_SK_GET_NAME 0x02
dudmuck 0:f8bc33804548 33 #define HID_SK_GET_PIN 0x10
dudmuck 0:f8bc33804548 34 #define HID_SK_SET_PIN 0x11
dudmuck 0:f8bc33804548 35 #define HID_SK_GET_PINS 0x14
dudmuck 0:f8bc33804548 36 #define HID_DEVICE_READ 0x80
dudmuck 0:f8bc33804548 37 #define HID_DEVICE_WRITE 0x81
dudmuck 0:f8bc33804548 38 #define HID_DEVICE_INIT 0x88
dudmuck 0:f8bc33804548 39 #define HID_DEVICE_RESET 0x89
dudmuck 0:f8bc33804548 40 #define HID_SK_CMD_NONE 0xFF
dudmuck 0:f8bc33804548 41
dudmuck 0:f8bc33804548 42 typedef struct sHidCommand
dudmuck 0:f8bc33804548 43 {
dudmuck 0:f8bc33804548 44 uint8_t Cmd;
dudmuck 0:f8bc33804548 45 uint8_t CmdOpt;
dudmuck 0:f8bc33804548 46 uint8_t CmdDataSize;
dudmuck 0:f8bc33804548 47 uint8_t *CmdData;
dudmuck 0:f8bc33804548 48 } tHidCommand;
dudmuck 0:f8bc33804548 49
dudmuck 0:f8bc33804548 50 typedef enum
dudmuck 0:f8bc33804548 51 {
dudmuck 0:f8bc33804548 52 SX_OK,
dudmuck 0:f8bc33804548 53 SX_ERROR,
dudmuck 0:f8bc33804548 54 SX_BUSY,
dudmuck 0:f8bc33804548 55 SX_EMPTY,
dudmuck 0:f8bc33804548 56 SX_DONE,
dudmuck 0:f8bc33804548 57 SX_TIMEOUT,
dudmuck 0:f8bc33804548 58 SX_UNSUPPORTED,
dudmuck 0:f8bc33804548 59 SX_WAIT,
dudmuck 0:f8bc33804548 60 SX_CLOSE,
dudmuck 0:f8bc33804548 61 SX_YES,
dudmuck 0:f8bc33804548 62 SX_NO,
dudmuck 0:f8bc33804548 63 } tReturnCodes;
dudmuck 0:f8bc33804548 64
dudmuck 0:f8bc33804548 65 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 66 char verbose = 0;
dudmuck 0:f8bc33804548 67 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 68
dudmuck 0:f8bc33804548 69 void HidDecodeCommand( uint8_t *hidReport, tHidCommand *cmd )
dudmuck 0:f8bc33804548 70 {
dudmuck 0:f8bc33804548 71 cmd->Cmd = hidReport[0];
dudmuck 0:f8bc33804548 72 cmd->CmdOpt = hidReport[1];
dudmuck 0:f8bc33804548 73 cmd->CmdDataSize = hidReport[2];
dudmuck 0:f8bc33804548 74 cmd->CmdData = hidReport + 3;
dudmuck 0:f8bc33804548 75 }
dudmuck 0:f8bc33804548 76
dudmuck 0:f8bc33804548 77 void HidEncodeCommandAns( uint8_t cmd, uint8_t stat, uint8_t dataSize, uint8_t *data )
dudmuck 0:f8bc33804548 78 {
dudmuck 0:f8bc33804548 79 send_report.data[0] = cmd;
dudmuck 0:f8bc33804548 80 send_report.data[1] = stat;
dudmuck 0:f8bc33804548 81
dudmuck 0:f8bc33804548 82 // TimeStamp
dudmuck 0:f8bc33804548 83 memset( send_report.data + 2, 0, 8 );
dudmuck 0:f8bc33804548 84
dudmuck 0:f8bc33804548 85 send_report.data[10] = dataSize;
dudmuck 0:f8bc33804548 86 memcpy( send_report.data + 11, ( const void* )data, dataSize );
dudmuck 0:f8bc33804548 87
dudmuck 0:f8bc33804548 88 //send_report.length = 11 + dataSize;
dudmuck 0:f8bc33804548 89 send_report.length = 64;
dudmuck 0:f8bc33804548 90 hid.send(&send_report);
dudmuck 0:f8bc33804548 91 }
dudmuck 0:f8bc33804548 92
dudmuck 0:f8bc33804548 93 void HidCmdProcess(void)
dudmuck 0:f8bc33804548 94 {
dudmuck 0:f8bc33804548 95 uint8_t stat = SX_OK;
dudmuck 0:f8bc33804548 96 uint8_t size = 0;
dudmuck 0:f8bc33804548 97 uint8_t dataBuffer[64];
dudmuck 0:f8bc33804548 98 tHidCommand cmd = { HID_SK_CMD_NONE, 0, 0, NULL };
dudmuck 0:f8bc33804548 99 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 100 int i;
dudmuck 0:f8bc33804548 101 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 102
dudmuck 0:f8bc33804548 103 HidDecodeCommand(recv_report.data, &cmd);
dudmuck 0:f8bc33804548 104
dudmuck 0:f8bc33804548 105 switch (cmd.Cmd) {
dudmuck 0:f8bc33804548 106 case HID_DEVICE_RESET:
dudmuck 0:f8bc33804548 107 radio.hw_reset();
dudmuck 0:f8bc33804548 108 break;
dudmuck 0:f8bc33804548 109 case HID_SK_RESET:
dudmuck 0:f8bc33804548 110 case HID_DEVICE_INIT:
dudmuck 0:f8bc33804548 111 radio.hw_reset();
dudmuck 0:f8bc33804548 112 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 113 if (verbose)
dudmuck 0:f8bc33804548 114 printf("reset-init\r\n");
dudmuck 0:f8bc33804548 115 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 116 radio.init(); //SX1272Init( );
dudmuck 0:f8bc33804548 117 // Set FSK modem ON
dudmuck 1:d25ba61cd2f3 118 radio.set_opmode(RF_OPMODE_SLEEP);
dudmuck 1:d25ba61cd2f3 119 radio.RegOpMode.bits.LongRangeMode = 0;
dudmuck 1:d25ba61cd2f3 120 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
dudmuck 1:d25ba61cd2f3 121 //radio.SetLoRaOn( false ); //SX1272SetLoRaOn( false ); // Default radio setting
dudmuck 0:f8bc33804548 122 // Default answer settings
dudmuck 0:f8bc33804548 123 break;
dudmuck 0:f8bc33804548 124 case HID_SK_GET_VERSION:
dudmuck 0:f8bc33804548 125 strcpy( ( char* )dataBuffer, FW_VERSION );
dudmuck 0:f8bc33804548 126 size = strlen( FW_VERSION );
dudmuck 0:f8bc33804548 127 break;
dudmuck 0:f8bc33804548 128 case HID_DEVICE_READ:
dudmuck 0:f8bc33804548 129 // cmd.CmdData[0] = size
dudmuck 0:f8bc33804548 130 // cmd.CmdData[1] = address
dudmuck 0:f8bc33804548 131 size = cmd.CmdData[0];
dudmuck 0:f8bc33804548 132 radio.ReadBuffer( cmd.CmdData[1], dataBuffer, size );
dudmuck 0:f8bc33804548 133 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 134 if (verbose) {
dudmuck 0:f8bc33804548 135 pc.printf("read %d bytes from %02x: ", size, cmd.CmdData[1]);
dudmuck 0:f8bc33804548 136 for (i = 0; i < size; i++)
dudmuck 0:f8bc33804548 137 pc.printf("%02x ", dataBuffer[i]);
dudmuck 0:f8bc33804548 138 pc.printf("\r\n");
dudmuck 0:f8bc33804548 139 }
dudmuck 0:f8bc33804548 140 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 141 stat = SX_OK;
dudmuck 0:f8bc33804548 142 break;
dudmuck 0:f8bc33804548 143 case HID_SK_GET_PINS:
dudmuck 0:f8bc33804548 144 dataBuffer[0] = 0;
dudmuck 0:f8bc33804548 145 if (radio.dio0)
dudmuck 0:f8bc33804548 146 dataBuffer[0] |= 0x01;
dudmuck 0:f8bc33804548 147 if (radio.dio1)
dudmuck 0:f8bc33804548 148 dataBuffer[0] |= 0x02;
dudmuck 0:f8bc33804548 149 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 150 if (verbose && dataBuffer[0] != 0)
dudmuck 0:f8bc33804548 151 printf("HID_SK_GET_PINS:%02x\r\n", dataBuffer[0]);
dudmuck 0:f8bc33804548 152 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 153 /*dataBuffer[0] |= DIO1 << 1;
dudmuck 0:f8bc33804548 154 dataBuffer[0] |= DIO2 << 2;
dudmuck 0:f8bc33804548 155 dataBuffer[0] |= DIO3 << 3;
dudmuck 0:f8bc33804548 156 dataBuffer[0] |= DIO4 << 4;
dudmuck 0:f8bc33804548 157 dataBuffer[0] |= DIO5 << 5;*/
dudmuck 0:f8bc33804548 158 size = 1;
dudmuck 0:f8bc33804548 159 break;
dudmuck 0:f8bc33804548 160 case HID_SK_GET_PIN:
dudmuck 0:f8bc33804548 161 // cmd.CmdData[0] = Pin id
dudmuck 0:f8bc33804548 162 switch( cmd.CmdData[0] ) {
dudmuck 0:f8bc33804548 163 case 11: // FEM_CPS_PIN
dudmuck 0:f8bc33804548 164 dataBuffer[0] = radio.femcps;
dudmuck 0:f8bc33804548 165 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 166 if (verbose)
dudmuck 0:f8bc33804548 167 printf("HID_SK_GET_PIN femcps:%02x\r\n", dataBuffer[0]);
dudmuck 0:f8bc33804548 168 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 169 break;
dudmuck 0:f8bc33804548 170 case 12: // FEM_CTX_PIN
dudmuck 0:f8bc33804548 171 dataBuffer[0] = radio.femctx;
dudmuck 0:f8bc33804548 172 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 173 if (verbose)
dudmuck 0:f8bc33804548 174 printf("HID_SK_GET_PIN femctx:%02x\r\n", dataBuffer[0]);
dudmuck 0:f8bc33804548 175 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 176 break;
dudmuck 0:f8bc33804548 177 default:
dudmuck 0:f8bc33804548 178 dataBuffer[0] = 0xFF; // Signal ID error
dudmuck 0:f8bc33804548 179 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 180 printf("HID_SK_GET_PIN %d\r\n", cmd.CmdData[0]);
dudmuck 0:f8bc33804548 181 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 182 break;
dudmuck 0:f8bc33804548 183 } // ...switch( cmd.CmdData[0] )
dudmuck 0:f8bc33804548 184 break;
dudmuck 0:f8bc33804548 185 case HID_SK_SET_PIN:
dudmuck 0:f8bc33804548 186 // cmd.CmdData[0] = Pin id
dudmuck 0:f8bc33804548 187 // cmd.CmdData[1] = Pin state
dudmuck 0:f8bc33804548 188 switch( cmd.CmdData[0] ) {
dudmuck 0:f8bc33804548 189 case 6:
dudmuck 0:f8bc33804548 190 case 7:
dudmuck 0:f8bc33804548 191 case 8:
dudmuck 0:f8bc33804548 192 // ignore LEDs
dudmuck 0:f8bc33804548 193 break;
dudmuck 0:f8bc33804548 194 case 11: // FEM_CPS_PIN
dudmuck 0:f8bc33804548 195 radio.femcps = cmd.CmdData[1];
dudmuck 0:f8bc33804548 196 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 197 if (verbose)
dudmuck 0:f8bc33804548 198 printf("HID_SK_SET_PIN femcps:%d\r\n", (int)radio.femcps);
dudmuck 0:f8bc33804548 199 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 200 break;
dudmuck 0:f8bc33804548 201 case 12: // FEM_CTX_PIN
dudmuck 0:f8bc33804548 202 radio.femctx = cmd.CmdData[1];
dudmuck 0:f8bc33804548 203 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 204 if (verbose)
dudmuck 0:f8bc33804548 205 printf("HID_SK_SET_PIN femctx:%d\r\n", (int)radio.femctx);
dudmuck 0:f8bc33804548 206 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 207 break;
dudmuck 0:f8bc33804548 208 default:
dudmuck 0:f8bc33804548 209 stat = SX_UNSUPPORTED;
dudmuck 0:f8bc33804548 210 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 211 pc.printf("HID_SK_SET_PIN %d %d\r\n", cmd.CmdData[0], cmd.CmdData[1]);
dudmuck 0:f8bc33804548 212 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 213 break;
dudmuck 0:f8bc33804548 214 } // ...switch( cmd.CmdData[0] )
dudmuck 0:f8bc33804548 215
dudmuck 0:f8bc33804548 216 break;
dudmuck 0:f8bc33804548 217 case HID_DEVICE_WRITE:
dudmuck 0:f8bc33804548 218 // cmd.CmdData[0] = size
dudmuck 0:f8bc33804548 219 // cmd.CmdData[1] = address
dudmuck 0:f8bc33804548 220 // cmd.CmdData[2] = Buffer first byte
dudmuck 0:f8bc33804548 221 // cmd.CmdData[2+(size-1)] = Buffer last byte
dudmuck 0:f8bc33804548 222 radio.WriteBuffer( cmd.CmdData[1], cmd.CmdData + 2, cmd.CmdData[0] );
dudmuck 0:f8bc33804548 223 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 224 if (verbose) {
dudmuck 0:f8bc33804548 225 pc.printf("write %d bytes to %02x: ", cmd.CmdData[0], cmd.CmdData[1]);
dudmuck 0:f8bc33804548 226 for (i = 0; i < cmd.CmdData[0]; i++)
dudmuck 0:f8bc33804548 227 pc.printf("%02x ", cmd.CmdData[2+i]);
dudmuck 0:f8bc33804548 228 pc.printf("\r\n");
dudmuck 0:f8bc33804548 229 }
dudmuck 0:f8bc33804548 230 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 231 stat = SX_OK;
dudmuck 0:f8bc33804548 232 break;
dudmuck 0:f8bc33804548 233 case HID_SK_GET_NAME:
dudmuck 0:f8bc33804548 234 strcpy( ( char* )dataBuffer, SK_NAME );
dudmuck 0:f8bc33804548 235 size = strlen( SK_NAME );
dudmuck 0:f8bc33804548 236 break;
dudmuck 0:f8bc33804548 237 default:
dudmuck 0:f8bc33804548 238 pc.printf("%d: ", recv_report.length);
dudmuck 0:f8bc33804548 239 for(int i = 0; i < recv_report.length; i++) {
dudmuck 0:f8bc33804548 240 pc.printf("%02x ", recv_report.data[i]);
dudmuck 0:f8bc33804548 241 }
dudmuck 0:f8bc33804548 242 pc.printf("\r\n");
dudmuck 0:f8bc33804548 243 stat = SX_UNSUPPORTED;
dudmuck 0:f8bc33804548 244 break;
dudmuck 0:f8bc33804548 245 } // ...switch (cmd.Cmd)
dudmuck 0:f8bc33804548 246
dudmuck 0:f8bc33804548 247 HidEncodeCommandAns( cmd.Cmd, stat, size, dataBuffer);
dudmuck 0:f8bc33804548 248 }
dudmuck 0:f8bc33804548 249
dudmuck 0:f8bc33804548 250 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 251 void printOpMode()
dudmuck 0:f8bc33804548 252 {
dudmuck 0:f8bc33804548 253 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:f8bc33804548 254 switch (radio.RegOpMode.bits.Mode) {
dudmuck 0:f8bc33804548 255 case RF_OPMODE_SLEEP: printf("sleep"); break;
dudmuck 0:f8bc33804548 256 case RF_OPMODE_STANDBY: printf("stby"); break;
dudmuck 0:f8bc33804548 257 case RF_OPMODE_SYNTHESIZER_TX: printf("fstx"); break;
dudmuck 0:f8bc33804548 258 case RF_OPMODE_TRANSMITTER: printf("tx"); break;
dudmuck 0:f8bc33804548 259 case RF_OPMODE_SYNTHESIZER_RX: printf("fsrx"); break;
dudmuck 0:f8bc33804548 260 case RF_OPMODE_RECEIVER: printf("rx"); break;
dudmuck 0:f8bc33804548 261 case 6:
dudmuck 0:f8bc33804548 262 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:f8bc33804548 263 printf("rxs");
dudmuck 0:f8bc33804548 264 else
dudmuck 0:f8bc33804548 265 printf("-6-");
dudmuck 0:f8bc33804548 266 break; // todo: different lora/fsk
dudmuck 0:f8bc33804548 267 case 7:
dudmuck 0:f8bc33804548 268 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:f8bc33804548 269 printf("cad");
dudmuck 0:f8bc33804548 270 else
dudmuck 0:f8bc33804548 271 printf("-7-");
dudmuck 0:f8bc33804548 272 break; // todo: different lora/fsk
dudmuck 0:f8bc33804548 273 }
dudmuck 0:f8bc33804548 274 }
dudmuck 0:f8bc33804548 275 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 276
dudmuck 0:f8bc33804548 277 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 278 void
dudmuck 0:f8bc33804548 279 printPa()
dudmuck 0:f8bc33804548 280 {
dudmuck 0:f8bc33804548 281 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:f8bc33804548 282 if (radio.RegPaConfig.bits.PaSelect) {
dudmuck 0:f8bc33804548 283 float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:f8bc33804548 284 printf(" PABOOST OutputPower=%.1fdBm", output_dBm);
dudmuck 0:f8bc33804548 285 } else {
dudmuck 0:f8bc33804548 286 float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8;
dudmuck 0:f8bc33804548 287 float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:f8bc33804548 288 printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm);
dudmuck 0:f8bc33804548 289 }
dudmuck 0:f8bc33804548 290 }
dudmuck 0:f8bc33804548 291 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 292
dudmuck 0:f8bc33804548 293 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 294 void /* things always present, whether lora or fsk */
dudmuck 0:f8bc33804548 295 common_print_status()
dudmuck 0:f8bc33804548 296 {
dudmuck 0:f8bc33804548 297 printf("version:0x%02x %.3fMHz ", radio.read_reg(REG_VERSION), radio.get_frf_MHz());
dudmuck 0:f8bc33804548 298 printOpMode();
dudmuck 0:f8bc33804548 299
dudmuck 0:f8bc33804548 300 printPa();
dudmuck 0:f8bc33804548 301
dudmuck 0:f8bc33804548 302 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 0:f8bc33804548 303 if (radio.RegOcp.bits.OcpOn) {
dudmuck 0:f8bc33804548 304 int imax = 0;
dudmuck 0:f8bc33804548 305 if (radio.RegOcp.bits.OcpTrim < 16)
dudmuck 0:f8bc33804548 306 imax = 45 + (5 * radio.RegOcp.bits.OcpTrim);
dudmuck 0:f8bc33804548 307 else if (radio.RegOcp.bits.OcpTrim < 28)
dudmuck 0:f8bc33804548 308 imax = -30 + (10 * radio.RegOcp.bits.OcpTrim);
dudmuck 0:f8bc33804548 309 else
dudmuck 0:f8bc33804548 310 imax = 240;
dudmuck 0:f8bc33804548 311 printf(" OcpOn %dmA ", imax);
dudmuck 0:f8bc33804548 312 } else
dudmuck 0:f8bc33804548 313 printf(" OcpOFF ");
dudmuck 0:f8bc33804548 314
dudmuck 0:f8bc33804548 315 printf("\r\n");
dudmuck 0:f8bc33804548 316
dudmuck 0:f8bc33804548 317 }
dudmuck 0:f8bc33804548 318 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 319
dudmuck 0:f8bc33804548 320 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 321 void lora_print_dio()
dudmuck 0:f8bc33804548 322 {
dudmuck 0:f8bc33804548 323 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
dudmuck 0:f8bc33804548 324 printf("DIO5:");
dudmuck 0:f8bc33804548 325 switch (radio.RegDioMapping2.bits.Dio5Mapping) {
dudmuck 0:f8bc33804548 326 case 0: printf("ModeReady"); break;
dudmuck 0:f8bc33804548 327 case 1: printf("ClkOut"); break;
dudmuck 0:f8bc33804548 328 case 2: printf("ClkOut"); break;
dudmuck 0:f8bc33804548 329 }
dudmuck 0:f8bc33804548 330 printf(" DIO4:");
dudmuck 0:f8bc33804548 331 switch (radio.RegDioMapping2.bits.Dio4Mapping) {
dudmuck 0:f8bc33804548 332 case 0: printf("CadDetected"); break;
dudmuck 0:f8bc33804548 333 case 1: printf("PllLock"); break;
dudmuck 0:f8bc33804548 334 case 2: printf("PllLock"); break;
dudmuck 0:f8bc33804548 335 }
dudmuck 0:f8bc33804548 336 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
dudmuck 0:f8bc33804548 337 printf(" DIO3:");
dudmuck 0:f8bc33804548 338 switch (radio.RegDioMapping1.bits.Dio3Mapping) {
dudmuck 0:f8bc33804548 339 case 0: printf("CadDone"); break;
dudmuck 0:f8bc33804548 340 case 1: printf("ValidHeader"); break;
dudmuck 0:f8bc33804548 341 case 2: printf("PayloadCrcError"); break;
dudmuck 0:f8bc33804548 342 }
dudmuck 0:f8bc33804548 343 printf(" DIO2:");
dudmuck 0:f8bc33804548 344 switch (radio.RegDioMapping1.bits.Dio2Mapping) {
dudmuck 0:f8bc33804548 345 case 0:
dudmuck 0:f8bc33804548 346 case 1:
dudmuck 0:f8bc33804548 347 case 2:
dudmuck 0:f8bc33804548 348 printf("FhssChangeChannel");
dudmuck 0:f8bc33804548 349 break;
dudmuck 0:f8bc33804548 350 }
dudmuck 0:f8bc33804548 351 printf(" DIO1:");
dudmuck 0:f8bc33804548 352 switch (radio.RegDioMapping1.bits.Dio1Mapping) {
dudmuck 0:f8bc33804548 353 case 0: printf("RxTimeout"); break;
dudmuck 0:f8bc33804548 354 case 1: printf("FhssChangeChannel"); break;
dudmuck 0:f8bc33804548 355 case 2: printf("CadDetected"); break;
dudmuck 0:f8bc33804548 356 }
dudmuck 0:f8bc33804548 357 printf(" DIO0:");
dudmuck 0:f8bc33804548 358 switch (radio.RegDioMapping1.bits.Dio0Mapping) {
dudmuck 0:f8bc33804548 359 case 0: printf("RxDone"); break;
dudmuck 0:f8bc33804548 360 case 1: printf("TxDone"); break;
dudmuck 0:f8bc33804548 361 case 2: printf("CadDone"); break;
dudmuck 0:f8bc33804548 362 }
dudmuck 0:f8bc33804548 363
dudmuck 0:f8bc33804548 364 printf("\r\n");
dudmuck 0:f8bc33804548 365 }
dudmuck 0:f8bc33804548 366 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 367
dudmuck 0:f8bc33804548 368 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 369 void
dudmuck 0:f8bc33804548 370 printCodingRate(bool from_rx)
dudmuck 0:f8bc33804548 371 {
dudmuck 1:d25ba61cd2f3 372 uint8_t d = lora.getCodingRate(from_rx);
dudmuck 0:f8bc33804548 373 printf("CodingRate:");
dudmuck 0:f8bc33804548 374 switch (d) {
dudmuck 0:f8bc33804548 375 case 1: printf("4/5 "); break;
dudmuck 0:f8bc33804548 376 case 2: printf("4/6 "); break;
dudmuck 0:f8bc33804548 377 case 3: printf("4/7 "); break;
dudmuck 0:f8bc33804548 378 case 4: printf("4/8 "); break;
dudmuck 0:f8bc33804548 379 default:
dudmuck 0:f8bc33804548 380 printf("%d ", d);
dudmuck 0:f8bc33804548 381 break;
dudmuck 0:f8bc33804548 382 }
dudmuck 0:f8bc33804548 383 }
dudmuck 0:f8bc33804548 384 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 385
dudmuck 0:f8bc33804548 386 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 387 void printHeaderMode()
dudmuck 0:f8bc33804548 388 {
dudmuck 1:d25ba61cd2f3 389 if (lora.getHeaderMode())
dudmuck 0:f8bc33804548 390 printf("implicit ");
dudmuck 0:f8bc33804548 391 else
dudmuck 0:f8bc33804548 392 printf("explicit ");
dudmuck 0:f8bc33804548 393 }
dudmuck 0:f8bc33804548 394 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 395
dudmuck 0:f8bc33804548 396 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 397 void printBw()
dudmuck 0:f8bc33804548 398 {
dudmuck 1:d25ba61cd2f3 399 uint8_t bw = lora.getBw();
dudmuck 0:f8bc33804548 400
dudmuck 0:f8bc33804548 401 printf("Bw:");
dudmuck 0:f8bc33804548 402 if (radio.type == SX1276) {
dudmuck 1:d25ba61cd2f3 403 switch (lora.RegModemConfig.sx1276bits.Bw) {
dudmuck 0:f8bc33804548 404 case 0: printf("7.8KHz "); break;
dudmuck 0:f8bc33804548 405 case 1: printf("10.4KHz "); break;
dudmuck 0:f8bc33804548 406 case 2: printf("15.6KHz "); break;
dudmuck 0:f8bc33804548 407 case 3: printf("20.8KHz "); break;
dudmuck 0:f8bc33804548 408 case 4: printf("31.25KHz "); break;
dudmuck 0:f8bc33804548 409 case 5: printf("41.7KHz "); break;
dudmuck 0:f8bc33804548 410 case 6: printf("62.5KHz "); break;
dudmuck 0:f8bc33804548 411 case 7: printf("125KHz "); break;
dudmuck 0:f8bc33804548 412 case 8: printf("250KHz "); break;
dudmuck 0:f8bc33804548 413 case 9: printf("500KHz "); break;
dudmuck 1:d25ba61cd2f3 414 default: printf("%x ", lora.RegModemConfig.sx1276bits.Bw); break;
dudmuck 0:f8bc33804548 415 }
dudmuck 0:f8bc33804548 416 } else if (radio.type == SX1272) {
dudmuck 1:d25ba61cd2f3 417 switch (lora.RegModemConfig.sx1272bits.Bw) {
dudmuck 0:f8bc33804548 418 case 0: printf("125KHz "); break;
dudmuck 0:f8bc33804548 419 case 1: printf("250KHz "); break;
dudmuck 0:f8bc33804548 420 case 2: printf("500KHz "); break;
dudmuck 0:f8bc33804548 421 case 3: printf("11b "); break;
dudmuck 0:f8bc33804548 422 }
dudmuck 0:f8bc33804548 423 }
dudmuck 0:f8bc33804548 424 }
dudmuck 0:f8bc33804548 425 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 426
dudmuck 0:f8bc33804548 427 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 428 void printSf()
dudmuck 0:f8bc33804548 429 {
dudmuck 0:f8bc33804548 430 // spreading factor same between sx127[26]
dudmuck 1:d25ba61cd2f3 431 printf("sf:%d ", lora.getSf());
dudmuck 0:f8bc33804548 432 }
dudmuck 0:f8bc33804548 433 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 434
dudmuck 0:f8bc33804548 435 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 436 void printTxContinuousMode()
dudmuck 0:f8bc33804548 437 {
dudmuck 1:d25ba61cd2f3 438 printf("TxContinuousMode:%d ", lora.RegModemConfig2.sx1276bits.TxContinuousMode); // same for sx1272 and sx1276
dudmuck 0:f8bc33804548 439 }
dudmuck 0:f8bc33804548 440 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 441
dudmuck 0:f8bc33804548 442 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 443 void printAgcAutoOn()
dudmuck 0:f8bc33804548 444 {
dudmuck 1:d25ba61cd2f3 445 printf("AgcAutoOn:%d", lora.getAgcAutoOn());
dudmuck 0:f8bc33804548 446 }
dudmuck 0:f8bc33804548 447 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 448
dudmuck 0:f8bc33804548 449 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 450 void printRxPayloadCrcOn()
dudmuck 0:f8bc33804548 451 {
dudmuck 1:d25ba61cd2f3 452 bool on = lora.getRxPayloadCrcOn();
dudmuck 0:f8bc33804548 453 //printf("RxPayloadCrcOn:%s ", on ? "on" : "off");
dudmuck 0:f8bc33804548 454 if (on)
dudmuck 0:f8bc33804548 455 printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n");
dudmuck 0:f8bc33804548 456 else
dudmuck 0:f8bc33804548 457 printf("RxPayloadCrcOn:1 = no Tx CRC\r\n");
dudmuck 0:f8bc33804548 458 }
dudmuck 0:f8bc33804548 459 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 460
dudmuck 0:f8bc33804548 461 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 462 void printLoraIrqs_(bool clear)
dudmuck 0:f8bc33804548 463 {
dudmuck 0:f8bc33804548 464 //in radio class -- RegIrqFlags_t RegIrqFlags;
dudmuck 0:f8bc33804548 465
dudmuck 0:f8bc33804548 466 //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:f8bc33804548 467 printf("\r\nIrqFlags:");
dudmuck 1:d25ba61cd2f3 468 if (lora.RegIrqFlags.bits.CadDetected)
dudmuck 0:f8bc33804548 469 printf("CadDetected ");
dudmuck 1:d25ba61cd2f3 470 if (lora.RegIrqFlags.bits.FhssChangeChannel) {
dudmuck 0:f8bc33804548 471 //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 1:d25ba61cd2f3 472 printf("FhssChangeChannel:%d ", lora.RegHopChannel.bits.FhssPresentChannel);
dudmuck 0:f8bc33804548 473 }
dudmuck 1:d25ba61cd2f3 474 if (lora.RegIrqFlags.bits.CadDone)
dudmuck 0:f8bc33804548 475 printf("CadDone ");
dudmuck 1:d25ba61cd2f3 476 if (lora.RegIrqFlags.bits.TxDone)
dudmuck 0:f8bc33804548 477 printf("TxDone ");
dudmuck 1:d25ba61cd2f3 478 if (lora.RegIrqFlags.bits.ValidHeader)
dudmuck 0:f8bc33804548 479 printf("ValidHeader ");
dudmuck 1:d25ba61cd2f3 480 if (lora.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:f8bc33804548 481 printf("PayloadCrcError ");
dudmuck 1:d25ba61cd2f3 482 if (lora.RegIrqFlags.bits.RxDone)
dudmuck 0:f8bc33804548 483 printf("RxDone ");
dudmuck 1:d25ba61cd2f3 484 if (lora.RegIrqFlags.bits.RxTimeout)
dudmuck 0:f8bc33804548 485 printf("RxTimeout ");
dudmuck 0:f8bc33804548 486
dudmuck 0:f8bc33804548 487 printf("\r\n");
dudmuck 0:f8bc33804548 488
dudmuck 0:f8bc33804548 489 if (clear)
dudmuck 1:d25ba61cd2f3 490 radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet);
dudmuck 0:f8bc33804548 491
dudmuck 0:f8bc33804548 492 }
dudmuck 0:f8bc33804548 493 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 494
dudmuck 0:f8bc33804548 495 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 496 void lora_print_status()
dudmuck 0:f8bc33804548 497 {
dudmuck 0:f8bc33804548 498 uint8_t d;
dudmuck 0:f8bc33804548 499
dudmuck 0:f8bc33804548 500 if (radio.type == SX1276)
dudmuck 0:f8bc33804548 501 printf("\r\nSX1276 ");
dudmuck 0:f8bc33804548 502 else if (radio.type == SX1272)
dudmuck 0:f8bc33804548 503 printf("\r\nSX1272 ");
dudmuck 0:f8bc33804548 504
dudmuck 0:f8bc33804548 505 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:f8bc33804548 506 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:f8bc33804548 507 printf("FSK\r\n");
dudmuck 0:f8bc33804548 508 return;
dudmuck 0:f8bc33804548 509 }
dudmuck 0:f8bc33804548 510
dudmuck 0:f8bc33804548 511 lora_print_dio();
dudmuck 0:f8bc33804548 512 printf("LoRa ");
dudmuck 0:f8bc33804548 513
dudmuck 0:f8bc33804548 514 // printing LoRa registers at 0x0d -> 0x3f
dudmuck 0:f8bc33804548 515
dudmuck 1:d25ba61cd2f3 516 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 1:d25ba61cd2f3 517 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:f8bc33804548 518
dudmuck 0:f8bc33804548 519 printCodingRate(false); // false: transmitted coding rate
dudmuck 0:f8bc33804548 520 printHeaderMode();
dudmuck 0:f8bc33804548 521 printBw();
dudmuck 0:f8bc33804548 522 printSf();
dudmuck 0:f8bc33804548 523 printRxPayloadCrcOn();
dudmuck 0:f8bc33804548 524 // RegModemStat
dudmuck 0:f8bc33804548 525 printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT));
dudmuck 0:f8bc33804548 526
dudmuck 0:f8bc33804548 527 // fifo ptrs:
dudmuck 1:d25ba61cd2f3 528 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 1:d25ba61cd2f3 529 lora.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
dudmuck 0:f8bc33804548 530 printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x",
dudmuck 0:f8bc33804548 531 radio.read_reg(REG_LR_FIFOADDRPTR),
dudmuck 0:f8bc33804548 532 radio.read_reg(REG_LR_FIFOTXBASEADDR),
dudmuck 0:f8bc33804548 533 radio.read_reg(REG_LR_FIFORXBASEADDR),
dudmuck 1:d25ba61cd2f3 534 lora.RegPayloadLength,
dudmuck 1:d25ba61cd2f3 535 lora.RegRxMaxPayloadLength
dudmuck 0:f8bc33804548 536 );
dudmuck 0:f8bc33804548 537
dudmuck 1:d25ba61cd2f3 538 lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:f8bc33804548 539 printLoraIrqs_(false);
dudmuck 0:f8bc33804548 540
dudmuck 1:d25ba61cd2f3 541 lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 1:d25ba61cd2f3 542 if (lora.RegHopPeriod != 0) {
dudmuck 1:d25ba61cd2f3 543 printf("\r\nHopPeriod:0x%02x\r\n", lora.RegHopPeriod);
dudmuck 0:f8bc33804548 544 }
dudmuck 0:f8bc33804548 545
dudmuck 0:f8bc33804548 546 printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff);
dudmuck 0:f8bc33804548 547
dudmuck 1:d25ba61cd2f3 548 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
dudmuck 1:d25ba61cd2f3 549 printf("PreambleLength:0x%03x ", lora.RegPreamble);
dudmuck 0:f8bc33804548 550
dudmuck 0:f8bc33804548 551
dudmuck 0:f8bc33804548 552 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) {
dudmuck 0:f8bc33804548 553 d = radio.read_reg(REG_LR_RSSIVALUE);
dudmuck 0:f8bc33804548 554 printf("rssi:%ddBm ", d-120);
dudmuck 0:f8bc33804548 555 }
dudmuck 0:f8bc33804548 556
dudmuck 0:f8bc33804548 557 printTxContinuousMode();
dudmuck 0:f8bc33804548 558
dudmuck 0:f8bc33804548 559 printf("\r\n");
dudmuck 0:f8bc33804548 560 printAgcAutoOn();
dudmuck 0:f8bc33804548 561 if (radio.type == SX1272) {
dudmuck 1:d25ba61cd2f3 562 printf(" LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:f8bc33804548 563 }
dudmuck 0:f8bc33804548 564
dudmuck 0:f8bc33804548 565 printf("\r\nHeaderCount:%d PacketCount:%d, ",
dudmuck 0:f8bc33804548 566 radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB));
dudmuck 0:f8bc33804548 567
dudmuck 0:f8bc33804548 568 printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD));
dudmuck 1:d25ba61cd2f3 569 lora.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
dudmuck 1:d25ba61cd2f3 570 printf("detect_trig_same_peaks_nb:%d\r\n", lora.RegTest31.bits.detect_trig_same_peaks_nb);
dudmuck 0:f8bc33804548 571
dudmuck 0:f8bc33804548 572 if (radio.type == SX1272) {
dudmuck 1:d25ba61cd2f3 573 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 1:d25ba61cd2f3 574 printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:f8bc33804548 575 } else if (radio.type == SX1276) {
dudmuck 1:d25ba61cd2f3 576 lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
dudmuck 1:d25ba61cd2f3 577 printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize);
dudmuck 0:f8bc33804548 578 }
dudmuck 0:f8bc33804548 579
dudmuck 0:f8bc33804548 580 printf("\r\n");
dudmuck 0:f8bc33804548 581 //printf("A %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:f8bc33804548 582 }
dudmuck 0:f8bc33804548 583 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 584
dudmuck 1:d25ba61cd2f3 585 /*void
dudmuck 0:f8bc33804548 586 service_radio()
dudmuck 0:f8bc33804548 587 {
dudmuck 0:f8bc33804548 588 service_action_e act = radio.service();
dudmuck 0:f8bc33804548 589
dudmuck 0:f8bc33804548 590 switch (act) {
dudmuck 0:f8bc33804548 591 case SERVICE_READ_FIFO:
dudmuck 0:f8bc33804548 592 printf("SERVICE_READ_FIFO\r\n");
dudmuck 0:f8bc33804548 593 // clear Irq flags
dudmuck 0:f8bc33804548 594 radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet);
dudmuck 0:f8bc33804548 595 break;
dudmuck 0:f8bc33804548 596 case SERVICE_TX_DONE:
dudmuck 0:f8bc33804548 597 printf("SERVICE_TX_DONE\r\n");
dudmuck 0:f8bc33804548 598 break;
dudmuck 0:f8bc33804548 599 case SERVICE_ERROR:
dudmuck 0:f8bc33804548 600 printf("error\r\n");
dudmuck 0:f8bc33804548 601 break;
dudmuck 0:f8bc33804548 602 } // ...switch (act)
dudmuck 1:d25ba61cd2f3 603 }*/
dudmuck 0:f8bc33804548 604
dudmuck 0:f8bc33804548 605 int
dudmuck 0:f8bc33804548 606 main(void)
dudmuck 0:f8bc33804548 607 {
dudmuck 0:f8bc33804548 608 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 609 pc.baud(57600);
dudmuck 0:f8bc33804548 610 pc.printf("\r\nstart\r\n");
dudmuck 0:f8bc33804548 611 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 612
dudmuck 0:f8bc33804548 613 while (1) {
dudmuck 0:f8bc33804548 614 //try to read a msg
dudmuck 0:f8bc33804548 615 if (hid.readNB(&recv_report)) {
dudmuck 0:f8bc33804548 616 HidCmdProcess();
dudmuck 0:f8bc33804548 617 }
dudmuck 0:f8bc33804548 618
dudmuck 0:f8bc33804548 619 #ifdef _DEBUG_
dudmuck 0:f8bc33804548 620 if (pc.readable()) {
dudmuck 0:f8bc33804548 621 char c = pc.getc();
dudmuck 0:f8bc33804548 622 if (c == 'v') {
dudmuck 0:f8bc33804548 623 pc.printf("verbose ");
dudmuck 0:f8bc33804548 624 if (verbose) {
dudmuck 0:f8bc33804548 625 verbose = 0;
dudmuck 0:f8bc33804548 626 pc.printf("off");
dudmuck 0:f8bc33804548 627 } else {
dudmuck 0:f8bc33804548 628 verbose = 1;
dudmuck 0:f8bc33804548 629 pc.printf("on");
dudmuck 0:f8bc33804548 630 }
dudmuck 0:f8bc33804548 631 pc.printf("\r\n");
dudmuck 0:f8bc33804548 632 } else if (c == '.') {
dudmuck 0:f8bc33804548 633 common_print_status();
dudmuck 0:f8bc33804548 634 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:f8bc33804548 635 lora_print_status();
dudmuck 0:f8bc33804548 636 else
dudmuck 0:f8bc33804548 637 printf("FSK\r\n");
dudmuck 0:f8bc33804548 638 } else if (c == 't') {
dudmuck 0:f8bc33804548 639 int i;
dudmuck 0:f8bc33804548 640 printf("tx\r\n");
dudmuck 0:f8bc33804548 641 radio.set_opmode(RF_OPMODE_TRANSMITTER);
dudmuck 0:f8bc33804548 642 for (i = 0; i < 20; i++) {
dudmuck 0:f8bc33804548 643 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:f8bc33804548 644 printf("opmode:%02x\r\n", radio.RegOpMode.octet);
dudmuck 0:f8bc33804548 645 }
dudmuck 0:f8bc33804548 646 } else if (c == 'T') {
dudmuck 0:f8bc33804548 647 printf("start_tx\r\n");
dudmuck 1:d25ba61cd2f3 648 lora.RegPayloadLength = 8;
dudmuck 1:d25ba61cd2f3 649 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 1:d25ba61cd2f3 650 lora.start_tx(8);
dudmuck 1:d25ba61cd2f3 651 } /*else if (c == 'e') {
dudmuck 0:f8bc33804548 652 printf("service_radio\r\n");
dudmuck 0:f8bc33804548 653 service_radio();
dudmuck 1:d25ba61cd2f3 654 }*/ else if (c == 's') {
dudmuck 0:f8bc33804548 655 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:f8bc33804548 656 printf("standby\r\n");
dudmuck 0:f8bc33804548 657 } else if (c == 'h') {
dudmuck 0:f8bc33804548 658 printf("hwreset\r\n");
dudmuck 0:f8bc33804548 659 radio.hw_reset();
dudmuck 0:f8bc33804548 660 radio.init(); //SX1272Init( );
dudmuck 1:d25ba61cd2f3 661 } /*else if (c == 'l') {
dudmuck 0:f8bc33804548 662 radio.SetLoRaOn(!radio.RegOpMode.bits.LongRangeMode);
dudmuck 0:f8bc33804548 663 printf("LongRangeMode:%d\r\n", radio.RegOpMode.bits.LongRangeMode);
dudmuck 1:d25ba61cd2f3 664 }*/ else if (c == '?') {
dudmuck 0:f8bc33804548 665 printf("s standby\r\n");
dudmuck 0:f8bc33804548 666 printf("T lora_start_tx(8)\r\n");
dudmuck 0:f8bc33804548 667 printf(". print status\r\n");
dudmuck 0:f8bc33804548 668 printf("v toggle verbose\r\n");
dudmuck 0:f8bc33804548 669 printf("t tx mode test\r\n");
dudmuck 0:f8bc33804548 670 printf("e manualy service radio once\r\n");
dudmuck 0:f8bc33804548 671 printf("h hwreset, init\r\n");
dudmuck 0:f8bc33804548 672 printf("l toggle lora mode\r\n");
dudmuck 0:f8bc33804548 673 }
dudmuck 0:f8bc33804548 674 } // ...if (pc.readable())
dudmuck 0:f8bc33804548 675 #endif /* _DEBUG_ */
dudmuck 0:f8bc33804548 676
dudmuck 0:f8bc33804548 677 } // ...while (1)
dudmuck 0:f8bc33804548 678 }