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