SCPI interface to SX1272 and SX1276
Dependencies: SX127x lib_gps lib_mma8451q lib_mpl3115a2 lib_sx9500 libscpi mbed
Description
This program implements a SCPI command parser. When connected via the debug virtual comm port, you can command the radio and peripherals to perform specific tasks or to set specific parameters. The serial port defaults to 9600bps N-8-1.
Example
The following exampling causes the NA Mote to transmit a continuous LoRa signal.
Example SCPI Commands
*IDN? RA:MOD LORA RA:FREQ 903 RA:PAS PA_BOOST RA:OCP 170 RA:BGR 7 RA:POW 15 RA:LORA:TXContinuous ON RA:FI "test"
Commands
SCPI is case-insensitive. Commands can be entered lower case.
RAdio
:FIfo "text"
write to fifo, and transmit packet:FIfo?
read from fifo (last received packet):REGister { address }, {value}
write radio register (SCPI takes #H for hex prefix):REGister? { address }
read radio register (SCPI takes #H for hex prefix):MODulation { FSK | OOK | LORa }
set modem type:MODulation?
get modem type:OPmode { SLE | STB | FST | TX | FSR | RXC | RXS | CAD }
set mode:OPmode?
get mode:DIOMap { 0 - 5 }, { 0 - 3 }
set DIO pin function {pin number}, {map value}:DIOMap? { 0 - 5 }
get DIO pin function {pin number}:DIO? { 0 - 5 }
read DIO pin level:RSSI?
read received signal strength (if in RXC mode):PASelect { RFO | PA_BOOST }
set RF output pin:PASelect?
get RF output pin selected:OCP {mA}
set over current protection:OCP?
read current limit:POWer {0 to 15}
set OutputPower:POWer?
get OutputPower:BGR { 0 - 7 }
set PA ref current:BGR?
get PA ref current:FREQuency {MHz}
set FRF:FREQuency?
get FRF:LNABoost { OFF | ON }
set LNA boost:LNABoost?
get LNA boost:LORa
:BW {KHz}
set lora bandwidth:BW?
get lora bandwidth (in KHz):SF {7 to 12}
set spreading factor:SF?
get spreading factor:TXContinuous { OFF | ON }
set continuous TX (end transmit by turning off):TXContinuous?
get continuous TX:PRELen {n-symbols}
set preamble length:PRELen?
get preamble length:CR {0-4}
set coding rate:CR?
get coding rate:LDRO { OFF | ON }
set LowDataRateOptimize bit:LDRO?
get LowDataRateOptimize bit:CRC { OFF | ON}
enable CRC in transmitted packet:CRC?
read CRC enabled state:INVRx { OFF | ON }
enable receiver spectral invert:INVRx?
get receiver inversion state:INVTx { OFF | ON }
enable transmitter spectral invert:INVTx?
get transmitter inversion state:FEI?
get frequency error of last received packet:PKTSnr?
get S/N (dB) of last received packet
:FSK
:DATAMode { CONT | PKT }
select continuous/packet mode:DATAMode?
get packet mode / continuous:FDev {Hz}
set TX frequency deviation:FDev?
get TX frequency deviation:BITRate {bps}
set bit rate:BITRate?
get bit rate:BT { 1.0 | 0.5 | 0.3 | 0.0 }
set transmit shaping:BT?
get transmit shaping:PRELen {n}
set preamble size:PRELen?
get preamble size:RXBW {Hz}
set receive bandwidth:RXBW?
set receive bandwidth:AFCBW {Hz}
set receive bandwidth (during preamble):AFCBW?
set receive bandwidth (during preamble):DCFree { OFF | MAN | WHIT }
set DC-free encoding:DCFree?
get DC-free encoding:RXTrigger { OFF | RSSI | PRE | BOTH }
set RX trigger mode:RXTrigger?
get RX trigger selection
radio events
Radio events are reported into the Questionable Data Status Event Register, which is summarized in Bit 3 (QSB) of Status Byte Register.
enabling event and reading event
RA:MOD? "LORa" RA:OP? "RXC" STAT:QUES:ENAB 512 *STB? 8 STAT:QUES:EVEN? 512 RA:FI? "4747474747474747" *STB? 0
Bit 9 of QUEStionable event register indicates DIO0 event occurred upon radio packet reception.
NA Mote-72 specific commands
PD2 { OFF | ON }
set power amplifier voltage statePD2?
get power amplifier voltage stateVBAT?
read battery voltageGPS
:EN { OFF | ON }
enable GPS:EN?
get GPS enabled state:NUMCoords {n}
set count of coordinates received (use to clear count):NUMCoords?
get count of coordinates received:LOngitude {n}
set longitude:LOngitude?
get longitude:LAtitude {n}
set latitude:LAtitude?
get latitude
MMA
MMA8451Q:ID?
read ID register (WHO_AM_I == 0x1a)
MPL
MPL3115A2:ID?
read ID register (WHO_AM_I == 0xc4)
SX9500
:RST
reset SX9500:REGister {addr}, {value}
write SX9500 register:REGister? {addr}
read SX9500 register
scpi-def.cpp@2:547cc73f8887, 2015-08-18 (annotated)
- Committer:
- dudmuck
- Date:
- Tue Aug 18 00:51:59 2015 +0000
- Revision:
- 2:547cc73f8887
- Parent:
- 1:33d322ad66b1
- Child:
- 3:ab152c7086b4
added commands
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudmuck | 0:8767be3c1b7f | 1 | #include <stdio.h> |
dudmuck | 0:8767be3c1b7f | 2 | #include <stdlib.h> |
dudmuck | 0:8767be3c1b7f | 3 | #include <string.h> |
dudmuck | 0:8767be3c1b7f | 4 | #include "scpi/scpi.h" |
dudmuck | 0:8767be3c1b7f | 5 | #include "scpi-def.h" |
dudmuck | 0:8767be3c1b7f | 6 | |
dudmuck | 0:8767be3c1b7f | 7 | #include "sx127x_lora.h" |
dudmuck | 0:8767be3c1b7f | 8 | #include "sx127x_fsk.h" |
dudmuck | 0:8767be3c1b7f | 9 | |
dudmuck | 0:8767be3c1b7f | 10 | /******************************************************************************/ |
dudmuck | 0:8767be3c1b7f | 11 | #ifdef TARGET_MOTE_L152RC |
dudmuck | 0:8767be3c1b7f | 12 | |
dudmuck | 0:8767be3c1b7f | 13 | #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1 |
dudmuck | 0:8767be3c1b7f | 14 | #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2 |
dudmuck | 0:8767be3c1b7f | 15 | #define RADIO_RESET PC_2 //NorAm_Mote Reset_sx |
dudmuck | 0:8767be3c1b7f | 16 | #define RADIO_MOSI PB_15 //NorAm_Mote SPI2 Mosi |
dudmuck | 0:8767be3c1b7f | 17 | #define RADIO_MISO PB_14 //NorAm_Mote SPI2 Miso |
dudmuck | 0:8767be3c1b7f | 18 | #define RADIO_SCLK PB_13 //NorAm_Mote SPI2 Clk |
dudmuck | 0:8767be3c1b7f | 19 | #define RADIO_NSS PB_12 //NorAm_Mote SPI2 Nss |
dudmuck | 0:8767be3c1b7f | 20 | #define RADIO_DIO_0 PC_6 //NorAm_Mote DIO0 |
dudmuck | 2:547cc73f8887 | 21 | #define RADIO_DIO_1 PC_10 //NorAm_Mote DIO1 |
dudmuck | 2:547cc73f8887 | 22 | #define RADIO_DIO_2 PC_8 //NorAm_Mote DIO2 |
dudmuck | 2:547cc73f8887 | 23 | #define RADIO_DIO_3 PB_4 //NorAm_Mote DIO3 |
dudmuck | 2:547cc73f8887 | 24 | #define RADIO_DIO_4 PB_5 //NorAm_Mote DIO4 |
dudmuck | 2:547cc73f8887 | 25 | #define RADIO_DIO_5 PB_6 //NorAm_Mote DIO5 |
dudmuck | 0:8767be3c1b7f | 26 | // mosi, miso, sclk, cs, rst, dio0, dio1 |
dudmuck | 0:8767be3c1b7f | 27 | SX127x radio(RADIO_MOSI, RADIO_MISO, RADIO_SCLK, RADIO_NSS, RADIO_RESET, RADIO_DIO_0, RADIO_DIO_1); |
dudmuck | 0:8767be3c1b7f | 28 | |
dudmuck | 0:8767be3c1b7f | 29 | DigitalOut rfsw1(RFSW1); |
dudmuck | 0:8767be3c1b7f | 30 | DigitalOut rfsw2(RFSW2); |
dudmuck | 0:8767be3c1b7f | 31 | |
dudmuck | 0:8767be3c1b7f | 32 | void rfsw_callback() |
dudmuck | 0:8767be3c1b7f | 33 | { |
dudmuck | 0:8767be3c1b7f | 34 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission |
dudmuck | 0:8767be3c1b7f | 35 | if (radio.HF) { |
dudmuck | 0:8767be3c1b7f | 36 | if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST |
dudmuck | 0:8767be3c1b7f | 37 | rfsw2 = 0; |
dudmuck | 0:8767be3c1b7f | 38 | rfsw1 = 1; |
dudmuck | 0:8767be3c1b7f | 39 | } else { // RFO to power amp |
dudmuck | 0:8767be3c1b7f | 40 | rfsw2 = 1; |
dudmuck | 0:8767be3c1b7f | 41 | rfsw1 = 0; |
dudmuck | 0:8767be3c1b7f | 42 | } |
dudmuck | 0:8767be3c1b7f | 43 | } else { |
dudmuck | 0:8767be3c1b7f | 44 | // todo: sx1276 |
dudmuck | 0:8767be3c1b7f | 45 | } |
dudmuck | 0:8767be3c1b7f | 46 | //hdr_fem_csd = 1; //debug |
dudmuck | 0:8767be3c1b7f | 47 | } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception |
dudmuck | 0:8767be3c1b7f | 48 | if (radio.HF) { |
dudmuck | 0:8767be3c1b7f | 49 | rfsw2 = 1; |
dudmuck | 0:8767be3c1b7f | 50 | rfsw1 = 1; |
dudmuck | 0:8767be3c1b7f | 51 | } else { |
dudmuck | 0:8767be3c1b7f | 52 | // todo: sx1276 |
dudmuck | 0:8767be3c1b7f | 53 | } |
dudmuck | 0:8767be3c1b7f | 54 | //hdr_fem_csd = 0; //debug |
dudmuck | 0:8767be3c1b7f | 55 | } else { // RF switch shutdown |
dudmuck | 0:8767be3c1b7f | 56 | rfsw2 = 0; |
dudmuck | 0:8767be3c1b7f | 57 | rfsw1 = 0; |
dudmuck | 0:8767be3c1b7f | 58 | //hdr_fem_csd = 0; //debug |
dudmuck | 0:8767be3c1b7f | 59 | } |
dudmuck | 0:8767be3c1b7f | 60 | } |
dudmuck | 0:8767be3c1b7f | 61 | |
dudmuck | 0:8767be3c1b7f | 62 | DigitalOut pd2(PD_2); |
dudmuck | 0:8767be3c1b7f | 63 | |
dudmuck | 2:547cc73f8887 | 64 | DigitalIn dio2_pin(RADIO_DIO_2); |
dudmuck | 2:547cc73f8887 | 65 | DigitalIn dio3_pin(RADIO_DIO_3); |
dudmuck | 2:547cc73f8887 | 66 | DigitalIn dio4_pin(RADIO_DIO_4); |
dudmuck | 2:547cc73f8887 | 67 | DigitalIn dio5_pin(RADIO_DIO_5); |
dudmuck | 2:547cc73f8887 | 68 | |
dudmuck | 0:8767be3c1b7f | 69 | #else // sx1276 shield... |
dudmuck | 0:8767be3c1b7f | 70 | // pin: 3 8 1 7 10 12 5 |
dudmuck | 0:8767be3c1b7f | 71 | // mosi, miso, sclk, cs, rst, dio0, dio1 |
dudmuck | 0:8767be3c1b7f | 72 | SX127x radio(D11, D12, D13, D10, A0, D2, D3); // sx1276 arduino shield |
dudmuck | 0:8767be3c1b7f | 73 | |
dudmuck | 0:8767be3c1b7f | 74 | #ifdef TARGET_LPC11U6X |
dudmuck | 0:8767be3c1b7f | 75 | DigitalOut rfsw(P0_23); |
dudmuck | 0:8767be3c1b7f | 76 | #else |
dudmuck | 0:8767be3c1b7f | 77 | DigitalOut rfsw(A4); // for SX1276 arduino shield |
dudmuck | 0:8767be3c1b7f | 78 | #endif |
dudmuck | 0:8767be3c1b7f | 79 | |
dudmuck | 0:8767be3c1b7f | 80 | void rfsw_callback() |
dudmuck | 0:8767be3c1b7f | 81 | { |
dudmuck | 0:8767be3c1b7f | 82 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) |
dudmuck | 0:8767be3c1b7f | 83 | rfsw = 1; |
dudmuck | 0:8767be3c1b7f | 84 | else |
dudmuck | 0:8767be3c1b7f | 85 | rfsw = 0; |
dudmuck | 0:8767be3c1b7f | 86 | } |
dudmuck | 0:8767be3c1b7f | 87 | |
dudmuck | 2:547cc73f8887 | 88 | DigitalIn dio2_pin(D4); |
dudmuck | 2:547cc73f8887 | 89 | DigitalIn dio3_pin(D5); |
dudmuck | 2:547cc73f8887 | 90 | DigitalIn dio4_pin(A3); |
dudmuck | 2:547cc73f8887 | 91 | DigitalIn dio5_pin(D9); |
dudmuck | 2:547cc73f8887 | 92 | |
dudmuck | 0:8767be3c1b7f | 93 | #endif /* !TARGET_MOTE_L152RC */ |
dudmuck | 0:8767be3c1b7f | 94 | |
dudmuck | 0:8767be3c1b7f | 95 | SX127x_fsk fsk(radio); |
dudmuck | 0:8767be3c1b7f | 96 | SX127x_lora lora(radio); |
dudmuck | 0:8767be3c1b7f | 97 | |
dudmuck | 0:8767be3c1b7f | 98 | volatile bool tx_busy = false; |
dudmuck | 0:8767be3c1b7f | 99 | |
dudmuck | 2:547cc73f8887 | 100 | bool is_lora() |
dudmuck | 2:547cc73f8887 | 101 | { |
dudmuck | 2:547cc73f8887 | 102 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 2:547cc73f8887 | 103 | return radio.RegOpMode.bits.LongRangeMode; |
dudmuck | 2:547cc73f8887 | 104 | } |
dudmuck | 2:547cc73f8887 | 105 | |
dudmuck | 0:8767be3c1b7f | 106 | void |
dudmuck | 0:8767be3c1b7f | 107 | service_radio() |
dudmuck | 0:8767be3c1b7f | 108 | { |
dudmuck | 0:8767be3c1b7f | 109 | service_action_e act; |
dudmuck | 0:8767be3c1b7f | 110 | |
dudmuck | 0:8767be3c1b7f | 111 | if (radio.RegOpMode.bits.LongRangeMode) { |
dudmuck | 0:8767be3c1b7f | 112 | act = lora.service(); |
dudmuck | 0:8767be3c1b7f | 113 | switch (act) { |
dudmuck | 1:33d322ad66b1 | 114 | case SERVICE_READ_FIFO: |
dudmuck | 1:33d322ad66b1 | 115 | //printf("lora SERVICE_READ_FIFO\r\n"); |
dudmuck | 1:33d322ad66b1 | 116 | SCPI_RegSetBits(&scpi_context, SCPI_REG_QUES, 0x200); // bit 9 for packet received |
dudmuck | 1:33d322ad66b1 | 117 | break; |
dudmuck | 0:8767be3c1b7f | 118 | case SERVICE_TX_DONE: |
dudmuck | 0:8767be3c1b7f | 119 | tx_busy = false; |
dudmuck | 0:8767be3c1b7f | 120 | break; |
dudmuck | 0:8767be3c1b7f | 121 | } // ...switch (act) |
dudmuck | 0:8767be3c1b7f | 122 | } else { |
dudmuck | 0:8767be3c1b7f | 123 | /* FSK: */ |
dudmuck | 0:8767be3c1b7f | 124 | act = fsk.service(); |
dudmuck | 0:8767be3c1b7f | 125 | switch (act) { |
dudmuck | 1:33d322ad66b1 | 126 | case SERVICE_READ_FIFO: |
dudmuck | 1:33d322ad66b1 | 127 | SCPI_RegSetBits(&scpi_context, SCPI_REG_QUES, 0x200); // bit 9 for packet received |
dudmuck | 1:33d322ad66b1 | 128 | break; |
dudmuck | 1:33d322ad66b1 | 129 | case SERVICE_TX_DONE: |
dudmuck | 1:33d322ad66b1 | 130 | tx_busy = false; |
dudmuck | 1:33d322ad66b1 | 131 | break; |
dudmuck | 0:8767be3c1b7f | 132 | } // ...switch (act) |
dudmuck | 0:8767be3c1b7f | 133 | } |
dudmuck | 0:8767be3c1b7f | 134 | } |
dudmuck | 0:8767be3c1b7f | 135 | |
dudmuck | 0:8767be3c1b7f | 136 | |
dudmuck | 0:8767be3c1b7f | 137 | scpi_result_t SCPI_Reset(scpi_t * context) |
dudmuck | 0:8767be3c1b7f | 138 | { |
dudmuck | 0:8767be3c1b7f | 139 | radio.hw_reset(); |
dudmuck | 0:8767be3c1b7f | 140 | printf("**Reset\r\n"); |
dudmuck | 0:8767be3c1b7f | 141 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 142 | } |
dudmuck | 0:8767be3c1b7f | 143 | |
dudmuck | 0:8767be3c1b7f | 144 | const scpi_choice_def_t pa_selects[] = { |
dudmuck | 0:8767be3c1b7f | 145 | { "RFO", 0 }, |
dudmuck | 0:8767be3c1b7f | 146 | { "PA_BOOST", 1 }, |
dudmuck | 0:8767be3c1b7f | 147 | SCPI_CHOICE_LIST_END |
dudmuck | 0:8767be3c1b7f | 148 | }; |
dudmuck | 0:8767be3c1b7f | 149 | |
dudmuck | 0:8767be3c1b7f | 150 | scpi_result_t radio_PASelect(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 151 | { |
dudmuck | 0:8767be3c1b7f | 152 | int32_t value; |
dudmuck | 0:8767be3c1b7f | 153 | |
dudmuck | 0:8767be3c1b7f | 154 | if (!SCPI_ParamChoice(context, pa_selects, &value, TRUE)) |
dudmuck | 0:8767be3c1b7f | 155 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 156 | |
dudmuck | 0:8767be3c1b7f | 157 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:8767be3c1b7f | 158 | radio.RegPaConfig.bits.PaSelect = value; |
dudmuck | 0:8767be3c1b7f | 159 | radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); |
dudmuck | 0:8767be3c1b7f | 160 | |
dudmuck | 0:8767be3c1b7f | 161 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 162 | } |
dudmuck | 0:8767be3c1b7f | 163 | |
dudmuck | 0:8767be3c1b7f | 164 | scpi_result_t radio_PASelectQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 165 | { |
dudmuck | 0:8767be3c1b7f | 166 | int idx; |
dudmuck | 0:8767be3c1b7f | 167 | |
dudmuck | 0:8767be3c1b7f | 168 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:8767be3c1b7f | 169 | idx = radio.RegPaConfig.bits.PaSelect; |
dudmuck | 0:8767be3c1b7f | 170 | |
dudmuck | 0:8767be3c1b7f | 171 | SCPI_ResultText(context, pa_selects[idx].name); |
dudmuck | 0:8767be3c1b7f | 172 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 173 | } |
dudmuck | 0:8767be3c1b7f | 174 | |
dudmuck | 0:8767be3c1b7f | 175 | const scpi_choice_def_t modulations[] = { |
dudmuck | 0:8767be3c1b7f | 176 | { "FSK", 1 }, |
dudmuck | 0:8767be3c1b7f | 177 | { "OOK", 2 }, |
dudmuck | 0:8767be3c1b7f | 178 | { "LORa", 3 }, |
dudmuck | 0:8767be3c1b7f | 179 | SCPI_CHOICE_LIST_END |
dudmuck | 0:8767be3c1b7f | 180 | }; |
dudmuck | 0:8767be3c1b7f | 181 | |
dudmuck | 0:8767be3c1b7f | 182 | scpi_result_t radio_modulation(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 183 | { |
dudmuck | 0:8767be3c1b7f | 184 | int32_t value; |
dudmuck | 0:8767be3c1b7f | 185 | |
dudmuck | 0:8767be3c1b7f | 186 | /* scpi_bool_t SCPI_ParamChoice(scpi_t * context, const scpi_choice_def_t * options, int32_t * value, scpi_bool_t mandatory); */ |
dudmuck | 0:8767be3c1b7f | 187 | if (!SCPI_ParamChoice(context, modulations, &value, TRUE)) |
dudmuck | 0:8767be3c1b7f | 188 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 189 | |
dudmuck | 0:8767be3c1b7f | 190 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:8767be3c1b7f | 191 | if (value == 3) { |
dudmuck | 0:8767be3c1b7f | 192 | if (!radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:8767be3c1b7f | 193 | lora.enable(); |
dudmuck | 0:8767be3c1b7f | 194 | } else { |
dudmuck | 0:8767be3c1b7f | 195 | if (radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:8767be3c1b7f | 196 | fsk.enable(false); |
dudmuck | 0:8767be3c1b7f | 197 | if (radio.RegOpMode.bits.ModulationType) { // radio is OOK |
dudmuck | 0:8767be3c1b7f | 198 | if (value == 1) { // change to FSK |
dudmuck | 0:8767be3c1b7f | 199 | radio.RegOpMode.bits.ModulationType = 0; |
dudmuck | 0:8767be3c1b7f | 200 | radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); |
dudmuck | 0:8767be3c1b7f | 201 | } |
dudmuck | 0:8767be3c1b7f | 202 | } else { // radio is FSK |
dudmuck | 0:8767be3c1b7f | 203 | if (value == 2) { // change to OOK |
dudmuck | 0:8767be3c1b7f | 204 | radio.RegOpMode.bits.ModulationType = 1; |
dudmuck | 0:8767be3c1b7f | 205 | radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); |
dudmuck | 0:8767be3c1b7f | 206 | } |
dudmuck | 0:8767be3c1b7f | 207 | } |
dudmuck | 0:8767be3c1b7f | 208 | } |
dudmuck | 0:8767be3c1b7f | 209 | |
dudmuck | 0:8767be3c1b7f | 210 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 211 | } |
dudmuck | 0:8767be3c1b7f | 212 | |
dudmuck | 0:8767be3c1b7f | 213 | scpi_result_t radio_modulationQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 214 | { |
dudmuck | 0:8767be3c1b7f | 215 | int idx; |
dudmuck | 0:8767be3c1b7f | 216 | |
dudmuck | 2:547cc73f8887 | 217 | if (is_lora()) { |
dudmuck | 0:8767be3c1b7f | 218 | idx = 2; // lora |
dudmuck | 0:8767be3c1b7f | 219 | } else { |
dudmuck | 0:8767be3c1b7f | 220 | if (radio.RegOpMode.bits.ModulationType) |
dudmuck | 0:8767be3c1b7f | 221 | idx = 1; // ook |
dudmuck | 0:8767be3c1b7f | 222 | else |
dudmuck | 0:8767be3c1b7f | 223 | idx = 0; // fsk |
dudmuck | 0:8767be3c1b7f | 224 | } |
dudmuck | 0:8767be3c1b7f | 225 | |
dudmuck | 0:8767be3c1b7f | 226 | SCPI_ResultText(context, modulations[idx].name); |
dudmuck | 0:8767be3c1b7f | 227 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 228 | } |
dudmuck | 0:8767be3c1b7f | 229 | |
dudmuck | 1:33d322ad66b1 | 230 | scpi_result_t fsk_fdev(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 231 | { |
dudmuck | 1:33d322ad66b1 | 232 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 233 | |
dudmuck | 1:33d322ad66b1 | 234 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 235 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 236 | |
dudmuck | 2:547cc73f8887 | 237 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 238 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 239 | |
dudmuck | 1:33d322ad66b1 | 240 | fsk.set_tx_fdev_hz(i); |
dudmuck | 1:33d322ad66b1 | 241 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 242 | } |
dudmuck | 1:33d322ad66b1 | 243 | |
dudmuck | 1:33d322ad66b1 | 244 | scpi_result_t fsk_fdevQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 245 | { |
dudmuck | 2:547cc73f8887 | 246 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 247 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 248 | |
dudmuck | 1:33d322ad66b1 | 249 | SCPI_ResultInt(context, fsk.get_tx_fdev_hz()); |
dudmuck | 1:33d322ad66b1 | 250 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 251 | } |
dudmuck | 1:33d322ad66b1 | 252 | |
dudmuck | 2:547cc73f8887 | 253 | const scpi_choice_def_t rxtrigs[] = { |
dudmuck | 2:547cc73f8887 | 254 | { "OFF", 0 }, |
dudmuck | 2:547cc73f8887 | 255 | { "RSSI", 1 }, |
dudmuck | 2:547cc73f8887 | 256 | { "PRE", 6 }, |
dudmuck | 2:547cc73f8887 | 257 | { "BOTH", 7 }, |
dudmuck | 2:547cc73f8887 | 258 | SCPI_CHOICE_LIST_END |
dudmuck | 2:547cc73f8887 | 259 | }; |
dudmuck | 2:547cc73f8887 | 260 | |
dudmuck | 2:547cc73f8887 | 261 | scpi_result_t fsk_rxtrig(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 262 | { |
dudmuck | 2:547cc73f8887 | 263 | int32_t value; |
dudmuck | 2:547cc73f8887 | 264 | |
dudmuck | 2:547cc73f8887 | 265 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 266 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 267 | |
dudmuck | 2:547cc73f8887 | 268 | if (!SCPI_ParamChoice(context, rxtrigs, &value, TRUE)) |
dudmuck | 2:547cc73f8887 | 269 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 270 | |
dudmuck | 2:547cc73f8887 | 271 | fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); |
dudmuck | 2:547cc73f8887 | 272 | fsk.RegRxConfig.bits.RxTrigger = value; |
dudmuck | 2:547cc73f8887 | 273 | radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); |
dudmuck | 2:547cc73f8887 | 274 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 275 | } |
dudmuck | 2:547cc73f8887 | 276 | |
dudmuck | 2:547cc73f8887 | 277 | scpi_result_t fsk_rxtrigQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 278 | { |
dudmuck | 2:547cc73f8887 | 279 | int idx; |
dudmuck | 2:547cc73f8887 | 280 | |
dudmuck | 2:547cc73f8887 | 281 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 282 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 283 | |
dudmuck | 2:547cc73f8887 | 284 | fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); |
dudmuck | 2:547cc73f8887 | 285 | idx = fsk.RegRxConfig.bits.RxTrigger; |
dudmuck | 2:547cc73f8887 | 286 | SCPI_ResultText(context, rxtrigs[idx].name); |
dudmuck | 2:547cc73f8887 | 287 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 288 | } |
dudmuck | 2:547cc73f8887 | 289 | |
dudmuck | 2:547cc73f8887 | 290 | scpi_result_t fsk_bt(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 291 | { |
dudmuck | 2:547cc73f8887 | 292 | double bt; |
dudmuck | 2:547cc73f8887 | 293 | |
dudmuck | 2:547cc73f8887 | 294 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 295 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 296 | |
dudmuck | 2:547cc73f8887 | 297 | if (!SCPI_ParamDouble(context, &bt, TRUE)) |
dudmuck | 2:547cc73f8887 | 298 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 299 | |
dudmuck | 2:547cc73f8887 | 300 | if (bt < 0.2) |
dudmuck | 2:547cc73f8887 | 301 | radio.RegOpMode.bits.ModulationShaping = 0; // no shaping |
dudmuck | 2:547cc73f8887 | 302 | else if (bt < 0.4) |
dudmuck | 2:547cc73f8887 | 303 | radio.RegOpMode.bits.ModulationShaping = 3; // BT0.3 (most shaping) |
dudmuck | 2:547cc73f8887 | 304 | else if (bt < 0.9) |
dudmuck | 2:547cc73f8887 | 305 | radio.RegOpMode.bits.ModulationShaping = 2; // BT0.5 |
dudmuck | 2:547cc73f8887 | 306 | else |
dudmuck | 2:547cc73f8887 | 307 | radio.RegOpMode.bits.ModulationShaping = 1; // BT1.0 |
dudmuck | 2:547cc73f8887 | 308 | |
dudmuck | 2:547cc73f8887 | 309 | radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); |
dudmuck | 2:547cc73f8887 | 310 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 311 | } |
dudmuck | 2:547cc73f8887 | 312 | |
dudmuck | 2:547cc73f8887 | 313 | scpi_result_t fsk_btQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 314 | { |
dudmuck | 2:547cc73f8887 | 315 | double bt; |
dudmuck | 2:547cc73f8887 | 316 | |
dudmuck | 2:547cc73f8887 | 317 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 318 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 319 | |
dudmuck | 2:547cc73f8887 | 320 | switch (radio.RegOpMode.bits.ModulationShaping) { |
dudmuck | 2:547cc73f8887 | 321 | case 0: bt = 0.0; break; |
dudmuck | 2:547cc73f8887 | 322 | case 1: bt = 1.0; break; |
dudmuck | 2:547cc73f8887 | 323 | case 2: bt = 0.5; break; |
dudmuck | 2:547cc73f8887 | 324 | case 3: bt = 0.3; break; |
dudmuck | 2:547cc73f8887 | 325 | } |
dudmuck | 2:547cc73f8887 | 326 | |
dudmuck | 2:547cc73f8887 | 327 | SCPI_ResultDouble(context, bt); |
dudmuck | 2:547cc73f8887 | 328 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 329 | } |
dudmuck | 2:547cc73f8887 | 330 | |
dudmuck | 2:547cc73f8887 | 331 | const scpi_choice_def_t datamodes[] = { |
dudmuck | 2:547cc73f8887 | 332 | { "CONT", 0 }, |
dudmuck | 2:547cc73f8887 | 333 | { "PKT", 1 }, |
dudmuck | 2:547cc73f8887 | 334 | SCPI_CHOICE_LIST_END |
dudmuck | 2:547cc73f8887 | 335 | }; |
dudmuck | 2:547cc73f8887 | 336 | |
dudmuck | 2:547cc73f8887 | 337 | scpi_result_t fsk_datamode(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 338 | { |
dudmuck | 2:547cc73f8887 | 339 | int32_t value; |
dudmuck | 2:547cc73f8887 | 340 | |
dudmuck | 2:547cc73f8887 | 341 | if (!SCPI_ParamChoice(context, datamodes, &value, TRUE)) |
dudmuck | 2:547cc73f8887 | 342 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 343 | |
dudmuck | 2:547cc73f8887 | 344 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 345 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 346 | |
dudmuck | 2:547cc73f8887 | 347 | fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2); |
dudmuck | 2:547cc73f8887 | 348 | fsk.RegPktConfig2.bits.DataModePacket = value; |
dudmuck | 2:547cc73f8887 | 349 | radio.write_reg(REG_FSK_PACKETCONFIG2, fsk.RegPktConfig2.word); |
dudmuck | 2:547cc73f8887 | 350 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 351 | } |
dudmuck | 2:547cc73f8887 | 352 | |
dudmuck | 2:547cc73f8887 | 353 | scpi_result_t fsk_datamodeQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 354 | { |
dudmuck | 2:547cc73f8887 | 355 | int idx; |
dudmuck | 2:547cc73f8887 | 356 | |
dudmuck | 2:547cc73f8887 | 357 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 358 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 359 | |
dudmuck | 2:547cc73f8887 | 360 | fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2); |
dudmuck | 2:547cc73f8887 | 361 | idx = fsk.RegPktConfig2.bits.DataModePacket; |
dudmuck | 2:547cc73f8887 | 362 | SCPI_ResultText(context, datamodes[idx].name); |
dudmuck | 2:547cc73f8887 | 363 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 364 | } |
dudmuck | 2:547cc73f8887 | 365 | |
dudmuck | 2:547cc73f8887 | 366 | const scpi_choice_def_t dcfrees[] = { |
dudmuck | 2:547cc73f8887 | 367 | { "OFF", 0 }, |
dudmuck | 2:547cc73f8887 | 368 | { "MAN", 1 }, |
dudmuck | 2:547cc73f8887 | 369 | { "WHIT", 2 }, |
dudmuck | 2:547cc73f8887 | 370 | SCPI_CHOICE_LIST_END |
dudmuck | 2:547cc73f8887 | 371 | }; |
dudmuck | 2:547cc73f8887 | 372 | |
dudmuck | 2:547cc73f8887 | 373 | scpi_result_t fsk_dcfree(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 374 | { |
dudmuck | 2:547cc73f8887 | 375 | int32_t value; |
dudmuck | 2:547cc73f8887 | 376 | |
dudmuck | 2:547cc73f8887 | 377 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 378 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 379 | |
dudmuck | 2:547cc73f8887 | 380 | if (!SCPI_ParamChoice(context, dcfrees, &value, TRUE)) |
dudmuck | 2:547cc73f8887 | 381 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 382 | |
dudmuck | 2:547cc73f8887 | 383 | fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1); |
dudmuck | 2:547cc73f8887 | 384 | fsk.RegPktConfig1.bits.DcFree = value; |
dudmuck | 2:547cc73f8887 | 385 | radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet); |
dudmuck | 2:547cc73f8887 | 386 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 387 | } |
dudmuck | 2:547cc73f8887 | 388 | |
dudmuck | 2:547cc73f8887 | 389 | scpi_result_t fsk_dcfreeQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 390 | { |
dudmuck | 2:547cc73f8887 | 391 | int idx; |
dudmuck | 2:547cc73f8887 | 392 | |
dudmuck | 2:547cc73f8887 | 393 | if (is_lora()) |
dudmuck | 2:547cc73f8887 | 394 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 395 | |
dudmuck | 2:547cc73f8887 | 396 | fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1); |
dudmuck | 2:547cc73f8887 | 397 | idx = fsk.RegPktConfig1.bits.DcFree ; |
dudmuck | 2:547cc73f8887 | 398 | SCPI_ResultText(context, dcfrees[idx].name); |
dudmuck | 2:547cc73f8887 | 399 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 400 | } |
dudmuck | 2:547cc73f8887 | 401 | |
dudmuck | 1:33d322ad66b1 | 402 | scpi_result_t fsk_rxbw(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 403 | { |
dudmuck | 1:33d322ad66b1 | 404 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 405 | |
dudmuck | 1:33d322ad66b1 | 406 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 407 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 408 | |
dudmuck | 2:547cc73f8887 | 409 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 410 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 411 | |
dudmuck | 1:33d322ad66b1 | 412 | fsk.set_rx_dcc_bw_hz(i, 0); |
dudmuck | 1:33d322ad66b1 | 413 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 414 | } |
dudmuck | 1:33d322ad66b1 | 415 | |
dudmuck | 1:33d322ad66b1 | 416 | scpi_result_t fsk_rxbwQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 417 | { |
dudmuck | 2:547cc73f8887 | 418 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 419 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 420 | |
dudmuck | 1:33d322ad66b1 | 421 | SCPI_ResultInt(context, fsk.get_rx_bw_hz(REG_FSK_RXBW)); |
dudmuck | 1:33d322ad66b1 | 422 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 423 | } |
dudmuck | 1:33d322ad66b1 | 424 | |
dudmuck | 1:33d322ad66b1 | 425 | scpi_result_t fsk_afcbw(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 426 | { |
dudmuck | 1:33d322ad66b1 | 427 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 428 | |
dudmuck | 1:33d322ad66b1 | 429 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 430 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 431 | |
dudmuck | 2:547cc73f8887 | 432 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 433 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 434 | |
dudmuck | 1:33d322ad66b1 | 435 | fsk.set_rx_dcc_bw_hz(i, 1); |
dudmuck | 1:33d322ad66b1 | 436 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 437 | } |
dudmuck | 1:33d322ad66b1 | 438 | |
dudmuck | 1:33d322ad66b1 | 439 | scpi_result_t fsk_afcbwQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 440 | { |
dudmuck | 2:547cc73f8887 | 441 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 442 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 443 | |
dudmuck | 1:33d322ad66b1 | 444 | SCPI_ResultInt(context, fsk.get_rx_bw_hz(REG_FSK_AFCBW)); |
dudmuck | 1:33d322ad66b1 | 445 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 446 | } |
dudmuck | 1:33d322ad66b1 | 447 | |
dudmuck | 1:33d322ad66b1 | 448 | scpi_result_t fsk_bitrate(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 449 | { |
dudmuck | 1:33d322ad66b1 | 450 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 451 | |
dudmuck | 1:33d322ad66b1 | 452 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 453 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 454 | |
dudmuck | 2:547cc73f8887 | 455 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 456 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 457 | |
dudmuck | 1:33d322ad66b1 | 458 | fsk.set_bitrate(i); |
dudmuck | 1:33d322ad66b1 | 459 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 460 | } |
dudmuck | 1:33d322ad66b1 | 461 | |
dudmuck | 1:33d322ad66b1 | 462 | scpi_result_t fsk_bitrateQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 463 | { |
dudmuck | 2:547cc73f8887 | 464 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 465 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 466 | |
dudmuck | 1:33d322ad66b1 | 467 | SCPI_ResultInt(context, fsk.get_bitrate()); |
dudmuck | 1:33d322ad66b1 | 468 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 469 | } |
dudmuck | 1:33d322ad66b1 | 470 | |
dudmuck | 1:33d322ad66b1 | 471 | scpi_result_t fsk_prelen(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 472 | { |
dudmuck | 1:33d322ad66b1 | 473 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 474 | |
dudmuck | 1:33d322ad66b1 | 475 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 476 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 477 | |
dudmuck | 2:547cc73f8887 | 478 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 479 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 480 | |
dudmuck | 1:33d322ad66b1 | 481 | radio.write_u16(REG_FSK_PREAMBLEMSB, i); |
dudmuck | 1:33d322ad66b1 | 482 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 483 | } |
dudmuck | 1:33d322ad66b1 | 484 | |
dudmuck | 1:33d322ad66b1 | 485 | scpi_result_t fsk_prelenQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 486 | { |
dudmuck | 2:547cc73f8887 | 487 | if (is_lora()) |
dudmuck | 1:33d322ad66b1 | 488 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 489 | |
dudmuck | 1:33d322ad66b1 | 490 | SCPI_ResultInt(context, radio.read_u16(REG_FSK_PREAMBLEMSB) ); |
dudmuck | 1:33d322ad66b1 | 491 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 492 | } |
dudmuck | 1:33d322ad66b1 | 493 | |
dudmuck | 0:8767be3c1b7f | 494 | scpi_result_t fsk_sync(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 495 | { |
dudmuck | 0:8767be3c1b7f | 496 | char buffer[100]; |
dudmuck | 2:547cc73f8887 | 497 | size_t _copy_len, _len, i; |
dudmuck | 0:8767be3c1b7f | 498 | uint8_t addr; |
dudmuck | 0:8767be3c1b7f | 499 | uint8_t sync_size; |
dudmuck | 0:8767be3c1b7f | 500 | |
dudmuck | 2:547cc73f8887 | 501 | if (is_lora()) |
dudmuck | 0:8767be3c1b7f | 502 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 503 | |
dudmuck | 2:547cc73f8887 | 504 | memset(buffer, 0, sizeof(buffer)); |
dudmuck | 2:547cc73f8887 | 505 | SCPI_ParamCopyText(context, buffer, 100, &_copy_len, false); |
dudmuck | 2:547cc73f8887 | 506 | for (_len = 0; buffer[_len] != 0; _len++) |
dudmuck | 2:547cc73f8887 | 507 | ; |
dudmuck | 1:33d322ad66b1 | 508 | |
dudmuck | 0:8767be3c1b7f | 509 | fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); |
dudmuck | 0:8767be3c1b7f | 510 | sync_size = 0; |
dudmuck | 0:8767be3c1b7f | 511 | addr = REG_FSK_SYNCVALUE1; |
dudmuck | 2:547cc73f8887 | 512 | for (i = 0; i < _len; i+=2) { |
dudmuck | 0:8767be3c1b7f | 513 | int o; |
dudmuck | 0:8767be3c1b7f | 514 | sscanf(buffer+i, "%02x", &o); |
dudmuck | 0:8767be3c1b7f | 515 | radio.write_reg(addr++, o); |
dudmuck | 0:8767be3c1b7f | 516 | sync_size++; |
dudmuck | 0:8767be3c1b7f | 517 | } |
dudmuck | 0:8767be3c1b7f | 518 | if (sync_size > 0) |
dudmuck | 0:8767be3c1b7f | 519 | fsk.RegSyncConfig.bits.SyncSize = sync_size - 1; |
dudmuck | 0:8767be3c1b7f | 520 | |
dudmuck | 0:8767be3c1b7f | 521 | radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); |
dudmuck | 0:8767be3c1b7f | 522 | |
dudmuck | 0:8767be3c1b7f | 523 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 524 | } |
dudmuck | 0:8767be3c1b7f | 525 | |
dudmuck | 0:8767be3c1b7f | 526 | scpi_result_t fsk_syncQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 527 | { |
dudmuck | 0:8767be3c1b7f | 528 | int i; |
dudmuck | 0:8767be3c1b7f | 529 | char txt[64]; |
dudmuck | 0:8767be3c1b7f | 530 | char *ptr = txt; |
dudmuck | 0:8767be3c1b7f | 531 | |
dudmuck | 2:547cc73f8887 | 532 | if (is_lora()) |
dudmuck | 0:8767be3c1b7f | 533 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 534 | |
dudmuck | 0:8767be3c1b7f | 535 | fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); |
dudmuck | 1:33d322ad66b1 | 536 | for (i = 0; i <= fsk.RegSyncConfig.bits.SyncSize; i++) { |
dudmuck | 0:8767be3c1b7f | 537 | uint8_t o = radio.read_reg(i + REG_FSK_SYNCVALUE1); |
dudmuck | 0:8767be3c1b7f | 538 | sprintf(ptr, "%02x", o); |
dudmuck | 0:8767be3c1b7f | 539 | ptr += 2; |
dudmuck | 0:8767be3c1b7f | 540 | } |
dudmuck | 0:8767be3c1b7f | 541 | |
dudmuck | 0:8767be3c1b7f | 542 | SCPI_ResultText(context, txt); |
dudmuck | 0:8767be3c1b7f | 543 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 544 | } |
dudmuck | 0:8767be3c1b7f | 545 | |
dudmuck | 0:8767be3c1b7f | 546 | scpi_result_t radio_rssiQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 547 | { |
dudmuck | 0:8767be3c1b7f | 548 | int reg_val; |
dudmuck | 0:8767be3c1b7f | 549 | |
dudmuck | 0:8767be3c1b7f | 550 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:8767be3c1b7f | 551 | if (radio.RegOpMode.bits.Mode != RF_OPMODE_RECEIVER) |
dudmuck | 0:8767be3c1b7f | 552 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 553 | |
dudmuck | 2:547cc73f8887 | 554 | if (is_lora()) { |
dudmuck | 0:8767be3c1b7f | 555 | reg_val = radio.read_reg(REG_LR_RSSIVALUE); // 0x1b: dbm = -125 + regvalue |
dudmuck | 0:8767be3c1b7f | 556 | SCPI_ResultDouble(context, -125 + reg_val); |
dudmuck | 0:8767be3c1b7f | 557 | } else { |
dudmuck | 0:8767be3c1b7f | 558 | reg_val = radio.read_reg(REG_FSK_RSSIVALUE); // 0x11: dBm = -regvalue/2 |
dudmuck | 0:8767be3c1b7f | 559 | SCPI_ResultDouble(context, -reg_val/2.0); |
dudmuck | 0:8767be3c1b7f | 560 | } |
dudmuck | 0:8767be3c1b7f | 561 | |
dudmuck | 0:8767be3c1b7f | 562 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 563 | } |
dudmuck | 0:8767be3c1b7f | 564 | |
dudmuck | 1:33d322ad66b1 | 565 | scpi_result_t radio_binFifo(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 566 | { |
dudmuck | 1:33d322ad66b1 | 567 | size_t len; |
dudmuck | 1:33d322ad66b1 | 568 | const char* buf = (const char *)radio.tx_buf; |
dudmuck | 1:33d322ad66b1 | 569 | |
dudmuck | 1:33d322ad66b1 | 570 | /*scpi_bool_t SCPI_ParamArbitraryBlock(scpi_t * context, const char ** value, size_t * len, scpi_bool_t mandatory);*/ |
dudmuck | 1:33d322ad66b1 | 571 | if (!SCPI_ParamArbitraryBlock(context, &buf, &len, TRUE)) |
dudmuck | 1:33d322ad66b1 | 572 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 573 | |
dudmuck | 2:547cc73f8887 | 574 | if (is_lora()) { |
dudmuck | 1:33d322ad66b1 | 575 | lora.RegPayloadLength = len; |
dudmuck | 1:33d322ad66b1 | 576 | radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); |
dudmuck | 1:33d322ad66b1 | 577 | lora.start_tx(lora.RegPayloadLength); |
dudmuck | 1:33d322ad66b1 | 578 | } else { |
dudmuck | 1:33d322ad66b1 | 579 | fsk.start_tx(len); |
dudmuck | 1:33d322ad66b1 | 580 | } |
dudmuck | 1:33d322ad66b1 | 581 | |
dudmuck | 1:33d322ad66b1 | 582 | tx_busy = true; |
dudmuck | 1:33d322ad66b1 | 583 | |
dudmuck | 1:33d322ad66b1 | 584 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 585 | } |
dudmuck | 1:33d322ad66b1 | 586 | |
dudmuck | 1:33d322ad66b1 | 587 | scpi_result_t radio_binFifoQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 588 | { |
dudmuck | 1:33d322ad66b1 | 589 | int len; |
dudmuck | 1:33d322ad66b1 | 590 | const char* buf = (const char *)radio.rx_buf; |
dudmuck | 2:547cc73f8887 | 591 | |
dudmuck | 2:547cc73f8887 | 592 | if (is_lora()) { |
dudmuck | 1:33d322ad66b1 | 593 | len = lora.RegRxNbBytes; |
dudmuck | 1:33d322ad66b1 | 594 | } else { |
dudmuck | 1:33d322ad66b1 | 595 | len = fsk.rx_buf_length; |
dudmuck | 1:33d322ad66b1 | 596 | } |
dudmuck | 1:33d322ad66b1 | 597 | |
dudmuck | 1:33d322ad66b1 | 598 | //size_t SCPI_ResultArbitraryBlock(scpi_t * context, const char * data, size_t len); |
dudmuck | 1:33d322ad66b1 | 599 | if (SCPI_ResultArbitraryBlock(context, buf, len) == len) |
dudmuck | 1:33d322ad66b1 | 600 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 601 | else |
dudmuck | 1:33d322ad66b1 | 602 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 603 | } |
dudmuck | 1:33d322ad66b1 | 604 | |
dudmuck | 0:8767be3c1b7f | 605 | scpi_result_t radio_fifoQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 606 | { |
dudmuck | 0:8767be3c1b7f | 607 | int i; |
dudmuck | 0:8767be3c1b7f | 608 | char txt[520]; |
dudmuck | 0:8767be3c1b7f | 609 | char *ptr = txt; |
dudmuck | 0:8767be3c1b7f | 610 | |
dudmuck | 2:547cc73f8887 | 611 | if (is_lora()) { |
dudmuck | 0:8767be3c1b7f | 612 | for (i = 0; i < lora.RegRxNbBytes; i++) { |
dudmuck | 0:8767be3c1b7f | 613 | sprintf(ptr, "%02x", radio.rx_buf[i]); |
dudmuck | 0:8767be3c1b7f | 614 | ptr += 2; |
dudmuck | 0:8767be3c1b7f | 615 | } |
dudmuck | 0:8767be3c1b7f | 616 | } else { |
dudmuck | 1:33d322ad66b1 | 617 | for (i = 0; i < fsk.rx_buf_length; i++) { |
dudmuck | 1:33d322ad66b1 | 618 | sprintf(ptr, "%02x", radio.rx_buf[i]); |
dudmuck | 1:33d322ad66b1 | 619 | ptr += 2; |
dudmuck | 1:33d322ad66b1 | 620 | } |
dudmuck | 0:8767be3c1b7f | 621 | } |
dudmuck | 0:8767be3c1b7f | 622 | |
dudmuck | 0:8767be3c1b7f | 623 | SCPI_ResultText(context, txt); |
dudmuck | 0:8767be3c1b7f | 624 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 625 | } |
dudmuck | 0:8767be3c1b7f | 626 | |
dudmuck | 0:8767be3c1b7f | 627 | scpi_result_t radio_fifo(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 628 | { |
dudmuck | 0:8767be3c1b7f | 629 | char buffer[100]; |
dudmuck | 2:547cc73f8887 | 630 | size_t copy_len, i, len; |
dudmuck | 0:8767be3c1b7f | 631 | |
dudmuck | 0:8767be3c1b7f | 632 | if (tx_busy) |
dudmuck | 0:8767be3c1b7f | 633 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 634 | |
dudmuck | 2:547cc73f8887 | 635 | memset(buffer, 0, sizeof(buffer)); |
dudmuck | 0:8767be3c1b7f | 636 | SCPI_ParamCopyText(context, buffer, 100, ©_len, false); |
dudmuck | 0:8767be3c1b7f | 637 | |
dudmuck | 2:547cc73f8887 | 638 | for (len = 0; buffer[len] != 0; len++) |
dudmuck | 2:547cc73f8887 | 639 | ; |
dudmuck | 2:547cc73f8887 | 640 | |
dudmuck | 2:547cc73f8887 | 641 | for (i = 0; i < len; i++) |
dudmuck | 0:8767be3c1b7f | 642 | radio.tx_buf[i] = buffer[i]; |
dudmuck | 0:8767be3c1b7f | 643 | |
dudmuck | 2:547cc73f8887 | 644 | if (is_lora()) { |
dudmuck | 2:547cc73f8887 | 645 | lora.RegPayloadLength = len; |
dudmuck | 0:8767be3c1b7f | 646 | radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); |
dudmuck | 0:8767be3c1b7f | 647 | lora.start_tx(lora.RegPayloadLength); |
dudmuck | 0:8767be3c1b7f | 648 | } else { |
dudmuck | 0:8767be3c1b7f | 649 | /* fsk todo */ |
dudmuck | 2:547cc73f8887 | 650 | fsk.start_tx(len); |
dudmuck | 0:8767be3c1b7f | 651 | } |
dudmuck | 0:8767be3c1b7f | 652 | |
dudmuck | 0:8767be3c1b7f | 653 | tx_busy = true; |
dudmuck | 0:8767be3c1b7f | 654 | |
dudmuck | 0:8767be3c1b7f | 655 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 656 | } |
dudmuck | 0:8767be3c1b7f | 657 | |
dudmuck | 0:8767be3c1b7f | 658 | const scpi_choice_def_t opmodes[] = { |
dudmuck | 0:8767be3c1b7f | 659 | { "SLE", 0 }, |
dudmuck | 0:8767be3c1b7f | 660 | { "STB", 1 }, |
dudmuck | 0:8767be3c1b7f | 661 | { "FST", 2 }, |
dudmuck | 2:547cc73f8887 | 662 | { "TX", 3 }, |
dudmuck | 2:547cc73f8887 | 663 | { "FSR", 4 }, |
dudmuck | 0:8767be3c1b7f | 664 | { "RXC", 5 }, |
dudmuck | 0:8767be3c1b7f | 665 | { "RXS", 6 }, |
dudmuck | 0:8767be3c1b7f | 666 | { "CAD", 7 }, |
dudmuck | 0:8767be3c1b7f | 667 | SCPI_CHOICE_LIST_END |
dudmuck | 0:8767be3c1b7f | 668 | }; |
dudmuck | 0:8767be3c1b7f | 669 | |
dudmuck | 0:8767be3c1b7f | 670 | scpi_result_t radio_opmode(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 671 | { |
dudmuck | 0:8767be3c1b7f | 672 | int32_t value; |
dudmuck | 0:8767be3c1b7f | 673 | |
dudmuck | 0:8767be3c1b7f | 674 | if (!SCPI_ParamChoice(context, opmodes, &value, TRUE)) |
dudmuck | 0:8767be3c1b7f | 675 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 676 | |
dudmuck | 0:8767be3c1b7f | 677 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:8767be3c1b7f | 678 | radio.RegOpMode.bits.Mode = value; |
dudmuck | 0:8767be3c1b7f | 679 | radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); |
dudmuck | 0:8767be3c1b7f | 680 | |
dudmuck | 0:8767be3c1b7f | 681 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 682 | } |
dudmuck | 0:8767be3c1b7f | 683 | |
dudmuck | 0:8767be3c1b7f | 684 | scpi_result_t radio_opmodeQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 685 | { |
dudmuck | 0:8767be3c1b7f | 686 | int idx; |
dudmuck | 0:8767be3c1b7f | 687 | |
dudmuck | 0:8767be3c1b7f | 688 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:8767be3c1b7f | 689 | idx = radio.RegOpMode.bits.Mode; |
dudmuck | 0:8767be3c1b7f | 690 | SCPI_ResultText(context, opmodes[idx].name); |
dudmuck | 0:8767be3c1b7f | 691 | |
dudmuck | 0:8767be3c1b7f | 692 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 693 | } |
dudmuck | 0:8767be3c1b7f | 694 | |
dudmuck | 0:8767be3c1b7f | 695 | |
dudmuck | 0:8767be3c1b7f | 696 | /*scpi_result_t wbr_set_bit9(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 697 | { |
dudmuck | 0:8767be3c1b7f | 698 | SCPI_RegSetBits(context, SCPI_REG_QUES, 0x200); |
dudmuck | 0:8767be3c1b7f | 699 | printf("set bit9\r\n"); |
dudmuck | 0:8767be3c1b7f | 700 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 701 | }*/ |
dudmuck | 0:8767be3c1b7f | 702 | scpi_result_t radio_ocp(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 703 | { |
dudmuck | 0:8767be3c1b7f | 704 | int32_t i; |
dudmuck | 0:8767be3c1b7f | 705 | |
dudmuck | 0:8767be3c1b7f | 706 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 0:8767be3c1b7f | 707 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 708 | |
dudmuck | 0:8767be3c1b7f | 709 | radio.RegOcp.octet = radio.read_reg(REG_OCP); |
dudmuck | 0:8767be3c1b7f | 710 | if (i < 130) |
dudmuck | 0:8767be3c1b7f | 711 | radio.RegOcp.bits.OcpTrim = (i - 45) / 5; |
dudmuck | 0:8767be3c1b7f | 712 | else |
dudmuck | 0:8767be3c1b7f | 713 | radio.RegOcp.bits.OcpTrim = (i + 30) / 10; |
dudmuck | 0:8767be3c1b7f | 714 | radio.write_reg(REG_OCP, radio.RegOcp.octet); |
dudmuck | 0:8767be3c1b7f | 715 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 716 | } |
dudmuck | 0:8767be3c1b7f | 717 | |
dudmuck | 0:8767be3c1b7f | 718 | scpi_result_t radio_ocpQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 719 | { |
dudmuck | 0:8767be3c1b7f | 720 | int32_t i; |
dudmuck | 0:8767be3c1b7f | 721 | |
dudmuck | 0:8767be3c1b7f | 722 | radio.RegOcp.octet = radio.read_reg(REG_OCP); |
dudmuck | 0:8767be3c1b7f | 723 | |
dudmuck | 0:8767be3c1b7f | 724 | if (radio.RegOcp.bits.OcpTrim < 16) |
dudmuck | 0:8767be3c1b7f | 725 | i = 45 + (5 * radio.RegOcp.bits.OcpTrim); |
dudmuck | 0:8767be3c1b7f | 726 | else if (radio.RegOcp.bits.OcpTrim < 28) |
dudmuck | 0:8767be3c1b7f | 727 | i = (10 * radio.RegOcp.bits.OcpTrim) - 30; |
dudmuck | 0:8767be3c1b7f | 728 | else |
dudmuck | 0:8767be3c1b7f | 729 | i = 240; |
dudmuck | 0:8767be3c1b7f | 730 | |
dudmuck | 0:8767be3c1b7f | 731 | SCPI_ResultInt(context, i); |
dudmuck | 0:8767be3c1b7f | 732 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 733 | } |
dudmuck | 0:8767be3c1b7f | 734 | |
dudmuck | 1:33d322ad66b1 | 735 | scpi_result_t radio_bgr(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 736 | { |
dudmuck | 1:33d322ad66b1 | 737 | RegPdsTrim1_t pds_trim; |
dudmuck | 1:33d322ad66b1 | 738 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 739 | |
dudmuck | 1:33d322ad66b1 | 740 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 741 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 742 | |
dudmuck | 1:33d322ad66b1 | 743 | if (radio.type == SX1276) { |
dudmuck | 1:33d322ad66b1 | 744 | pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276); |
dudmuck | 1:33d322ad66b1 | 745 | pds_trim.bits.prog_txdac = i; |
dudmuck | 1:33d322ad66b1 | 746 | radio.write_reg(REG_PDSTRIM1_SX1276, pds_trim.octet); |
dudmuck | 1:33d322ad66b1 | 747 | } else if (radio.type == SX1272) { |
dudmuck | 1:33d322ad66b1 | 748 | pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272); |
dudmuck | 1:33d322ad66b1 | 749 | pds_trim.bits.prog_txdac = i; |
dudmuck | 1:33d322ad66b1 | 750 | radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet); |
dudmuck | 1:33d322ad66b1 | 751 | } else |
dudmuck | 1:33d322ad66b1 | 752 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 753 | |
dudmuck | 1:33d322ad66b1 | 754 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 755 | } |
dudmuck | 1:33d322ad66b1 | 756 | |
dudmuck | 1:33d322ad66b1 | 757 | scpi_result_t radio_bgrQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 758 | { |
dudmuck | 1:33d322ad66b1 | 759 | RegPdsTrim1_t pds_trim; |
dudmuck | 1:33d322ad66b1 | 760 | |
dudmuck | 1:33d322ad66b1 | 761 | if (radio.type == SX1276) |
dudmuck | 1:33d322ad66b1 | 762 | pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276); |
dudmuck | 1:33d322ad66b1 | 763 | else if (radio.type == SX1272) |
dudmuck | 1:33d322ad66b1 | 764 | pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272); |
dudmuck | 1:33d322ad66b1 | 765 | else |
dudmuck | 1:33d322ad66b1 | 766 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 767 | |
dudmuck | 1:33d322ad66b1 | 768 | SCPI_ResultInt(context, pds_trim.bits.prog_txdac); |
dudmuck | 1:33d322ad66b1 | 769 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 770 | } |
dudmuck | 1:33d322ad66b1 | 771 | |
dudmuck | 1:33d322ad66b1 | 772 | scpi_result_t radio_lnaBoost(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 773 | { |
dudmuck | 1:33d322ad66b1 | 774 | scpi_bool_t param1; |
dudmuck | 1:33d322ad66b1 | 775 | |
dudmuck | 1:33d322ad66b1 | 776 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 1:33d322ad66b1 | 777 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 778 | |
dudmuck | 1:33d322ad66b1 | 779 | radio.RegLna.octet = radio.read_reg(REG_LNA); |
dudmuck | 1:33d322ad66b1 | 780 | if (param1) |
dudmuck | 1:33d322ad66b1 | 781 | radio.RegLna.bits.LnaBoostHF = 3; |
dudmuck | 1:33d322ad66b1 | 782 | else |
dudmuck | 1:33d322ad66b1 | 783 | radio.RegLna.bits.LnaBoostHF = 0; |
dudmuck | 1:33d322ad66b1 | 784 | |
dudmuck | 1:33d322ad66b1 | 785 | radio.write_reg(REG_LNA, radio.RegLna.octet); |
dudmuck | 1:33d322ad66b1 | 786 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 787 | } |
dudmuck | 1:33d322ad66b1 | 788 | |
dudmuck | 1:33d322ad66b1 | 789 | scpi_result_t radio_lnaBoostQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 790 | { |
dudmuck | 1:33d322ad66b1 | 791 | radio.RegLna.octet = radio.read_reg(REG_LNA); |
dudmuck | 1:33d322ad66b1 | 792 | if (radio.RegLna.bits.LnaBoostHF) |
dudmuck | 1:33d322ad66b1 | 793 | SCPI_ResultBool(context, 1); |
dudmuck | 1:33d322ad66b1 | 794 | else |
dudmuck | 1:33d322ad66b1 | 795 | SCPI_ResultBool(context, 0); |
dudmuck | 1:33d322ad66b1 | 796 | |
dudmuck | 1:33d322ad66b1 | 797 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 798 | } |
dudmuck | 1:33d322ad66b1 | 799 | |
dudmuck | 0:8767be3c1b7f | 800 | scpi_result_t radio_power(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 801 | { |
dudmuck | 0:8767be3c1b7f | 802 | int32_t i; |
dudmuck | 0:8767be3c1b7f | 803 | |
dudmuck | 0:8767be3c1b7f | 804 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 0:8767be3c1b7f | 805 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 806 | |
dudmuck | 0:8767be3c1b7f | 807 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:8767be3c1b7f | 808 | radio.RegPaConfig.bits.OutputPower = i; |
dudmuck | 0:8767be3c1b7f | 809 | radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); |
dudmuck | 0:8767be3c1b7f | 810 | |
dudmuck | 0:8767be3c1b7f | 811 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 812 | } |
dudmuck | 0:8767be3c1b7f | 813 | |
dudmuck | 0:8767be3c1b7f | 814 | scpi_result_t radio_powerQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 815 | { |
dudmuck | 0:8767be3c1b7f | 816 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:8767be3c1b7f | 817 | SCPI_ResultInt(context, radio.RegPaConfig.bits.OutputPower); |
dudmuck | 0:8767be3c1b7f | 818 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 819 | } |
dudmuck | 0:8767be3c1b7f | 820 | |
dudmuck | 1:33d322ad66b1 | 821 | scpi_result_t radio_diomap(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 822 | { |
dudmuck | 1:33d322ad66b1 | 823 | int32_t dioN, map_value; |
dudmuck | 1:33d322ad66b1 | 824 | |
dudmuck | 1:33d322ad66b1 | 825 | if (!SCPI_ParamInt(context, &dioN, TRUE)) |
dudmuck | 1:33d322ad66b1 | 826 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 827 | |
dudmuck | 1:33d322ad66b1 | 828 | if (!SCPI_ParamInt(context, &map_value, TRUE)) |
dudmuck | 1:33d322ad66b1 | 829 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 830 | |
dudmuck | 1:33d322ad66b1 | 831 | if (dioN < 4) { |
dudmuck | 1:33d322ad66b1 | 832 | radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1); |
dudmuck | 1:33d322ad66b1 | 833 | switch (dioN) { |
dudmuck | 1:33d322ad66b1 | 834 | case 0: radio.RegDioMapping1.bits.Dio0Mapping = map_value; break; |
dudmuck | 1:33d322ad66b1 | 835 | case 1: radio.RegDioMapping1.bits.Dio1Mapping = map_value; break; |
dudmuck | 1:33d322ad66b1 | 836 | case 2: radio.RegDioMapping1.bits.Dio2Mapping = map_value; break; |
dudmuck | 1:33d322ad66b1 | 837 | case 3: radio.RegDioMapping1.bits.Dio3Mapping = map_value; break; |
dudmuck | 1:33d322ad66b1 | 838 | } // ...switch (dioN) |
dudmuck | 1:33d322ad66b1 | 839 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); |
dudmuck | 1:33d322ad66b1 | 840 | } else { |
dudmuck | 1:33d322ad66b1 | 841 | radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2); |
dudmuck | 1:33d322ad66b1 | 842 | switch (dioN) { |
dudmuck | 1:33d322ad66b1 | 843 | case 4: radio.RegDioMapping2.bits.Dio4Mapping = map_value; break; |
dudmuck | 1:33d322ad66b1 | 844 | case 5: radio.RegDioMapping2.bits.Dio5Mapping = map_value; break; |
dudmuck | 1:33d322ad66b1 | 845 | } // ...switch (dioN) |
dudmuck | 1:33d322ad66b1 | 846 | radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet); |
dudmuck | 1:33d322ad66b1 | 847 | } |
dudmuck | 1:33d322ad66b1 | 848 | |
dudmuck | 1:33d322ad66b1 | 849 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 850 | } |
dudmuck | 1:33d322ad66b1 | 851 | |
dudmuck | 1:33d322ad66b1 | 852 | scpi_result_t radio_diomapQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 853 | { |
dudmuck | 1:33d322ad66b1 | 854 | int32_t dioN, map_value = -1; |
dudmuck | 1:33d322ad66b1 | 855 | |
dudmuck | 1:33d322ad66b1 | 856 | if (!SCPI_ParamInt(context, &dioN, TRUE)) |
dudmuck | 1:33d322ad66b1 | 857 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 858 | |
dudmuck | 1:33d322ad66b1 | 859 | if (dioN < 4) { |
dudmuck | 1:33d322ad66b1 | 860 | radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1); |
dudmuck | 1:33d322ad66b1 | 861 | switch (dioN) { |
dudmuck | 1:33d322ad66b1 | 862 | case 0: map_value = radio.RegDioMapping1.bits.Dio0Mapping; break; |
dudmuck | 1:33d322ad66b1 | 863 | case 1: map_value = radio.RegDioMapping1.bits.Dio1Mapping; break; |
dudmuck | 1:33d322ad66b1 | 864 | case 2: map_value = radio.RegDioMapping1.bits.Dio2Mapping; break; |
dudmuck | 1:33d322ad66b1 | 865 | case 3: map_value = radio.RegDioMapping1.bits.Dio3Mapping; break; |
dudmuck | 1:33d322ad66b1 | 866 | } // ...switch (dioN) |
dudmuck | 1:33d322ad66b1 | 867 | } else { |
dudmuck | 1:33d322ad66b1 | 868 | radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2); |
dudmuck | 1:33d322ad66b1 | 869 | switch (dioN) { |
dudmuck | 1:33d322ad66b1 | 870 | case 4: map_value = radio.RegDioMapping2.bits.Dio4Mapping; break; |
dudmuck | 1:33d322ad66b1 | 871 | case 5: map_value = radio.RegDioMapping2.bits.Dio5Mapping; break; |
dudmuck | 1:33d322ad66b1 | 872 | } // ...switch (dioN) |
dudmuck | 1:33d322ad66b1 | 873 | } |
dudmuck | 1:33d322ad66b1 | 874 | |
dudmuck | 1:33d322ad66b1 | 875 | SCPI_ResultInt(context, map_value); |
dudmuck | 1:33d322ad66b1 | 876 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 877 | } |
dudmuck | 1:33d322ad66b1 | 878 | |
dudmuck | 2:547cc73f8887 | 879 | scpi_result_t radio_reg(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 880 | { |
dudmuck | 2:547cc73f8887 | 881 | int32_t addr, data; |
dudmuck | 2:547cc73f8887 | 882 | |
dudmuck | 2:547cc73f8887 | 883 | if (!SCPI_ParamInt(context, &addr, TRUE)) |
dudmuck | 2:547cc73f8887 | 884 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 885 | |
dudmuck | 2:547cc73f8887 | 886 | if (!SCPI_ParamInt(context, &data, TRUE)) |
dudmuck | 2:547cc73f8887 | 887 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 888 | |
dudmuck | 2:547cc73f8887 | 889 | radio.write_reg(addr, data); |
dudmuck | 2:547cc73f8887 | 890 | |
dudmuck | 2:547cc73f8887 | 891 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 892 | } |
dudmuck | 2:547cc73f8887 | 893 | |
dudmuck | 2:547cc73f8887 | 894 | scpi_result_t radio_regQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 895 | { |
dudmuck | 2:547cc73f8887 | 896 | int32_t addr; |
dudmuck | 2:547cc73f8887 | 897 | |
dudmuck | 2:547cc73f8887 | 898 | if (!SCPI_ParamInt(context, &addr, TRUE)) |
dudmuck | 2:547cc73f8887 | 899 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 900 | |
dudmuck | 2:547cc73f8887 | 901 | SCPI_ResultIntBase(context, radio.read_reg(addr), 16); |
dudmuck | 2:547cc73f8887 | 902 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 903 | } |
dudmuck | 2:547cc73f8887 | 904 | |
dudmuck | 2:547cc73f8887 | 905 | |
dudmuck | 2:547cc73f8887 | 906 | scpi_result_t radio_dioQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 907 | { |
dudmuck | 2:547cc73f8887 | 908 | int32_t dioN, value = -1; |
dudmuck | 2:547cc73f8887 | 909 | |
dudmuck | 2:547cc73f8887 | 910 | if (!SCPI_ParamInt(context, &dioN, TRUE)) |
dudmuck | 2:547cc73f8887 | 911 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 912 | |
dudmuck | 2:547cc73f8887 | 913 | switch (dioN) { |
dudmuck | 2:547cc73f8887 | 914 | case 0: value = radio.dio0.read(); break; |
dudmuck | 2:547cc73f8887 | 915 | case 1: value = radio.dio1.read(); break; |
dudmuck | 2:547cc73f8887 | 916 | case 2: value = dio2_pin.read(); break; |
dudmuck | 2:547cc73f8887 | 917 | case 3: value = dio3_pin.read(); break; |
dudmuck | 2:547cc73f8887 | 918 | case 4: value = dio4_pin.read(); break; |
dudmuck | 2:547cc73f8887 | 919 | case 5: value = dio5_pin.read(); break; |
dudmuck | 2:547cc73f8887 | 920 | default: |
dudmuck | 2:547cc73f8887 | 921 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 922 | } // ..switch (dioN) |
dudmuck | 2:547cc73f8887 | 923 | |
dudmuck | 2:547cc73f8887 | 924 | SCPI_ResultInt(context, value); |
dudmuck | 2:547cc73f8887 | 925 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 926 | } |
dudmuck | 2:547cc73f8887 | 927 | |
dudmuck | 0:8767be3c1b7f | 928 | scpi_result_t radio_freq(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 929 | { |
dudmuck | 0:8767be3c1b7f | 930 | double MHz; |
dudmuck | 0:8767be3c1b7f | 931 | |
dudmuck | 0:8767be3c1b7f | 932 | if (!SCPI_ParamDouble(context, &MHz, TRUE)) |
dudmuck | 0:8767be3c1b7f | 933 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 934 | |
dudmuck | 0:8767be3c1b7f | 935 | radio.set_frf_MHz(MHz); |
dudmuck | 0:8767be3c1b7f | 936 | |
dudmuck | 0:8767be3c1b7f | 937 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 938 | } |
dudmuck | 0:8767be3c1b7f | 939 | |
dudmuck | 0:8767be3c1b7f | 940 | scpi_result_t radio_freqQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 941 | { |
dudmuck | 0:8767be3c1b7f | 942 | SCPI_ResultDouble(context, radio.get_frf_MHz()); |
dudmuck | 0:8767be3c1b7f | 943 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 944 | } |
dudmuck | 0:8767be3c1b7f | 945 | |
dudmuck | 1:33d322ad66b1 | 946 | scpi_result_t lora_cr(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 947 | { |
dudmuck | 1:33d322ad66b1 | 948 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 949 | |
dudmuck | 1:33d322ad66b1 | 950 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 951 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 952 | |
dudmuck | 2:547cc73f8887 | 953 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 954 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 955 | |
dudmuck | 1:33d322ad66b1 | 956 | lora.setCodingRate(i); |
dudmuck | 1:33d322ad66b1 | 957 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 958 | } |
dudmuck | 1:33d322ad66b1 | 959 | |
dudmuck | 1:33d322ad66b1 | 960 | scpi_result_t lora_crQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 961 | { |
dudmuck | 2:547cc73f8887 | 962 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 963 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 964 | |
dudmuck | 1:33d322ad66b1 | 965 | SCPI_ResultInt(context, lora.getCodingRate(false)); |
dudmuck | 1:33d322ad66b1 | 966 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 967 | } |
dudmuck | 1:33d322ad66b1 | 968 | |
dudmuck | 2:547cc73f8887 | 969 | scpi_result_t lora_invrx(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 970 | { |
dudmuck | 2:547cc73f8887 | 971 | scpi_bool_t param1; |
dudmuck | 2:547cc73f8887 | 972 | |
dudmuck | 2:547cc73f8887 | 973 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 2:547cc73f8887 | 974 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 975 | |
dudmuck | 2:547cc73f8887 | 976 | if (!is_lora()) |
dudmuck | 2:547cc73f8887 | 977 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 978 | |
dudmuck | 2:547cc73f8887 | 979 | lora.invert_rx(param1); |
dudmuck | 2:547cc73f8887 | 980 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 981 | } |
dudmuck | 2:547cc73f8887 | 982 | |
dudmuck | 2:547cc73f8887 | 983 | scpi_result_t lora_invrxQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 984 | { |
dudmuck | 2:547cc73f8887 | 985 | if (!is_lora()) |
dudmuck | 2:547cc73f8887 | 986 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 987 | |
dudmuck | 2:547cc73f8887 | 988 | lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33); |
dudmuck | 2:547cc73f8887 | 989 | SCPI_ResultBool(context, lora.RegTest33.bits.invert_i_q ); |
dudmuck | 2:547cc73f8887 | 990 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 991 | } |
dudmuck | 2:547cc73f8887 | 992 | |
dudmuck | 2:547cc73f8887 | 993 | scpi_result_t lora_invtx(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 994 | { |
dudmuck | 2:547cc73f8887 | 995 | scpi_bool_t param1; |
dudmuck | 2:547cc73f8887 | 996 | |
dudmuck | 2:547cc73f8887 | 997 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 2:547cc73f8887 | 998 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 999 | |
dudmuck | 2:547cc73f8887 | 1000 | if (!is_lora()) |
dudmuck | 2:547cc73f8887 | 1001 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 1002 | |
dudmuck | 2:547cc73f8887 | 1003 | lora.invert_tx(param1); |
dudmuck | 2:547cc73f8887 | 1004 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 1005 | } |
dudmuck | 2:547cc73f8887 | 1006 | |
dudmuck | 2:547cc73f8887 | 1007 | scpi_result_t lora_invtxQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 1008 | { |
dudmuck | 2:547cc73f8887 | 1009 | if (!is_lora()) |
dudmuck | 2:547cc73f8887 | 1010 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 1011 | |
dudmuck | 2:547cc73f8887 | 1012 | lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33); |
dudmuck | 2:547cc73f8887 | 1013 | SCPI_ResultBool(context, !lora.RegTest33.bits.chirp_invert_tx); |
dudmuck | 2:547cc73f8887 | 1014 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 1015 | } |
dudmuck | 2:547cc73f8887 | 1016 | |
dudmuck | 2:547cc73f8887 | 1017 | scpi_result_t lora_crc(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 1018 | { |
dudmuck | 2:547cc73f8887 | 1019 | scpi_bool_t param1; |
dudmuck | 2:547cc73f8887 | 1020 | |
dudmuck | 2:547cc73f8887 | 1021 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 2:547cc73f8887 | 1022 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 1023 | |
dudmuck | 2:547cc73f8887 | 1024 | if (!is_lora()) |
dudmuck | 2:547cc73f8887 | 1025 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 1026 | |
dudmuck | 2:547cc73f8887 | 1027 | lora.setRxPayloadCrcOn(param1); |
dudmuck | 2:547cc73f8887 | 1028 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 1029 | } |
dudmuck | 2:547cc73f8887 | 1030 | |
dudmuck | 2:547cc73f8887 | 1031 | scpi_result_t lora_crcQ(scpi_t* context) |
dudmuck | 2:547cc73f8887 | 1032 | { |
dudmuck | 2:547cc73f8887 | 1033 | if (!is_lora()) |
dudmuck | 2:547cc73f8887 | 1034 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 1035 | |
dudmuck | 2:547cc73f8887 | 1036 | SCPI_ResultBool(context, lora.getRxPayloadCrcOn()); |
dudmuck | 2:547cc73f8887 | 1037 | return SCPI_RES_OK; |
dudmuck | 2:547cc73f8887 | 1038 | } |
dudmuck | 2:547cc73f8887 | 1039 | |
dudmuck | 1:33d322ad66b1 | 1040 | scpi_result_t lora_ih(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1041 | { |
dudmuck | 1:33d322ad66b1 | 1042 | scpi_bool_t param1; |
dudmuck | 1:33d322ad66b1 | 1043 | |
dudmuck | 1:33d322ad66b1 | 1044 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 1:33d322ad66b1 | 1045 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1046 | |
dudmuck | 2:547cc73f8887 | 1047 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1048 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1049 | |
dudmuck | 1:33d322ad66b1 | 1050 | lora.setHeaderMode(param1); |
dudmuck | 1:33d322ad66b1 | 1051 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1052 | } |
dudmuck | 1:33d322ad66b1 | 1053 | |
dudmuck | 1:33d322ad66b1 | 1054 | scpi_result_t lora_ihQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1055 | { |
dudmuck | 2:547cc73f8887 | 1056 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1057 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1058 | |
dudmuck | 1:33d322ad66b1 | 1059 | SCPI_ResultBool(context, lora.getHeaderMode()); |
dudmuck | 1:33d322ad66b1 | 1060 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1061 | } |
dudmuck | 1:33d322ad66b1 | 1062 | |
dudmuck | 1:33d322ad66b1 | 1063 | scpi_result_t lora_ldro(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1064 | { |
dudmuck | 1:33d322ad66b1 | 1065 | scpi_bool_t param1; |
dudmuck | 1:33d322ad66b1 | 1066 | |
dudmuck | 1:33d322ad66b1 | 1067 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 1:33d322ad66b1 | 1068 | return SCPI_RES_ERR; |
dudmuck | 2:547cc73f8887 | 1069 | |
dudmuck | 2:547cc73f8887 | 1070 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1071 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1072 | |
dudmuck | 1:33d322ad66b1 | 1073 | if (radio.type == SX1272) { |
dudmuck | 1:33d322ad66b1 | 1074 | lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 1:33d322ad66b1 | 1075 | lora.RegModemConfig.sx1272bits.LowDataRateOptimize = param1; |
dudmuck | 1:33d322ad66b1 | 1076 | radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet); |
dudmuck | 1:33d322ad66b1 | 1077 | } else if (radio.type == SX1276) { |
dudmuck | 1:33d322ad66b1 | 1078 | lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3); |
dudmuck | 1:33d322ad66b1 | 1079 | lora.RegModemConfig3.sx1276bits.LowDataRateOptimize = param1; |
dudmuck | 1:33d322ad66b1 | 1080 | radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet); |
dudmuck | 1:33d322ad66b1 | 1081 | } else |
dudmuck | 1:33d322ad66b1 | 1082 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1083 | |
dudmuck | 1:33d322ad66b1 | 1084 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1085 | } |
dudmuck | 1:33d322ad66b1 | 1086 | |
dudmuck | 1:33d322ad66b1 | 1087 | scpi_result_t lora_ldroQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1088 | { |
dudmuck | 1:33d322ad66b1 | 1089 | scpi_bool_t param1; |
dudmuck | 1:33d322ad66b1 | 1090 | |
dudmuck | 2:547cc73f8887 | 1091 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1092 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1093 | |
dudmuck | 1:33d322ad66b1 | 1094 | if (radio.type == SX1272) { |
dudmuck | 1:33d322ad66b1 | 1095 | lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 1:33d322ad66b1 | 1096 | param1 = lora.RegModemConfig.sx1272bits.LowDataRateOptimize; |
dudmuck | 1:33d322ad66b1 | 1097 | } else if (radio.type == SX1276) { |
dudmuck | 1:33d322ad66b1 | 1098 | lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3); |
dudmuck | 1:33d322ad66b1 | 1099 | param1 = lora.RegModemConfig3.sx1276bits.LowDataRateOptimize; |
dudmuck | 1:33d322ad66b1 | 1100 | } else |
dudmuck | 1:33d322ad66b1 | 1101 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1102 | |
dudmuck | 1:33d322ad66b1 | 1103 | SCPI_ResultBool(context, param1); |
dudmuck | 1:33d322ad66b1 | 1104 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1105 | } |
dudmuck | 1:33d322ad66b1 | 1106 | |
dudmuck | 0:8767be3c1b7f | 1107 | scpi_result_t lora_bw(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1108 | { |
dudmuck | 0:8767be3c1b7f | 1109 | double KHz; |
dudmuck | 0:8767be3c1b7f | 1110 | |
dudmuck | 2:547cc73f8887 | 1111 | if (!is_lora()) |
dudmuck | 0:8767be3c1b7f | 1112 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1113 | |
dudmuck | 0:8767be3c1b7f | 1114 | if (!SCPI_ParamDouble(context, &KHz, TRUE)) |
dudmuck | 0:8767be3c1b7f | 1115 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1116 | |
dudmuck | 0:8767be3c1b7f | 1117 | lora.setBw_KHz(KHz); |
dudmuck | 0:8767be3c1b7f | 1118 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1119 | } |
dudmuck | 0:8767be3c1b7f | 1120 | |
dudmuck | 0:8767be3c1b7f | 1121 | scpi_result_t lora_bwQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1122 | { |
dudmuck | 0:8767be3c1b7f | 1123 | int bw; |
dudmuck | 0:8767be3c1b7f | 1124 | double khz; |
dudmuck | 0:8767be3c1b7f | 1125 | |
dudmuck | 2:547cc73f8887 | 1126 | if (!is_lora()) |
dudmuck | 0:8767be3c1b7f | 1127 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1128 | |
dudmuck | 0:8767be3c1b7f | 1129 | bw = lora.getBw(); |
dudmuck | 0:8767be3c1b7f | 1130 | |
dudmuck | 0:8767be3c1b7f | 1131 | if (radio.type == SX1272) { |
dudmuck | 0:8767be3c1b7f | 1132 | switch (bw) { |
dudmuck | 0:8767be3c1b7f | 1133 | case 0: khz = 125; break; |
dudmuck | 0:8767be3c1b7f | 1134 | case 1: khz = 250; break; |
dudmuck | 0:8767be3c1b7f | 1135 | case 2: khz = 500; break; |
dudmuck | 0:8767be3c1b7f | 1136 | } |
dudmuck | 0:8767be3c1b7f | 1137 | } else if (radio.type == SX1276) { |
dudmuck | 0:8767be3c1b7f | 1138 | switch (bw) { |
dudmuck | 0:8767be3c1b7f | 1139 | case 0: khz = 7.8; break; |
dudmuck | 0:8767be3c1b7f | 1140 | case 1: khz = 10.4; break; |
dudmuck | 0:8767be3c1b7f | 1141 | case 2: khz = 15.6; break; |
dudmuck | 0:8767be3c1b7f | 1142 | case 3: khz = 20.8; break; |
dudmuck | 0:8767be3c1b7f | 1143 | case 4: khz = 31.25; break; |
dudmuck | 0:8767be3c1b7f | 1144 | case 5: khz = 41.7; break; |
dudmuck | 0:8767be3c1b7f | 1145 | case 6: khz = 62.5; break; |
dudmuck | 0:8767be3c1b7f | 1146 | case 7: khz = 125; break; |
dudmuck | 0:8767be3c1b7f | 1147 | case 8: khz = 250; break; |
dudmuck | 0:8767be3c1b7f | 1148 | case 9: khz = 500; break; |
dudmuck | 0:8767be3c1b7f | 1149 | } |
dudmuck | 0:8767be3c1b7f | 1150 | } |
dudmuck | 0:8767be3c1b7f | 1151 | |
dudmuck | 0:8767be3c1b7f | 1152 | SCPI_ResultDouble(context, khz); |
dudmuck | 0:8767be3c1b7f | 1153 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1154 | } |
dudmuck | 0:8767be3c1b7f | 1155 | |
dudmuck | 0:8767be3c1b7f | 1156 | scpi_result_t lora_sf(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1157 | { |
dudmuck | 0:8767be3c1b7f | 1158 | int32_t i; |
dudmuck | 0:8767be3c1b7f | 1159 | |
dudmuck | 2:547cc73f8887 | 1160 | if (!is_lora()) |
dudmuck | 0:8767be3c1b7f | 1161 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1162 | |
dudmuck | 0:8767be3c1b7f | 1163 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 0:8767be3c1b7f | 1164 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1165 | |
dudmuck | 0:8767be3c1b7f | 1166 | lora.setSf(i); |
dudmuck | 0:8767be3c1b7f | 1167 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1168 | } |
dudmuck | 0:8767be3c1b7f | 1169 | |
dudmuck | 0:8767be3c1b7f | 1170 | scpi_result_t lora_sfQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1171 | { |
dudmuck | 2:547cc73f8887 | 1172 | if (!is_lora()) |
dudmuck | 0:8767be3c1b7f | 1173 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1174 | |
dudmuck | 0:8767be3c1b7f | 1175 | SCPI_ResultInt(context, lora.getSf()); |
dudmuck | 0:8767be3c1b7f | 1176 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1177 | } |
dudmuck | 0:8767be3c1b7f | 1178 | |
dudmuck | 1:33d322ad66b1 | 1179 | scpi_result_t lora_feiQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1180 | { |
dudmuck | 2:547cc73f8887 | 1181 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1182 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1183 | |
dudmuck | 1:33d322ad66b1 | 1184 | SCPI_ResultInt(context, lora.get_freq_error_Hz()); |
dudmuck | 1:33d322ad66b1 | 1185 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1186 | } |
dudmuck | 1:33d322ad66b1 | 1187 | |
dudmuck | 1:33d322ad66b1 | 1188 | scpi_result_t lora_pktsnrQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1189 | { |
dudmuck | 2:547cc73f8887 | 1190 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1191 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1192 | |
dudmuck | 1:33d322ad66b1 | 1193 | SCPI_ResultDouble(context, lora.RegPktSnrValue / 4.0); |
dudmuck | 1:33d322ad66b1 | 1194 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1195 | } |
dudmuck | 1:33d322ad66b1 | 1196 | |
dudmuck | 1:33d322ad66b1 | 1197 | scpi_result_t lora_pktrssiQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1198 | { |
dudmuck | 2:547cc73f8887 | 1199 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1200 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1201 | |
dudmuck | 1:33d322ad66b1 | 1202 | SCPI_ResultDouble(context, lora.get_pkt_rssi()); |
dudmuck | 1:33d322ad66b1 | 1203 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1204 | } |
dudmuck | 1:33d322ad66b1 | 1205 | |
dudmuck | 1:33d322ad66b1 | 1206 | |
dudmuck | 1:33d322ad66b1 | 1207 | scpi_result_t lora_prelen(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1208 | { |
dudmuck | 1:33d322ad66b1 | 1209 | int32_t i; |
dudmuck | 1:33d322ad66b1 | 1210 | |
dudmuck | 2:547cc73f8887 | 1211 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1212 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1213 | |
dudmuck | 1:33d322ad66b1 | 1214 | if (!SCPI_ParamInt(context, &i, TRUE)) |
dudmuck | 1:33d322ad66b1 | 1215 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1216 | |
dudmuck | 1:33d322ad66b1 | 1217 | lora.RegPreamble = i; |
dudmuck | 1:33d322ad66b1 | 1218 | radio.write_u16(REG_LR_PREAMBLEMSB, lora.RegPreamble); |
dudmuck | 1:33d322ad66b1 | 1219 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1220 | } |
dudmuck | 1:33d322ad66b1 | 1221 | |
dudmuck | 1:33d322ad66b1 | 1222 | scpi_result_t lora_prelenQ(scpi_t* context) |
dudmuck | 1:33d322ad66b1 | 1223 | { |
dudmuck | 2:547cc73f8887 | 1224 | if (!is_lora()) |
dudmuck | 1:33d322ad66b1 | 1225 | return SCPI_RES_ERR; |
dudmuck | 1:33d322ad66b1 | 1226 | |
dudmuck | 1:33d322ad66b1 | 1227 | lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB); |
dudmuck | 1:33d322ad66b1 | 1228 | SCPI_ResultInt(context, lora.RegPreamble); |
dudmuck | 1:33d322ad66b1 | 1229 | return SCPI_RES_OK; |
dudmuck | 1:33d322ad66b1 | 1230 | } |
dudmuck | 1:33d322ad66b1 | 1231 | |
dudmuck | 0:8767be3c1b7f | 1232 | scpi_result_t lora_txc(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1233 | { |
dudmuck | 0:8767be3c1b7f | 1234 | scpi_bool_t param1; |
dudmuck | 0:8767be3c1b7f | 1235 | |
dudmuck | 2:547cc73f8887 | 1236 | if (!is_lora()) |
dudmuck | 0:8767be3c1b7f | 1237 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1238 | |
dudmuck | 0:8767be3c1b7f | 1239 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 0:8767be3c1b7f | 1240 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1241 | |
dudmuck | 0:8767be3c1b7f | 1242 | lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 0:8767be3c1b7f | 1243 | lora.RegModemConfig2.sx1276bits.TxContinuousMode = param1; |
dudmuck | 0:8767be3c1b7f | 1244 | radio.write_reg(REG_LR_MODEMCONFIG2, lora.RegModemConfig2.octet); |
dudmuck | 0:8767be3c1b7f | 1245 | |
dudmuck | 0:8767be3c1b7f | 1246 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1247 | } |
dudmuck | 0:8767be3c1b7f | 1248 | |
dudmuck | 0:8767be3c1b7f | 1249 | scpi_result_t lora_txcQ(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1250 | { |
dudmuck | 2:547cc73f8887 | 1251 | if (!is_lora()) |
dudmuck | 0:8767be3c1b7f | 1252 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1253 | |
dudmuck | 0:8767be3c1b7f | 1254 | lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 0:8767be3c1b7f | 1255 | SCPI_ResultBool(context, lora.RegModemConfig2.sx1276bits.TxContinuousMode); |
dudmuck | 0:8767be3c1b7f | 1256 | |
dudmuck | 0:8767be3c1b7f | 1257 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1258 | } |
dudmuck | 0:8767be3c1b7f | 1259 | |
dudmuck | 0:8767be3c1b7f | 1260 | |
dudmuck | 0:8767be3c1b7f | 1261 | #ifdef TARGET_MOTE_L152RC |
dudmuck | 0:8767be3c1b7f | 1262 | scpi_result_t pd2_set(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1263 | { |
dudmuck | 0:8767be3c1b7f | 1264 | scpi_bool_t param1; |
dudmuck | 1:33d322ad66b1 | 1265 | |
dudmuck | 1:33d322ad66b1 | 1266 | if (!SCPI_ParamBool(context, ¶m1, TRUE)) |
dudmuck | 0:8767be3c1b7f | 1267 | return SCPI_RES_ERR; |
dudmuck | 0:8767be3c1b7f | 1268 | |
dudmuck | 0:8767be3c1b7f | 1269 | pd2 = param1; |
dudmuck | 0:8767be3c1b7f | 1270 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1271 | } |
dudmuck | 0:8767be3c1b7f | 1272 | |
dudmuck | 0:8767be3c1b7f | 1273 | scpi_result_t pd2_get(scpi_t* context) |
dudmuck | 0:8767be3c1b7f | 1274 | { |
dudmuck | 0:8767be3c1b7f | 1275 | SCPI_ResultBool(context, pd2.read()); |
dudmuck | 0:8767be3c1b7f | 1276 | return SCPI_RES_OK; |
dudmuck | 0:8767be3c1b7f | 1277 | } |
dudmuck | 0:8767be3c1b7f | 1278 | #endif /* TARGET_MOTE_L152RC */ |
dudmuck | 0:8767be3c1b7f | 1279 | |
dudmuck | 0:8767be3c1b7f | 1280 | static const scpi_command_t scpi_commands[] = { |
dudmuck | 0:8767be3c1b7f | 1281 | // http://na.support.keysight.com/pna/help/latest/Programming/GP-IB_Command_Finder/Common_Commands.htm |
dudmuck | 0:8767be3c1b7f | 1282 | /* IEEE Mandated Commands (SCPI std V1999.0 4.1.1) */ |
dudmuck | 0:8767be3c1b7f | 1283 | { .pattern = "*CLS", .callback = SCPI_CoreCls,}, // clear status |
dudmuck | 0:8767be3c1b7f | 1284 | { .pattern = "*ESE", .callback = SCPI_CoreEse,}, // standard event status enable |
dudmuck | 0:8767be3c1b7f | 1285 | { .pattern = "*ESE?", .callback = SCPI_CoreEseQ,}, |
dudmuck | 0:8767be3c1b7f | 1286 | { .pattern = "*ESR?", .callback = SCPI_CoreEsrQ,}, // event status query |
dudmuck | 0:8767be3c1b7f | 1287 | { .pattern = "*IDN?", .callback = SCPI_CoreIdnQ,}, // identification query |
dudmuck | 0:8767be3c1b7f | 1288 | { .pattern = "*OPC", .callback = SCPI_CoreOpc,}, // operation complete command |
dudmuck | 0:8767be3c1b7f | 1289 | { .pattern = "*OPC?", .callback = SCPI_CoreOpcQ,}, // operation complete query |
dudmuck | 0:8767be3c1b7f | 1290 | { .pattern = "*RST", .callback = SCPI_CoreRst,}, // reset command |
dudmuck | 0:8767be3c1b7f | 1291 | { .pattern = "*SRE", .callback = SCPI_CoreSre,}, // service request enable command |
dudmuck | 0:8767be3c1b7f | 1292 | { .pattern = "*SRE?", .callback = SCPI_CoreSreQ,}, // service request enable query |
dudmuck | 0:8767be3c1b7f | 1293 | { .pattern = "*STB?", .callback = SCPI_CoreStbQ,}, // status byte register query |
dudmuck | 0:8767be3c1b7f | 1294 | { .pattern = "*TST?", .callback = SCPI_CoreTstQ,}, // self-test query |
dudmuck | 0:8767be3c1b7f | 1295 | { .pattern = "*WAI", .callback = SCPI_CoreWai,}, // wait to continue |
dudmuck | 0:8767be3c1b7f | 1296 | |
dudmuck | 0:8767be3c1b7f | 1297 | /* Required SCPI commands (SCPI std V1999.0 4.2.1) */ |
dudmuck | 0:8767be3c1b7f | 1298 | {.pattern = "SYSTem:ERRor[:NEXT]?", .callback = SCPI_SystemErrorNextQ,}, |
dudmuck | 0:8767be3c1b7f | 1299 | {.pattern = "SYSTem:ERRor:COUNt?", .callback = SCPI_SystemErrorCountQ,}, |
dudmuck | 0:8767be3c1b7f | 1300 | {.pattern = "SYSTem:VERSion?", .callback = SCPI_SystemVersionQ,}, |
dudmuck | 0:8767be3c1b7f | 1301 | |
dudmuck | 0:8767be3c1b7f | 1302 | //{.pattern = "STATus:OPERation?", .callback = scpi_stub_callback,}, |
dudmuck | 0:8767be3c1b7f | 1303 | //{.pattern = "STATus:OPERation:EVENt?", .callback = scpi_stub_callback,}, |
dudmuck | 0:8767be3c1b7f | 1304 | //{.pattern = "STATus:OPERation:CONDition?", .callback = scpi_stub_callback,}, |
dudmuck | 0:8767be3c1b7f | 1305 | //{.pattern = "STATus:OPERation:ENABle", .callback = scpi_stub_callback,}, |
dudmuck | 0:8767be3c1b7f | 1306 | //{.pattern = "STATus:OPERation:ENABle?", .callback = scpi_stub_callback,}, |
dudmuck | 0:8767be3c1b7f | 1307 | |
dudmuck | 0:8767be3c1b7f | 1308 | {.pattern = "STATus:QUEStionable[:EVENt]?", .callback = SCPI_StatusQuestionableEventQ,}, |
dudmuck | 0:8767be3c1b7f | 1309 | //{.pattern = "STATus:QUEStionable:CONDition?", .callback = scpi_stub_callback,}, |
dudmuck | 0:8767be3c1b7f | 1310 | {.pattern = "STATus:QUEStionable:ENABle", .callback = SCPI_StatusQuestionableEnable,}, |
dudmuck | 0:8767be3c1b7f | 1311 | {.pattern = "STATus:QUEStionable:ENABle?", .callback = SCPI_StatusQuestionableEnableQ,}, |
dudmuck | 0:8767be3c1b7f | 1312 | |
dudmuck | 0:8767be3c1b7f | 1313 | {.pattern = "STATus:PRESet", .callback = SCPI_StatusPreset,}, |
dudmuck | 0:8767be3c1b7f | 1314 | |
dudmuck | 0:8767be3c1b7f | 1315 | /* DMM */ |
dudmuck | 0:8767be3c1b7f | 1316 | /* |
dudmuck | 0:8767be3c1b7f | 1317 | {.pattern = "SYSTem:COMMunication:TCPIP:CONTROL?", .callback = SCPI_SystemCommTcpipControlQ,}, |
dudmuck | 0:8767be3c1b7f | 1318 | |
dudmuck | 0:8767be3c1b7f | 1319 | {.pattern = "TEST:BOOL", .callback = TEST_Bool,}, |
dudmuck | 0:8767be3c1b7f | 1320 | {.pattern = "TEST#:NUMbers#", .callback = TEST_Numbers,},*/ |
dudmuck | 0:8767be3c1b7f | 1321 | |
dudmuck | 0:8767be3c1b7f | 1322 | /*{.pattern = "TEST:CHOice?", .callback = TEST_ChoiceQ,},*/ |
dudmuck | 0:8767be3c1b7f | 1323 | |
dudmuck | 0:8767be3c1b7f | 1324 | |
dudmuck | 0:8767be3c1b7f | 1325 | {.pattern = "RAdio:FIfo", .callback = radio_fifo,}, |
dudmuck | 0:8767be3c1b7f | 1326 | {.pattern = "RAdio:FIfo?", .callback = radio_fifoQ,}, |
dudmuck | 1:33d322ad66b1 | 1327 | {.pattern = "RAdio:BINFIfo", .callback = radio_binFifo,}, |
dudmuck | 1:33d322ad66b1 | 1328 | {.pattern = "RAdio:BINFIfo?", .callback = radio_binFifoQ,}, |
dudmuck | 0:8767be3c1b7f | 1329 | {.pattern = "RAdio:MODulation", .callback = radio_modulation,}, |
dudmuck | 0:8767be3c1b7f | 1330 | {.pattern = "RAdio:MODulation?", .callback = radio_modulationQ,}, |
dudmuck | 0:8767be3c1b7f | 1331 | {.pattern = "RAdio:RSSI?", .callback = radio_rssiQ,}, |
dudmuck | 0:8767be3c1b7f | 1332 | {.pattern = "RAdio:OPmode", .callback = radio_opmode,}, |
dudmuck | 0:8767be3c1b7f | 1333 | {.pattern = "RAdio:OPmode?", .callback = radio_opmodeQ,}, |
dudmuck | 0:8767be3c1b7f | 1334 | {.pattern = "RAdio:PASelect", .callback = radio_PASelect,}, |
dudmuck | 0:8767be3c1b7f | 1335 | {.pattern = "RAdio:PASelect?", .callback = radio_PASelectQ,}, |
dudmuck | 0:8767be3c1b7f | 1336 | {.pattern = "RAdio:OCP", .callback = radio_ocp,}, |
dudmuck | 0:8767be3c1b7f | 1337 | {.pattern = "RAdio:OCP?", .callback = radio_ocpQ,}, |
dudmuck | 0:8767be3c1b7f | 1338 | {.pattern = "RAdio:POWer", .callback = radio_power,}, |
dudmuck | 0:8767be3c1b7f | 1339 | {.pattern = "RAdio:POWer?", .callback = radio_powerQ,}, |
dudmuck | 1:33d322ad66b1 | 1340 | {.pattern = "RAdio:BGR", .callback = radio_bgr,}, |
dudmuck | 1:33d322ad66b1 | 1341 | {.pattern = "RAdio:BGR?", .callback = radio_bgrQ,}, |
dudmuck | 1:33d322ad66b1 | 1342 | {.pattern = "RAdio:LNABoost", .callback = radio_lnaBoost,}, |
dudmuck | 1:33d322ad66b1 | 1343 | {.pattern = "RAdio:LNABoost?", .callback = radio_lnaBoostQ,}, |
dudmuck | 0:8767be3c1b7f | 1344 | {.pattern = "RAdio:FREQuency", .callback = radio_freq,}, |
dudmuck | 0:8767be3c1b7f | 1345 | {.pattern = "RAdio:FREQuency?", .callback = radio_freqQ,}, |
dudmuck | 1:33d322ad66b1 | 1346 | {.pattern = "RAdio:DIOMap", .callback = radio_diomap,}, |
dudmuck | 1:33d322ad66b1 | 1347 | {.pattern = "RAdio:DIOMap?", .callback = radio_diomapQ,}, |
dudmuck | 2:547cc73f8887 | 1348 | {.pattern = "RAdio:DIO?", .callback = radio_dioQ,}, |
dudmuck | 2:547cc73f8887 | 1349 | {.pattern = "RAdio:REGister", .callback = radio_reg,}, |
dudmuck | 2:547cc73f8887 | 1350 | {.pattern = "RAdio:REGister?", .callback = radio_regQ,}, |
dudmuck | 0:8767be3c1b7f | 1351 | |
dudmuck | 0:8767be3c1b7f | 1352 | {.pattern = "RAdio:FSK:SYNC", .callback = fsk_sync,}, |
dudmuck | 0:8767be3c1b7f | 1353 | {.pattern = "RAdio:FSK:SYNC?", .callback = fsk_syncQ,}, |
dudmuck | 1:33d322ad66b1 | 1354 | {.pattern = "RAdio:FSK:FDev", .callback = fsk_fdev,}, |
dudmuck | 1:33d322ad66b1 | 1355 | {.pattern = "RAdio:FSK:FDev?", .callback = fsk_fdevQ,}, |
dudmuck | 1:33d322ad66b1 | 1356 | {.pattern = "RAdio:FSK:BITRate", .callback = fsk_bitrate,}, |
dudmuck | 1:33d322ad66b1 | 1357 | {.pattern = "RAdio:FSK:BITRate?", .callback = fsk_bitrateQ,}, |
dudmuck | 1:33d322ad66b1 | 1358 | {.pattern = "RAdio:FSK:PRELen", .callback = fsk_prelen,}, |
dudmuck | 1:33d322ad66b1 | 1359 | {.pattern = "RAdio:FSK:PRELen?", .callback = fsk_prelenQ,}, |
dudmuck | 1:33d322ad66b1 | 1360 | {.pattern = "RAdio:FSK:RXBW", .callback = fsk_rxbw,}, |
dudmuck | 1:33d322ad66b1 | 1361 | {.pattern = "RAdio:FSK:RXBW?", .callback = fsk_rxbwQ,}, |
dudmuck | 1:33d322ad66b1 | 1362 | {.pattern = "RAdio:FSK:AFCBW", .callback = fsk_afcbw,}, |
dudmuck | 2:547cc73f8887 | 1363 | {.pattern = "RAdio:FSK:AFCBW?", .callback = fsk_afcbwQ,}, |
dudmuck | 2:547cc73f8887 | 1364 | {.pattern = "RAdio:FSK:DCFree", .callback = fsk_dcfree,}, |
dudmuck | 2:547cc73f8887 | 1365 | {.pattern = "RAdio:FSK:DCFree?", .callback = fsk_dcfreeQ,}, |
dudmuck | 2:547cc73f8887 | 1366 | {.pattern = "RAdio:FSK:RXTrigger", .callback = fsk_rxtrig,}, |
dudmuck | 2:547cc73f8887 | 1367 | {.pattern = "RAdio:FSK:RXTrigger?", .callback = fsk_rxtrigQ,}, |
dudmuck | 2:547cc73f8887 | 1368 | {.pattern = "RAdio:FSK:DATAMode", .callback = fsk_datamode,}, |
dudmuck | 2:547cc73f8887 | 1369 | {.pattern = "RAdio:FSK:DATAMode?", .callback = fsk_datamodeQ,}, |
dudmuck | 2:547cc73f8887 | 1370 | {.pattern = "RAdio:FSK:BT", .callback = fsk_bt,}, |
dudmuck | 2:547cc73f8887 | 1371 | {.pattern = "RAdio:FSK:BT?", .callback = fsk_btQ,}, |
dudmuck | 0:8767be3c1b7f | 1372 | |
dudmuck | 0:8767be3c1b7f | 1373 | {.pattern = "RAdio:LORa:BW", .callback = lora_bw,}, |
dudmuck | 0:8767be3c1b7f | 1374 | {.pattern = "RAdio:LORa:BW?", .callback = lora_bwQ,}, |
dudmuck | 0:8767be3c1b7f | 1375 | {.pattern = "RAdio:LORa:SF", .callback = lora_sf,}, |
dudmuck | 0:8767be3c1b7f | 1376 | {.pattern = "RAdio:LORa:SF?", .callback = lora_sfQ,}, |
dudmuck | 0:8767be3c1b7f | 1377 | {.pattern = "RAdio:LORa:TXContinuous", .callback = lora_txc,}, |
dudmuck | 0:8767be3c1b7f | 1378 | {.pattern = "RAdio:LORa:TXContinuous?", .callback = lora_txcQ,}, |
dudmuck | 1:33d322ad66b1 | 1379 | {.pattern = "RAdio:LORa:PRELen", .callback = lora_prelen,}, |
dudmuck | 1:33d322ad66b1 | 1380 | {.pattern = "RAdio:LORa:PRELen?", .callback = lora_prelenQ,}, |
dudmuck | 1:33d322ad66b1 | 1381 | {.pattern = "RAdio:LORa:CR", .callback = lora_cr,}, |
dudmuck | 1:33d322ad66b1 | 1382 | {.pattern = "RAdio:LORa:CR?", .callback = lora_crQ,}, |
dudmuck | 1:33d322ad66b1 | 1383 | {.pattern = "RAdio:LORa:LDRO", .callback = lora_ldro,}, |
dudmuck | 1:33d322ad66b1 | 1384 | {.pattern = "RAdio:LORa:LDRO?", .callback = lora_ldroQ,}, |
dudmuck | 1:33d322ad66b1 | 1385 | {.pattern = "RAdio:LORa:FEI?", .callback = lora_feiQ,}, |
dudmuck | 1:33d322ad66b1 | 1386 | {.pattern = "RAdio:LORa:PKTSnr?", .callback = lora_pktsnrQ,}, |
dudmuck | 1:33d322ad66b1 | 1387 | {.pattern = "RAdio:LORa:PKTRssi?", .callback = lora_pktrssiQ,}, |
dudmuck | 1:33d322ad66b1 | 1388 | {.pattern = "RAdio:LORa:Ih", .callback = lora_ih,}, |
dudmuck | 1:33d322ad66b1 | 1389 | {.pattern = "RAdio:LORa:Ih?", .callback = lora_ihQ,}, |
dudmuck | 2:547cc73f8887 | 1390 | {.pattern = "RAdio:LORa:CRC", .callback = lora_crc,}, |
dudmuck | 2:547cc73f8887 | 1391 | {.pattern = "RAdio:LORa:CRC?", .callback = lora_crcQ,}, |
dudmuck | 2:547cc73f8887 | 1392 | {.pattern = "RAdio:LORa:INVRx", .callback = lora_invrx,}, |
dudmuck | 2:547cc73f8887 | 1393 | {.pattern = "RAdio:LORa:INVRx?", .callback = lora_invrxQ,}, |
dudmuck | 2:547cc73f8887 | 1394 | {.pattern = "RAdio:LORa:INVTx", .callback = lora_invtx,}, |
dudmuck | 2:547cc73f8887 | 1395 | {.pattern = "RAdio:LORa:INVTx?", .callback = lora_invtxQ,}, |
dudmuck | 0:8767be3c1b7f | 1396 | |
dudmuck | 0:8767be3c1b7f | 1397 | #ifdef TARGET_MOTE_L152RC |
dudmuck | 0:8767be3c1b7f | 1398 | {.pattern = "PD2", .callback = pd2_set,}, |
dudmuck | 0:8767be3c1b7f | 1399 | {.pattern = "PD2?", .callback = pd2_get,}, |
dudmuck | 0:8767be3c1b7f | 1400 | #endif /* TARGET_MOTE_L152RC */ |
dudmuck | 0:8767be3c1b7f | 1401 | |
dudmuck | 0:8767be3c1b7f | 1402 | SCPI_CMD_LIST_END |
dudmuck | 0:8767be3c1b7f | 1403 | }; |
dudmuck | 0:8767be3c1b7f | 1404 | |
dudmuck | 0:8767be3c1b7f | 1405 | static scpi_interface_t scpi_interface = { |
dudmuck | 0:8767be3c1b7f | 1406 | .error = SCPI_Error, |
dudmuck | 0:8767be3c1b7f | 1407 | .write = SCPI_Write, |
dudmuck | 0:8767be3c1b7f | 1408 | .control = SCPI_Control, |
dudmuck | 0:8767be3c1b7f | 1409 | .flush = SCPI_Flush, |
dudmuck | 0:8767be3c1b7f | 1410 | .reset = SCPI_Reset, |
dudmuck | 0:8767be3c1b7f | 1411 | }; |
dudmuck | 0:8767be3c1b7f | 1412 | |
dudmuck | 0:8767be3c1b7f | 1413 | #define SCPI_INPUT_BUFFER_LENGTH 256 |
dudmuck | 0:8767be3c1b7f | 1414 | static char scpi_input_buffer[SCPI_INPUT_BUFFER_LENGTH]; |
dudmuck | 0:8767be3c1b7f | 1415 | static scpi_reg_val_t scpi_regs[SCPI_REG_COUNT]; |
dudmuck | 0:8767be3c1b7f | 1416 | |
dudmuck | 0:8767be3c1b7f | 1417 | scpi_t scpi_context = { |
dudmuck | 0:8767be3c1b7f | 1418 | .cmdlist = scpi_commands, |
dudmuck | 0:8767be3c1b7f | 1419 | .buffer = { |
dudmuck | 0:8767be3c1b7f | 1420 | .length = SCPI_INPUT_BUFFER_LENGTH, |
dudmuck | 0:8767be3c1b7f | 1421 | .data = scpi_input_buffer, |
dudmuck | 0:8767be3c1b7f | 1422 | }, |
dudmuck | 0:8767be3c1b7f | 1423 | .interface = &scpi_interface, |
dudmuck | 0:8767be3c1b7f | 1424 | .registers = scpi_regs, |
dudmuck | 0:8767be3c1b7f | 1425 | .units = scpi_units_def, |
dudmuck | 0:8767be3c1b7f | 1426 | .idn = {"mbed", "mbed-platform", NULL, "01-02"}, |
dudmuck | 0:8767be3c1b7f | 1427 | }; |
dudmuck | 0:8767be3c1b7f | 1428 | |
dudmuck | 0:8767be3c1b7f | 1429 | void scpi_def_init() |
dudmuck | 0:8767be3c1b7f | 1430 | { |
dudmuck | 0:8767be3c1b7f | 1431 | radio.rf_switch.attach(rfsw_callback); |
dudmuck | 0:8767be3c1b7f | 1432 | } |