firstTest

Dependencies:   mbed lib_sx9500 SX127x lib_mpl3115a2 lib_mma8451q lib_gps libscpi

Committer:
bongkwan
Date:
Tue Apr 14 02:53:27 2020 +0000
Revision:
0:1aa6d4a96bf1
Child:
1:96123698b488
first comment

Who changed what in which revision?

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