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 state
  • PD2? get power amplifier voltage state
  • VBAT? read battery voltage
  • GPS
    • :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
Committer:
dudmuck
Date:
Tue Aug 18 17:12:26 2015 +0000
Revision:
4:23f467ca9934
Parent:
3:ab152c7086b4
Child:
5:0a62140cefa4
handle PaSelect/rfsw correctly for mote

Who changed what in which revision?

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