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