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:
Tue Aug 18 00:51:59 2015 +0000
Revision:
2:547cc73f8887
Parent:
1:33d322ad66b1
Child:
3:ab152c7086b4
added commands

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