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