Darien Figueroa / Mbed OS Final_Program

Dependencies:   USBDevice

Committer:
darienf
Date:
Sat Apr 10 02:05:01 2021 +0000
Revision:
2:86d928355813
Parent:
0:832122ce6748
before we screw up;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
darienf 0:832122ce6748 1 /*******************************************************************************
darienf 0:832122ce6748 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
darienf 0:832122ce6748 3 *
darienf 0:832122ce6748 4 * Permission is hereby granted, free of charge, to any person obtaining a
darienf 0:832122ce6748 5 * copy of this software and associated documentation files (the "Software"),
darienf 0:832122ce6748 6 * to deal in the Software without restriction, including without limitation
darienf 0:832122ce6748 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
darienf 0:832122ce6748 8 * and/or sell copies of the Software, and to permit persons to whom the
darienf 0:832122ce6748 9 * Software is furnished to do so, subject to the following conditions:
darienf 0:832122ce6748 10 *
darienf 0:832122ce6748 11 * The above copyright notice and this permission notice shall be included
darienf 0:832122ce6748 12 * in all copies or substantial portions of the Software.
darienf 0:832122ce6748 13 *
darienf 0:832122ce6748 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
darienf 0:832122ce6748 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
darienf 0:832122ce6748 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
darienf 0:832122ce6748 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
darienf 0:832122ce6748 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
darienf 0:832122ce6748 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
darienf 0:832122ce6748 20 * OTHER DEALINGS IN THE SOFTWARE.
darienf 0:832122ce6748 21 *
darienf 0:832122ce6748 22 * Except as contained in this notice, the name of Maxim Integrated
darienf 0:832122ce6748 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
darienf 0:832122ce6748 24 * Products, Inc. Branding Policy.
darienf 0:832122ce6748 25 *
darienf 0:832122ce6748 26 * The mere transfer of this software does not imply any licenses
darienf 0:832122ce6748 27 * of trade secrets, proprietary technology, copyrights, patents,
darienf 0:832122ce6748 28 * trademarks, maskwork rights, or any other form of intellectual
darienf 0:832122ce6748 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
darienf 0:832122ce6748 30 * ownership rights.
darienf 0:832122ce6748 31 *******************************************************************************
darienf 0:832122ce6748 32 */
darienf 0:832122ce6748 33 #include "RpcServer.h"
darienf 0:832122ce6748 34 #include "StringInOut.h"
darienf 0:832122ce6748 35 #include "StringHelper.h"
darienf 0:832122ce6748 36 #include "MAX30001_RPC.h"
darienf 0:832122ce6748 37 #include "MAX30101_RPC.h"
darienf 0:832122ce6748 38 #include "LIS2DH_RPC.h"
darienf 0:832122ce6748 39 #include "Logging_RPC.h"
darienf 0:832122ce6748 40 #include "Peripherals.h"
darienf 0:832122ce6748 41 #include "I2C_RPC.h"
darienf 0:832122ce6748 42 #include "BMP280_RPC.h"
darienf 0:832122ce6748 43 #include "MAX30205_RPC.h"
darienf 0:832122ce6748 44 #include "HspLed_RPC.h"
darienf 0:832122ce6748 45 #include "S25FS512_RPC.h"
darienf 0:832122ce6748 46 #include "Testing_RPC.h"
darienf 0:832122ce6748 47 #include "MAX14720_RPC.h"
darienf 0:832122ce6748 48 #include "RpcDeclarations.h"
darienf 0:832122ce6748 49 #include "Device_Logging.h"
darienf 0:832122ce6748 50
darienf 0:832122ce6748 51 /// define the version string that is reported with a RPC "ReadVer" command
darienf 0:832122ce6748 52 #define FW_VERSION_STRING "HSP FW Version 3.0.1 4/21/16"
darienf 0:832122ce6748 53
darienf 0:832122ce6748 54 char args[32][32];
darienf 0:832122ce6748 55 char results[32][32];
darienf 0:832122ce6748 56
darienf 0:832122ce6748 57 /// define a fifo for incoming USB data
darienf 0:832122ce6748 58 static fifo_t fifo;
darienf 0:832122ce6748 59 /// define a buffer for incoming USB data
darienf 0:832122ce6748 60 static uint8_t fifoBuffer[128];
darienf 0:832122ce6748 61 /// define stream out fifo
darienf 0:832122ce6748 62 static fifo_t fifoStreamOut;
darienf 0:832122ce6748 63 /// allocate a large fifo buffer for streaming out
darienf 0:832122ce6748 64 static uint32_t streamOutBuffer[0xC000 / 4];
darienf 0:832122ce6748 65
darienf 0:832122ce6748 66 /// define a device log for the BMP280, keeps track of mission and loggin status
darienf 0:832122ce6748 67 Device_Logging *bmp280_Logging;
darienf 0:832122ce6748 68 /// define a device log for the MAX30205 (instance 0), keeps track of mission
darienf 0:832122ce6748 69 /// and loggin status
darienf 0:832122ce6748 70 Device_Logging *MAX30205_0_Logging;
darienf 0:832122ce6748 71 /// define a device log for the MAX30205 (instance 1), keeps track of mission
darienf 0:832122ce6748 72 /// and loggin status
darienf 0:832122ce6748 73 Device_Logging *MAX30205_1_Logging;
darienf 0:832122ce6748 74
darienf 0:832122ce6748 75 ///Defines a timer to detect if a series of binary pages are being transfered via RPC
darienf 0:832122ce6748 76 Timer rpcFlashPagesTransferTimer;
darienf 0:832122ce6748 77 bool rpcFlashPagesTransferTimer_running;
darienf 0:832122ce6748 78
darienf 0:832122ce6748 79 //******************************************************************************
darienf 0:832122ce6748 80 fifo_t *GetUSBIncomingFifo(void) { return &fifo; }
darienf 0:832122ce6748 81
darienf 0:832122ce6748 82 //******************************************************************************
darienf 0:832122ce6748 83 fifo_t *GetStreamOutFifo(void) { return &fifoStreamOut; }
darienf 0:832122ce6748 84
darienf 0:832122ce6748 85 //******************************************************************************
darienf 0:832122ce6748 86 int System_ReadVer(char argStrs[32][32], char replyStrs[32][32]) {
darienf 0:832122ce6748 87 strcpy(replyStrs[0], FW_VERSION_STRING);
darienf 0:832122ce6748 88 strcpy(replyStrs[1], "\0");
darienf 0:832122ce6748 89 return 0;
darienf 0:832122ce6748 90 }
darienf 0:832122ce6748 91
darienf 0:832122ce6748 92 //******************************************************************************
darienf 0:832122ce6748 93 bool RPC_IsTransferingFlashPages(void) {
darienf 0:832122ce6748 94 if (rpcFlashPagesTransferTimer_running == true) {
darienf 0:832122ce6748 95 if (rpcFlashPagesTransferTimer.read_ms() < 200) {
darienf 0:832122ce6748 96 return true;
darienf 0:832122ce6748 97 } else {
darienf 0:832122ce6748 98 rpcFlashPagesTransferTimer.stop();
darienf 0:832122ce6748 99 rpcFlashPagesTransferTimer_running = false;
darienf 0:832122ce6748 100 }
darienf 0:832122ce6748 101 }
darienf 0:832122ce6748 102 return false;
darienf 0:832122ce6748 103 }
darienf 0:832122ce6748 104
darienf 0:832122ce6748 105 //******************************************************************************
darienf 0:832122ce6748 106 void RPC_TransferingFlashPages(void) {
darienf 0:832122ce6748 107 if (rpcFlashPagesTransferTimer_running == false) {
darienf 0:832122ce6748 108 rpcFlashPagesTransferTimer.start();
darienf 0:832122ce6748 109 rpcFlashPagesTransferTimer_running = true;
darienf 0:832122ce6748 110 }
darienf 0:832122ce6748 111 rpcFlashPagesTransferTimer.reset();
darienf 0:832122ce6748 112 }
darienf 0:832122ce6748 113
darienf 0:832122ce6748 114 //******************************************************************************
darienf 0:832122ce6748 115 int System_ReadBuildTime(char argStrs[32][32], char replyStrs[32][32]) {
darienf 0:832122ce6748 116 // strcpy(replyStrs[0],buildTime);
darienf 0:832122ce6748 117 // strcpy(replyStrs[1],"\0");
darienf 0:832122ce6748 118 return 0;
darienf 0:832122ce6748 119 }
darienf 0:832122ce6748 120
darienf 0:832122ce6748 121 //******************************************************************************
darienf 0:832122ce6748 122 int System_SystemCoreClock(char argStrs[32][32], char replyStrs[32][32]) {
darienf 0:832122ce6748 123 sprintf(replyStrs[0], "SystemCoreClock = %d", (unsigned int)SystemCoreClock);
darienf 0:832122ce6748 124 strcpy(replyStrs[1], "\0");
darienf 0:832122ce6748 125 return 0;
darienf 0:832122ce6748 126 }
darienf 0:832122ce6748 127
darienf 0:832122ce6748 128 //******************************************************************************
darienf 0:832122ce6748 129 int System_GetTimestamp(char argStrs[32][32], char replyStrs[32][32]) {
darienf 0:832122ce6748 130 sprintf(replyStrs[0], "GetTimestamp = %d", 0);
darienf 0:832122ce6748 131 strcpy(replyStrs[1], "\0");
darienf 0:832122ce6748 132 return 0;
darienf 0:832122ce6748 133 }
darienf 0:832122ce6748 134
darienf 0:832122ce6748 135 static struct RPC_Object RPC_Procedures = {NULL, NULL};
darienf 0:832122ce6748 136
darienf 0:832122ce6748 137 //******************************************************************************
darienf 0:832122ce6748 138 void RPC_addProcedure(struct RPC_registeredProcedure *procedure) {
darienf 0:832122ce6748 139 struct RPC_Object *obj = &RPC_Procedures;
darienf 0:832122ce6748 140 if (obj->last != NULL) {
darienf 0:832122ce6748 141 obj->last->next = procedure;
darienf 0:832122ce6748 142 }
darienf 0:832122ce6748 143 if (obj->head == NULL) {
darienf 0:832122ce6748 144 obj->head = procedure;
darienf 0:832122ce6748 145 }
darienf 0:832122ce6748 146 procedure->next = NULL;
darienf 0:832122ce6748 147 obj->last = procedure;
darienf 0:832122ce6748 148 }
darienf 0:832122ce6748 149
darienf 0:832122ce6748 150 //******************************************************************************
darienf 0:832122ce6748 151 void RPC_init(void) {
darienf 0:832122ce6748 152 bmp280_Logging = new Device_Logging();
darienf 0:832122ce6748 153 MAX30205_0_Logging = new Device_Logging();
darienf 0:832122ce6748 154 MAX30205_1_Logging = new Device_Logging();
darienf 0:832122ce6748 155
darienf 0:832122ce6748 156 rpcFlashPagesTransferTimer_running = false;
darienf 0:832122ce6748 157
darienf 0:832122ce6748 158 fifo_init(&fifo, fifoBuffer, sizeof(fifoBuffer));
darienf 0:832122ce6748 159 fifo_init(&fifoStreamOut, streamOutBuffer,
darienf 0:832122ce6748 160 sizeof(streamOutBuffer) / sizeof(uint32_t));
darienf 0:832122ce6748 161
darienf 0:832122ce6748 162 // I2c
darienf 0:832122ce6748 163 RPC_addProcedure(&Define_I2c_WriteRead);
darienf 0:832122ce6748 164
darienf 0:832122ce6748 165 // MAX30101
darienf 0:832122ce6748 166 RPC_addProcedure(&Define_MAX30101_WriteReg);
darienf 0:832122ce6748 167 RPC_addProcedure(&Define_MAX30101_ReadReg);
darienf 0:832122ce6748 168 RPC_addProcedure(&Define_MAX30101_SpO2mode_Init);
darienf 0:832122ce6748 169 RPC_addProcedure(&Define_MAX30101_HRmode_Init);
darienf 0:832122ce6748 170 RPC_addProcedure(&Define_MAX30101_Multimode_init);
darienf 0:832122ce6748 171 RPC_addProcedure(&Define_MAX30101_SpO2mode_InitStart);
darienf 0:832122ce6748 172 RPC_addProcedure(&Define_MAX30101_HRmode_InitStart);
darienf 0:832122ce6748 173 RPC_addProcedure(&Define_MAX30101_Multimode_InitStart);
darienf 0:832122ce6748 174 RPC_addProcedure(&Define_MAX30101_SpO2mode_stop);
darienf 0:832122ce6748 175 RPC_addProcedure(&Define_MAX30101_HRmode_stop);
darienf 0:832122ce6748 176 RPC_addProcedure(&Define_MAX30101_Multimode_stop);
darienf 0:832122ce6748 177
darienf 0:832122ce6748 178 // MAX30001
darienf 0:832122ce6748 179 RPC_addProcedure(&Define_MAX30001_WriteReg);
darienf 0:832122ce6748 180 RPC_addProcedure(&Define_MAX30001_ReadReg);
darienf 0:832122ce6748 181 RPC_addProcedure(&Define_MAX30001_Start);
darienf 0:832122ce6748 182 RPC_addProcedure(&Define_MAX30001_Stop);
darienf 0:832122ce6748 183 RPC_addProcedure(&Define_MAX30001_Enable_ECG_LeadON);
darienf 0:832122ce6748 184 RPC_addProcedure(&Define_MAX30001_Enable_BIOZ_LeadON);
darienf 0:832122ce6748 185 RPC_addProcedure(&Define_MAX30001_Read_LeadON);
darienf 0:832122ce6748 186 RPC_addProcedure(&Define_MAX30001_StartTest);
darienf 0:832122ce6748 187 RPC_addProcedure(&Define_MAX30001_INT_assignment);
darienf 0:832122ce6748 188 RPC_addProcedure(&Define_MAX30001_Rbias_FMSTR_Init);
darienf 0:832122ce6748 189 RPC_addProcedure(&Define_MAX30001_CAL_InitStart);
darienf 0:832122ce6748 190 RPC_addProcedure(&Define_MAX30001_ECG_InitStart);
darienf 0:832122ce6748 191 RPC_addProcedure(&Define_MAX30001_ECGFast_Init);
darienf 0:832122ce6748 192 RPC_addProcedure(&Define_MAX30001_PACE_InitStart);
darienf 0:832122ce6748 193 RPC_addProcedure(&Define_MAX30001_BIOZ_InitStart);
darienf 0:832122ce6748 194 RPC_addProcedure(&Define_MAX30001_RtoR_InitStart);
darienf 0:832122ce6748 195 RPC_addProcedure(&Define_MAX30001_Stop_ECG);
darienf 0:832122ce6748 196 RPC_addProcedure(&Define_MAX30001_Stop_PACE);
darienf 0:832122ce6748 197 RPC_addProcedure(&Define_MAX30001_Stop_BIOZ);
darienf 0:832122ce6748 198 RPC_addProcedure(&Define_MAX30001_Stop_RtoR);
darienf 0:832122ce6748 199 RPC_addProcedure(&Define_MAX30001_Stop_Cal);
darienf 0:832122ce6748 200
darienf 0:832122ce6748 201 // Logging
darienf 0:832122ce6748 202 RPC_addProcedure(&Define_Logging_StartMissionDefine);
darienf 0:832122ce6748 203 RPC_addProcedure(&Define_Logging_AppendMissionCmd);
darienf 0:832122ce6748 204 RPC_addProcedure(&Define_Logging_EndMissionDefine);
darienf 0:832122ce6748 205 RPC_addProcedure(&Define_Logging_WriteMission);
darienf 0:832122ce6748 206 RPC_addProcedure(&Define_Logging_ReadMission);
darienf 0:832122ce6748 207 RPC_addProcedure(&Define_Logging_EraseMission);
darienf 0:832122ce6748 208 RPC_addProcedure(&Define_Logging_EraseWrittenSectors);
darienf 0:832122ce6748 209 RPC_addProcedure(&Define_Logging_StartLoggingUsb);
darienf 0:832122ce6748 210 RPC_addProcedure(&Define_Logging_StartLoggingFlash);
darienf 0:832122ce6748 211 RPC_addProcedure(&Define_Logging_GetLastWrittenPage);
darienf 0:832122ce6748 212 RPC_addProcedure(&Define_Logging_Start);
darienf 0:832122ce6748 213
darienf 0:832122ce6748 214 // LIS2HD
darienf 0:832122ce6748 215 RPC_addProcedure(&Define_LIS2DH_InitStart);
darienf 0:832122ce6748 216 RPC_addProcedure(&Define_LIS2DH_ReadReg);
darienf 0:832122ce6748 217 RPC_addProcedure(&Define_LIS2DH_WriteReg);
darienf 0:832122ce6748 218 RPC_addProcedure(&Define_LIS2DH_Stop);
darienf 0:832122ce6748 219
darienf 0:832122ce6748 220 // BMP280
darienf 0:832122ce6748 221 RPC_addProcedure(&Define_BMP280_InitStart);
darienf 0:832122ce6748 222
darienf 0:832122ce6748 223 // MAX30205 and MAX31725 Alias
darienf 0:832122ce6748 224 RPC_addProcedure(&Define_MAX30205_1_InitStart);
darienf 0:832122ce6748 225 RPC_addProcedure(&Define_MAX30205_2_InitStart);
darienf 0:832122ce6748 226 RPC_addProcedure(&Define_MAX31725_1_InitStart);
darienf 0:832122ce6748 227 RPC_addProcedure(&Define_MAX31725_2_InitStart);
darienf 0:832122ce6748 228
darienf 0:832122ce6748 229 // led
darienf 0:832122ce6748 230 RPC_addProcedure(&Define_Led_On);
darienf 0:832122ce6748 231 RPC_addProcedure(&Define_Led_Off);
darienf 0:832122ce6748 232 RPC_addProcedure(&Define_Led_BlinkHz);
darienf 0:832122ce6748 233 RPC_addProcedure(&Define_Led_BlinkPattern);
darienf 0:832122ce6748 234
darienf 0:832122ce6748 235 // S25FS512
darienf 0:832122ce6748 236 RPC_addProcedure(&Define_S25FS512_ReadId);
darienf 0:832122ce6748 237 RPC_addProcedure(&Define_S25FS512_ReadPagesBinary);
darienf 0:832122ce6748 238 RPC_addProcedure(&Define_S25FS512_Reset);
darienf 0:832122ce6748 239 RPC_addProcedure(&Define_S25FS512_EnableHWReset);
darienf 0:832122ce6748 240 RPC_addProcedure(&Define_S25FS512_SpiWriteRead);
darienf 0:832122ce6748 241 RPC_addProcedure(&Define_S25FS512_SpiWriteRead4Wire);
darienf 0:832122ce6748 242
darienf 0:832122ce6748 243 // Testing
darienf 0:832122ce6748 244 RPC_addProcedure(&Define_Testing_Test_S25FS512);
darienf 0:832122ce6748 245 RPC_addProcedure(&Define_Testing_Test_BMP280);
darienf 0:832122ce6748 246 RPC_addProcedure(&Define_Testing_Test_LIS2DH);
darienf 0:832122ce6748 247 RPC_addProcedure(&Define_Testing_Test_LSM6DS3);
darienf 0:832122ce6748 248 RPC_addProcedure(&Define_Testing_Test_MAX30205_1);
darienf 0:832122ce6748 249 RPC_addProcedure(&Define_Testing_Test_MAX30205_2);
darienf 0:832122ce6748 250 RPC_addProcedure(&Define_Testing_Test_MAX30101);
darienf 0:832122ce6748 251 RPC_addProcedure(&Define_Testing_Test_MAX30001);
darienf 0:832122ce6748 252 RPC_addProcedure(&Define_Testing_Test_EM9301);
darienf 0:832122ce6748 253
darienf 0:832122ce6748 254 // System
darienf 0:832122ce6748 255 RPC_addProcedure(&Define_System_ReadVer);
darienf 0:832122ce6748 256 RPC_addProcedure(&Define_System_ReadBuildTime);
darienf 0:832122ce6748 257
darienf 0:832122ce6748 258 // MAX14720
darienf 0:832122ce6748 259 RPC_addProcedure(&Define_MAX14720_ReadBoostVSet);
darienf 0:832122ce6748 260 RPC_addProcedure(&Define_MAX14720_WriteBoostVSet);
darienf 0:832122ce6748 261 RPC_addProcedure(&Define_MAX14720_ReadReg);
darienf 0:832122ce6748 262 RPC_addProcedure(&Define_MAX14720_WriteReg);
darienf 0:832122ce6748 263 }
darienf 0:832122ce6748 264
darienf 0:832122ce6748 265 //******************************************************************************
darienf 0:832122ce6748 266 struct RPC_registeredProcedure *RPC_lookup(char *objectName, char *methodName) {
darienf 0:832122ce6748 267 struct RPC_registeredProcedure *ptr;
darienf 0:832122ce6748 268 // lookup all registered methods
darienf 0:832122ce6748 269 ptr = RPC_Procedures.head;
darienf 0:832122ce6748 270 while (ptr != NULL) {
darienf 0:832122ce6748 271 if (strcmp(ptr->objectName, objectName) == 0 &&
darienf 0:832122ce6748 272 strcmp(ptr->methodName, methodName) == 0) {
darienf 0:832122ce6748 273 // we found a match... return with it
darienf 0:832122ce6748 274 return ptr;
darienf 0:832122ce6748 275 }
darienf 0:832122ce6748 276 ptr = ptr->next;
darienf 0:832122ce6748 277 }
darienf 0:832122ce6748 278 return NULL;
darienf 0:832122ce6748 279 }
darienf 0:832122ce6748 280
darienf 0:832122ce6748 281 //******************************************************************************
darienf 0:832122ce6748 282 char *GetToken(char *inStr, char *outStr, int start, char ch) {
darienf 0:832122ce6748 283 int i;
darienf 0:832122ce6748 284 int index = 0;
darienf 0:832122ce6748 285 int length = strlen(inStr);
darienf 0:832122ce6748 286 for (i = start; i < length; i++) {
darienf 0:832122ce6748 287 if (inStr[i] != ch) {
darienf 0:832122ce6748 288 outStr[index++] = inStr[i];
darienf 0:832122ce6748 289 } else {
darienf 0:832122ce6748 290 break;
darienf 0:832122ce6748 291 }
darienf 0:832122ce6748 292 }
darienf 0:832122ce6748 293 outStr[index++] = 0;
darienf 0:832122ce6748 294 return outStr;
darienf 0:832122ce6748 295 }
darienf 0:832122ce6748 296
darienf 0:832122ce6748 297 //******************************************************************************
darienf 0:832122ce6748 298 void SendCommandList(char *reply) {
darienf 0:832122ce6748 299 struct RPC_registeredProcedure *ptr;
darienf 0:832122ce6748 300 reply[0] = 0;
darienf 0:832122ce6748 301 ptr = RPC_Procedures.head;
darienf 0:832122ce6748 302 while (ptr != NULL) {
darienf 0:832122ce6748 303 strcat(reply, "/");
darienf 0:832122ce6748 304 strcat(reply, ptr->objectName);
darienf 0:832122ce6748 305 strcat(reply, "/");
darienf 0:832122ce6748 306 strcat(reply, ptr->methodName);
darienf 0:832122ce6748 307 strcat(reply, ",");
darienf 0:832122ce6748 308 ptr = ptr->next;
darienf 0:832122ce6748 309 }
darienf 0:832122ce6748 310 strcat(reply, "\r\n");
darienf 0:832122ce6748 311 }
darienf 0:832122ce6748 312
darienf 0:832122ce6748 313 //******************************************************************************
darienf 0:832122ce6748 314 int CheckForDoubleQuote(const char *str) {
darienf 0:832122ce6748 315 int doubleQuoteFound;
darienf 0:832122ce6748 316 // scan through arguments, see if there is a double quote for a string
darienf 0:832122ce6748 317 // argument
darienf 0:832122ce6748 318 doubleQuoteFound = 0;
darienf 0:832122ce6748 319 while (*str != 0) {
darienf 0:832122ce6748 320 if (*str == '\"') {
darienf 0:832122ce6748 321 doubleQuoteFound = 1;
darienf 0:832122ce6748 322 break;
darienf 0:832122ce6748 323 }
darienf 0:832122ce6748 324 str++;
darienf 0:832122ce6748 325 }
darienf 0:832122ce6748 326 return doubleQuoteFound;
darienf 0:832122ce6748 327 }
darienf 0:832122ce6748 328
darienf 0:832122ce6748 329 //******************************************************************************
darienf 0:832122ce6748 330 void ExtractDoubleQuoteStr(const char *src, char *dst) {
darienf 0:832122ce6748 331 int start;
darienf 0:832122ce6748 332
darienf 0:832122ce6748 333 dst[0] = 0;
darienf 0:832122ce6748 334 start = 0;
darienf 0:832122ce6748 335 while (*src != 0) {
darienf 0:832122ce6748 336 // look for start
darienf 0:832122ce6748 337 if ((*src == '\"') && (start == 0)) {
darienf 0:832122ce6748 338 start = 1;
darienf 0:832122ce6748 339 src++;
darienf 0:832122ce6748 340 continue;
darienf 0:832122ce6748 341 }
darienf 0:832122ce6748 342 // look for end
darienf 0:832122ce6748 343 if ((*src == '\"') && (start == 1)) {
darienf 0:832122ce6748 344 *dst = 0; // terminate the string
darienf 0:832122ce6748 345 break;
darienf 0:832122ce6748 346 }
darienf 0:832122ce6748 347 if (start == 1) {
darienf 0:832122ce6748 348 *dst = *src;
darienf 0:832122ce6748 349 dst++;
darienf 0:832122ce6748 350 }
darienf 0:832122ce6748 351 src++;
darienf 0:832122ce6748 352 }
darienf 0:832122ce6748 353 }
darienf 0:832122ce6748 354
darienf 0:832122ce6748 355 //******************************************************************************
darienf 0:832122ce6748 356 void RPC_call_test(void) {
darienf 0:832122ce6748 357 int doubleQuoteFound;
darienf 0:832122ce6748 358 char doubleQuoteStr[64];
darienf 0:832122ce6748 359 const char *request = "/Logging/AppendMissionCmd \"BMP280 InitStart 1\"";
darienf 0:832122ce6748 360
darienf 0:832122ce6748 361 // scan through arguments, see if there is a double quote for a string
darienf 0:832122ce6748 362 // argument
darienf 0:832122ce6748 363 doubleQuoteFound = CheckForDoubleQuote(request);
darienf 0:832122ce6748 364 if (doubleQuoteFound) {
darienf 0:832122ce6748 365 ExtractDoubleQuoteStr(request, doubleQuoteStr);
darienf 0:832122ce6748 366 }
darienf 0:832122ce6748 367 }
darienf 0:832122ce6748 368
darienf 0:832122ce6748 369 //******************************************************************************
darienf 0:832122ce6748 370 void RPC_call(char *request, char *reply) {
darienf 0:832122ce6748 371 const char slash[2] = "/";
darienf 0:832122ce6748 372 const char space[2] = " ";
darienf 0:832122ce6748 373 char *objectName;
darienf 0:832122ce6748 374 char *methodName;
darienf 0:832122ce6748 375 char doubleQuoteStr[64];
darienf 0:832122ce6748 376 char requestCpy[128];
darienf 0:832122ce6748 377 char *token;
darienf 0:832122ce6748 378 int argIndex;
darienf 0:832122ce6748 379 int resultIndex;
darienf 0:832122ce6748 380 int doubleQuoteFound;
darienf 0:832122ce6748 381 struct RPC_registeredProcedure *procedurePtr;
darienf 0:832122ce6748 382 int callResult;
darienf 0:832122ce6748 383
darienf 0:832122ce6748 384 // clear out the reply
darienf 0:832122ce6748 385 reply[0] = 0;
darienf 0:832122ce6748 386 // copy the request for scanning and extraction later
darienf 0:832122ce6748 387 strcpy(requestCpy, request);
darienf 0:832122ce6748 388 // check for beginning forward slash
darienf 0:832122ce6748 389 if (request[0] != '/') {
darienf 0:832122ce6748 390 return;
darienf 0:832122ce6748 391 }
darienf 0:832122ce6748 392 // check for only a forward slash
darienf 0:832122ce6748 393 if (request[0] == '/' && request[1] == 0) {
darienf 0:832122ce6748 394 SendCommandList(reply);
darienf 0:832122ce6748 395 return;
darienf 0:832122ce6748 396 }
darienf 0:832122ce6748 397 strcat(request, " ");
darienf 0:832122ce6748 398 // get the object name
darienf 0:832122ce6748 399 token = strtok(request, slash);
darienf 0:832122ce6748 400 // token = GetToken(request, tokenBuffer, 1, '/');
darienf 0:832122ce6748 401 objectName = token;
darienf 0:832122ce6748 402 if (objectName == NULL)
darienf 0:832122ce6748 403 return; // must have an object name
darienf 0:832122ce6748 404 // get the method name
darienf 0:832122ce6748 405 token = strtok(NULL, space);
darienf 0:832122ce6748 406 methodName = token;
darienf 0:832122ce6748 407 if (methodName == NULL)
darienf 0:832122ce6748 408 return; // must have a method name
darienf 0:832122ce6748 409
darienf 0:832122ce6748 410 // scan through arguments, see if there is a double quote for a string
darienf 0:832122ce6748 411 // argument
darienf 0:832122ce6748 412 doubleQuoteFound = CheckForDoubleQuote(requestCpy);
darienf 0:832122ce6748 413
darienf 0:832122ce6748 414 if (doubleQuoteFound == 0) {
darienf 0:832122ce6748 415 // walk through arguments
darienf 0:832122ce6748 416 argIndex = 0;
darienf 0:832122ce6748 417 token = strtok(NULL, space);
darienf 0:832122ce6748 418 while (token != NULL) {
darienf 0:832122ce6748 419 // save this arg in array
darienf 0:832122ce6748 420 strcpy(args[argIndex++], token);
darienf 0:832122ce6748 421 // read next token arg if any
darienf 0:832122ce6748 422 token = strtok(NULL, space);
darienf 0:832122ce6748 423 }
darienf 0:832122ce6748 424 // terminate the end of the string array with an empty string
darienf 0:832122ce6748 425 strcpy(args[argIndex], "\0");
darienf 0:832122ce6748 426 strcpy(results[0], "\0");
darienf 0:832122ce6748 427 } else {
darienf 0:832122ce6748 428 // grab out the double quote string
darienf 0:832122ce6748 429 ExtractDoubleQuoteStr(requestCpy, doubleQuoteStr);
darienf 0:832122ce6748 430 argIndex = 0;
darienf 0:832122ce6748 431 // token = strtok(NULL, quote);
darienf 0:832122ce6748 432 strcpy(args[argIndex++], doubleQuoteStr);
darienf 0:832122ce6748 433 }
darienf 0:832122ce6748 434
darienf 0:832122ce6748 435 //
darienf 0:832122ce6748 436 // alias the MAX30001 and MAX30003 names
darienf 0:832122ce6748 437 //
darienf 0:832122ce6748 438 if (strcmp(objectName, MAX30003_NAME) == 0) {
darienf 0:832122ce6748 439 strcpy(objectName, MAX30001_NAME);
darienf 0:832122ce6748 440 }
darienf 0:832122ce6748 441
darienf 0:832122ce6748 442 callResult = 0;
darienf 0:832122ce6748 443 procedurePtr = RPC_lookup(objectName, methodName);
darienf 0:832122ce6748 444 if (procedurePtr != NULL) {
darienf 0:832122ce6748 445 // printf("RPC_call: %s processing\n",requestCpy);
darienf 0:832122ce6748 446 callResult = procedurePtr->func(args, results);
darienf 0:832122ce6748 447 } else {
darienf 0:832122ce6748 448 printf("RPC_call: %s not found\n", requestCpy);
darienf 0:832122ce6748 449 // printf("Unable to lookup %s %s", objectName, methodName);
darienf 0:832122ce6748 450 }
darienf 0:832122ce6748 451
darienf 0:832122ce6748 452 // loop while (if) there are results to return
darienf 0:832122ce6748 453 resultIndex = 0;
darienf 0:832122ce6748 454 strcpy(reply, "\0");
darienf 0:832122ce6748 455 if (callResult != RPC_SKIP_CRLF) {
darienf 0:832122ce6748 456 while (results[resultIndex][0] != '\0') {
darienf 0:832122ce6748 457 strcat(reply, results[resultIndex++]);
darienf 0:832122ce6748 458 strcat(reply, " ");
darienf 0:832122ce6748 459 }
darienf 0:832122ce6748 460 strcat(reply, "\r\n");
darienf 0:832122ce6748 461 }
darienf 0:832122ce6748 462 }
darienf 0:832122ce6748 463
darienf 0:832122ce6748 464 //******************************************************************************
darienf 0:832122ce6748 465 void RPC_ProcessCmds(char *cmds) {
darienf 0:832122ce6748 466 char cmd[32 * 32];
darienf 0:832122ce6748 467 char *ptrCmds;
darienf 0:832122ce6748 468 char reply[512];
darienf 0:832122ce6748 469 ptrCmds = cmds;
darienf 0:832122ce6748 470
darienf 0:832122ce6748 471 while (*ptrCmds != 0) {
darienf 0:832122ce6748 472 ptrCmds = ParseUntilCRLF(ptrCmds, cmd, sizeof(cmd));
darienf 0:832122ce6748 473 if (*cmd != 0) {
darienf 0:832122ce6748 474 RPC_call(cmd, reply);
darienf 0:832122ce6748 475 }
darienf 0:832122ce6748 476 }
darienf 0:832122ce6748 477 }