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