20200716 read Status Register each second

Dependencies:   SDFileSystem mbed-os-example-ble-GattServer max32630fthr

Committer:
aureliocarella
Date:
Thu Jul 16 14:59:04 2020 +0000
Revision:
21:51e162c130a9
20200716

Who changed what in which revision?

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