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 "StringHelper.h"
darienf 20:6d2af70c92ab 34 #include <stdint.h>
darienf 20:6d2af70c92ab 35 #include "Streaming.h"
darienf 20:6d2af70c92ab 36 #include "StringInOut.h"
darienf 20:6d2af70c92ab 37 #include "DataLoggingService.h"
darienf 20:6d2af70c92ab 38 #include "Peripherals.h"
darienf 20:6d2af70c92ab 39 #include "Logging.h"
darienf 20:6d2af70c92ab 40
darienf 20:6d2af70c92ab 41 extern char loggingMissionCmds[4096];
darienf 20:6d2af70c92ab 42 uint32_t missionCmdIndex;
darienf 20:6d2af70c92ab 43
darienf 20:6d2af70c92ab 44 //******************************************************************************
darienf 20:6d2af70c92ab 45 int Logging_RPC_StartMissionDefine(char argStrs[32][32],
darienf 20:6d2af70c92ab 46 char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 47 uint32_t i;
darienf 20:6d2af70c92ab 48 uint32_t reply[1];
darienf 20:6d2af70c92ab 49
darienf 20:6d2af70c92ab 50 // reset the missionCmdIndex to the beginning of the cmd buffer
darienf 20:6d2af70c92ab 51 missionCmdIndex = 0;
darienf 20:6d2af70c92ab 52 // clear the mission command buffer, fill with zeros
darienf 20:6d2af70c92ab 53 for (i = 0; i < sizeof(loggingMissionCmds); i++) {
darienf 20:6d2af70c92ab 54 loggingMissionCmds[i] = 0;
darienf 20:6d2af70c92ab 55 }
darienf 20:6d2af70c92ab 56
darienf 20:6d2af70c92ab 57 reply[0] = 0x80;
darienf 20:6d2af70c92ab 58 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 59 return 0;
darienf 20:6d2af70c92ab 60 }
darienf 20:6d2af70c92ab 61
darienf 20:6d2af70c92ab 62 //******************************************************************************
darienf 20:6d2af70c92ab 63 int Logging_RPC_AppendMissionCmd(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 64 uint32_t reply[1];
darienf 20:6d2af70c92ab 65 char *strPtr;
darienf 20:6d2af70c92ab 66 uint32_t count = 0;
darienf 20:6d2af70c92ab 67 uint8_t result = 0x80;
darienf 20:6d2af70c92ab 68 // append the string to the mission cmd log
darienf 20:6d2af70c92ab 69 strPtr = argStrs[0];
darienf 20:6d2af70c92ab 70 while (*strPtr != 0) {
darienf 20:6d2af70c92ab 71 loggingMissionCmds[missionCmdIndex] = *strPtr;
darienf 20:6d2af70c92ab 72 missionCmdIndex++;
darienf 20:6d2af70c92ab 73 strPtr++;
darienf 20:6d2af70c92ab 74 // do not overrun buffer
darienf 20:6d2af70c92ab 75 if (missionCmdIndex > (sizeof(loggingMissionCmds) - 2)) {
darienf 20:6d2af70c92ab 76 result = 0xFF;
darienf 20:6d2af70c92ab 77 break;
darienf 20:6d2af70c92ab 78 }
darienf 20:6d2af70c92ab 79 count++;
darienf 20:6d2af70c92ab 80 // do not read more than max count in incoming string
darienf 20:6d2af70c92ab 81 if (count > (32 * 32)) {
darienf 20:6d2af70c92ab 82 result = 0xFF;
darienf 20:6d2af70c92ab 83 break;
darienf 20:6d2af70c92ab 84 }
darienf 20:6d2af70c92ab 85 }
darienf 20:6d2af70c92ab 86 if (result != 0x80) {
darienf 20:6d2af70c92ab 87 reply[0] = 0xFF;
darienf 20:6d2af70c92ab 88 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 89 return 0;
darienf 20:6d2af70c92ab 90 }
darienf 20:6d2af70c92ab 91 // add cr/lf to the end of this cmd string
darienf 20:6d2af70c92ab 92 loggingMissionCmds[missionCmdIndex++] = 13;
darienf 20:6d2af70c92ab 93 loggingMissionCmds[missionCmdIndex++] = 10;
darienf 20:6d2af70c92ab 94
darienf 20:6d2af70c92ab 95 reply[0] = 0x80;
darienf 20:6d2af70c92ab 96 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 97 return 0;
darienf 20:6d2af70c92ab 98 }
darienf 20:6d2af70c92ab 99
darienf 20:6d2af70c92ab 100 //******************************************************************************
darienf 20:6d2af70c92ab 101 int Logging_RPC_EndMissionDefine(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 102 uint32_t reply[1];
darienf 20:6d2af70c92ab 103 reply[0] = 0x80;
darienf 20:6d2af70c92ab 104 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 105 return 0;
darienf 20:6d2af70c92ab 106 }
darienf 20:6d2af70c92ab 107
darienf 20:6d2af70c92ab 108 //******************************************************************************
darienf 20:6d2af70c92ab 109 int Logging_RPC_WriteMission(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 110 uint8_t page;
darienf 20:6d2af70c92ab 111 char *ptr;
darienf 20:6d2af70c92ab 112 uint32_t reply[1];
darienf 20:6d2af70c92ab 113
darienf 20:6d2af70c92ab 114 Peripherals::s25FS512()->parameterSectorErase_Helper(0x0);
darienf 20:6d2af70c92ab 115 ptr = loggingMissionCmds;
darienf 20:6d2af70c92ab 116 for (page = 0; page < 16; page++) {
darienf 20:6d2af70c92ab 117 Peripherals::s25FS512()->writePage_Helper(page, (uint8_t *)ptr, 0);
darienf 20:6d2af70c92ab 118 ptr += 256;
darienf 20:6d2af70c92ab 119 }
darienf 20:6d2af70c92ab 120
darienf 20:6d2af70c92ab 121 reply[0] = 0x80;
darienf 20:6d2af70c92ab 122 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 123 return 0;
darienf 20:6d2af70c92ab 124 }
darienf 20:6d2af70c92ab 125
darienf 20:6d2af70c92ab 126 //******************************************************************************
darienf 20:6d2af70c92ab 127 int Logging_RPC_ReadMission(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 128 char *ptr;
darienf 20:6d2af70c92ab 129 uint32_t i;
darienf 20:6d2af70c92ab 130 // read sector 0
darienf 20:6d2af70c92ab 131 ptr = loggingMissionCmds;
darienf 20:6d2af70c92ab 132 for (i = 0; i < 16; i++) {
darienf 20:6d2af70c92ab 133 Peripherals::s25FS512()->readPages_Helper(i, i, (uint8_t *)ptr, 0);
darienf 20:6d2af70c92ab 134 ptr += 256;
darienf 20:6d2af70c92ab 135 }
darienf 20:6d2af70c92ab 136 // strip header by shifting payload left
darienf 20:6d2af70c92ab 137 ptr = loggingMissionCmds;
darienf 20:6d2af70c92ab 138 for (i = 0; i < sizeof(loggingMissionCmds); i++) {
darienf 20:6d2af70c92ab 139 if (*ptr == 13) {
darienf 20:6d2af70c92ab 140 *ptr = ':';
darienf 20:6d2af70c92ab 141 } else if (*ptr == 10) {
darienf 20:6d2af70c92ab 142 *ptr = ' ';
darienf 20:6d2af70c92ab 143 }
darienf 20:6d2af70c92ab 144 ptr++;
darienf 20:6d2af70c92ab 145 }
darienf 20:6d2af70c92ab 146 if (loggingMissionCmds[0] == 0xFF || loggingMissionCmds[0] == 0x0) {
darienf 20:6d2af70c92ab 147 sprintf(loggingMissionCmds, "%s", "null ");
darienf 20:6d2af70c92ab 148 }
darienf 20:6d2af70c92ab 149 // send it out via uart
darienf 20:6d2af70c92ab 150 putStr(loggingMissionCmds);
darienf 20:6d2af70c92ab 151 replyStrs[0][0] = 0;
darienf 20:6d2af70c92ab 152 return 0;
darienf 20:6d2af70c92ab 153 }
darienf 20:6d2af70c92ab 154
darienf 20:6d2af70c92ab 155 //******************************************************************************
darienf 20:6d2af70c92ab 156 int Logging_RPC_EraseMission(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 157 uint32_t reply[1];
darienf 20:6d2af70c92ab 158 Peripherals::s25FS512()->parameterSectorErase_Helper(0x0);
darienf 20:6d2af70c92ab 159 reply[0] = 0x80;
darienf 20:6d2af70c92ab 160 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 161 return 0;
darienf 20:6d2af70c92ab 162 }
darienf 20:6d2af70c92ab 163
darienf 20:6d2af70c92ab 164 #define SECTOR_SIZE_256K 0x10000
darienf 20:6d2af70c92ab 165 #define PAGE_INC_256K 0x400
darienf 20:6d2af70c92ab 166 #define SECTOR_SIZE_4K 0x1000
darienf 20:6d2af70c92ab 167 #define PAGE_INC_4K 0x10
darienf 20:6d2af70c92ab 168 #define TOTAL_SECTOR_NUMBER 263
darienf 20:6d2af70c92ab 169
darienf 20:6d2af70c92ab 170 //******************************************************************************
darienf 20:6d2af70c92ab 171 int Logging_EraseWrittenSectors(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 172 uint32_t reply[1];
darienf 20:6d2af70c92ab 173 uint8_t data[512];
darienf 20:6d2af70c92ab 174 uint32_t address;
darienf 20:6d2af70c92ab 175 uint32_t pageNumber;
darienf 20:6d2af70c92ab 176 uint32_t pageEmpty;
darienf 20:6d2af70c92ab 177 uint32_t currentSector;
darienf 20:6d2af70c92ab 178
darienf 20:6d2af70c92ab 179 pageNumber = PAGE_INC_4K;
darienf 20:6d2af70c92ab 180 address = SECTOR_SIZE_4K;
darienf 20:6d2af70c92ab 181 currentSector = 0;
darienf 20:6d2af70c92ab 182 printf("Logging_EraseWrittenSectors ");
darienf 20:6d2af70c92ab 183 fflush(stdout);
darienf 20:6d2af70c92ab 184 printf("pageNumber %d 0x%X ", pageNumber, pageNumber);
darienf 20:6d2af70c92ab 185 fflush(stdout);
darienf 20:6d2af70c92ab 186 printf("SECTOR_SIZE_4K %d 0x%X ...", SECTOR_SIZE_4K, SECTOR_SIZE_4K);
darienf 20:6d2af70c92ab 187 fflush(stdout);
darienf 20:6d2af70c92ab 188 // always erase this sector... the first part is used for the mission resume
darienf 20:6d2af70c92ab 189 // table
darienf 20:6d2af70c92ab 190 Peripherals::s25FS512()->sectorErase_Helper(address);
darienf 20:6d2af70c92ab 191 address += SECTOR_SIZE_4K;
darienf 20:6d2af70c92ab 192 while (currentSector < TOTAL_SECTOR_NUMBER) {
darienf 20:6d2af70c92ab 193 // sample the page
darienf 20:6d2af70c92ab 194 pageNumber = address >> 8;
darienf 20:6d2af70c92ab 195 Peripherals::s25FS512()->readPages_Helper(pageNumber, pageNumber, data, 0);
darienf 20:6d2af70c92ab 196 pageEmpty = Peripherals::s25FS512()->isPageEmpty(data);
darienf 20:6d2af70c92ab 197 if (pageEmpty == 0) {
darienf 20:6d2af70c92ab 198 Peripherals::s25FS512()->sectorErase_Helper(address);
darienf 20:6d2af70c92ab 199 } else {
darienf 20:6d2af70c92ab 200 // stop processing... all of the sectors from here on out should be empty
darienf 20:6d2af70c92ab 201 // printf("Logging_EraseWrittenSectors break "); fflush(stdout);
darienf 20:6d2af70c92ab 202 // break;
darienf 20:6d2af70c92ab 203 }
darienf 20:6d2af70c92ab 204 currentSector++;
darienf 20:6d2af70c92ab 205 if (currentSector < 8) {
darienf 20:6d2af70c92ab 206 address += SECTOR_SIZE_4K;
darienf 20:6d2af70c92ab 207 }
darienf 20:6d2af70c92ab 208 if (currentSector == 8) {
darienf 20:6d2af70c92ab 209 address = SECTOR_SIZE_256K;
darienf 20:6d2af70c92ab 210 }
darienf 20:6d2af70c92ab 211 if (currentSector > 8) {
darienf 20:6d2af70c92ab 212 address += SECTOR_SIZE_256K;
darienf 20:6d2af70c92ab 213 }
darienf 20:6d2af70c92ab 214 }
darienf 20:6d2af70c92ab 215 reply[0] = 0x80;
darienf 20:6d2af70c92ab 216 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 217 printf("Logging_EraseWrittenSectors done. \n");
darienf 20:6d2af70c92ab 218 fflush(stdout);
darienf 20:6d2af70c92ab 219 return 0;
darienf 20:6d2af70c92ab 220 }
darienf 20:6d2af70c92ab 221
darienf 20:6d2af70c92ab 222 //******************************************************************************
darienf 20:6d2af70c92ab 223 int Logging_Start(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 224 uint32_t reply[1];
darienf 20:6d2af70c92ab 225 Logging_SetStart(true);
darienf 20:6d2af70c92ab 226 reply[0] = 0x80; // indicate success
darienf 20:6d2af70c92ab 227 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 228 return 0;
darienf 20:6d2af70c92ab 229 }
darienf 20:6d2af70c92ab 230
darienf 20:6d2af70c92ab 231 //******************************************************************************
darienf 20:6d2af70c92ab 232 int Logging_GetLastWrittenPage(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 233 uint32_t reply[1];
darienf 20:6d2af70c92ab 234
darienf 20:6d2af70c92ab 235 uint32_t page;
darienf 20:6d2af70c92ab 236 uint32_t lastPage;
darienf 20:6d2af70c92ab 237 uint32_t pageEmpty;
darienf 20:6d2af70c92ab 238 uint8_t data[512];
darienf 20:6d2af70c92ab 239
darienf 20:6d2af70c92ab 240 printf("Logging_GetLastWrittenPage ");
darienf 20:6d2af70c92ab 241 fflush(stdout);
darienf 20:6d2af70c92ab 242 lastPage = Logging_GetLoggingEndPage();
darienf 20:6d2af70c92ab 243 for (page = 2; page <= lastPage; page++) {
darienf 20:6d2af70c92ab 244 // Peripherals::serial()->printf("checking page %d ",page); fflush(stdout);
darienf 20:6d2af70c92ab 245 // sample the page
darienf 20:6d2af70c92ab 246 Peripherals::s25FS512()->readPages_Helper(page, page, data, 0);
darienf 20:6d2af70c92ab 247 pageEmpty = Peripherals::s25FS512()->isPageEmpty(data);
darienf 20:6d2af70c92ab 248 if (pageEmpty != 0) {
darienf 20:6d2af70c92ab 249 break;
darienf 20:6d2af70c92ab 250 }
darienf 20:6d2af70c92ab 251 }
darienf 20:6d2af70c92ab 252 if (page > lastPage)
darienf 20:6d2af70c92ab 253 page = lastPage;
darienf 20:6d2af70c92ab 254 printf("last page %d, 0x%X ", page, page);
darienf 20:6d2af70c92ab 255 fflush(stdout);
darienf 20:6d2af70c92ab 256 reply[0] = page;
darienf 20:6d2af70c92ab 257 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 258 return 0;
darienf 20:6d2af70c92ab 259 }
darienf 20:6d2af70c92ab 260
darienf 20:6d2af70c92ab 261 extern int highDataRate;
darienf 20:6d2af70c92ab 262 //******************************************************************************
darienf 20:6d2af70c92ab 263 int Logging_StartLoggingUsb(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 264 uint32_t reply[1];
darienf 20:6d2af70c92ab 265 // highDataRate = 0;
darienf 20:6d2af70c92ab 266 LoggingService_StartLoggingUsb();
darienf 20:6d2af70c92ab 267 reply[0] = 0x80;
darienf 20:6d2af70c92ab 268 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 269 return 0;
darienf 20:6d2af70c92ab 270 }
darienf 20:6d2af70c92ab 271 //******************************************************************************
darienf 20:6d2af70c92ab 272 int Logging_StartLoggingFlash(char argStrs[32][32], char replyStrs[32][32]) {
darienf 20:6d2af70c92ab 273 uint32_t reply[1];
darienf 20:6d2af70c92ab 274 // highDataRate = 0;
darienf 20:6d2af70c92ab 275 LoggingService_StartLoggingFlash();
darienf 20:6d2af70c92ab 276 reply[0] = 0x80;
darienf 20:6d2af70c92ab 277 FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
darienf 20:6d2af70c92ab 278 return 0;
darienf 20:6d2af70c92ab 279 }