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:
ubhat
Date:
Tue Jan 19 21:34:03 2016 +0000
Revision:
8:888f7cd3d1d7
Parent:
6:074e01954263
Child:
10:aab2894e14a2
VBAT? command read fix

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