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:
Wed Sep 30 19:34:50 2015 +0000
Revision:
6:074e01954263
Parent:
5:0a62140cefa4
Child:
8:888f7cd3d1d7
added hardware version detection

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