repo time

Dependencies:   mbed MAX14720 MAX30205 USBDevice

Committer:
darienf
Date:
Tue Apr 06 06:41:40 2021 +0000
Revision:
20:6d2af70c92ab
another repo

Who changed what in which revision?

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