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