Maxim Integrated / MAX30001EVSYSKIT
Committer:
Emre.Eken
Date:
Wed Jun 27 14:17:34 2018 +0300
Revision:
1:957e5bad16c2
first rev

Who changed what in which revision?

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