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:
Wayne Roberts
Date:
Tue May 29 12:45:54 2018 -0700
Revision:
12:60990328c884
Parent:
10:aab2894e14a2
update to latest libraries

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