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 15:58:03 2015 +0000
Revision:
3:ab152c7086b4
Parent:
2:547cc73f8887
Child:
4:23f467ca9934
clear tx_busy upon *RST

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