void readEEPROM(void) { eepromConfig_t *dst = &eepromConfig; *dst = *(eepromConfig_t*)FLASH_WRITE_EEPROM_ADDR ; if ( crcCheckVal != crc32bEEPROM(dst, true) ) { evrPush(EVR_FlashCRCFail,0); dst->CRCFlags |= CRC_HistoryBad; } else if ( dst->CRCFlags & CRC_HistoryBad ) evrPush(EVR_ConfigBadHistory,0); accConfidenceDecay = 1.0f / sqrt(eepromConfig.accelCutoff); eepromConfig.yawDirection = constrain(eepromConfig.yawDirection, -1.0f, 1.0f); }
void cliPrintEEPROM(eepromConfig_t *e) { uint32_t old_crc = e->CRCAtEnd[0]; enum { line_length = 32, len = sizeof(eepromConfig_t) }; uint8_t *by = (uint8_t*)e; int i, j; e->CRCAtEnd[0] = crc32bEEPROM(e, false); if (e->CRCFlags & CRC_HistoryBad) evrPush(EVR_ConfigBadHistory, 0); for (i = 0; i < ceil((float)len / line_length); i++) { for (j = 0; j < min(line_length, len - line_length * i); j++) cliPortPrintF("%02X", by[i * line_length + j]); cliPortPrint("\n"); } e->CRCAtEnd[0] = old_crc; }
void eepromCLI() { uint32_t c1, c2; uint8_t eepromQuery = 'x'; uint8_t validQuery = false; cliBusy = true; cliPortPrint("\nEntering EEPROM CLI....\n\n"); while(true) { cliPortPrint("EEPROM CLI -> "); while ((cliPortAvailable() == false) && (validQuery == false)); if (validQuery == false) eepromQuery = cliPortRead(); cliPortPrint("\n"); switch(eepromQuery) { // 'a' is the standard "print all the information" character case 'a': // config struct data c1 = eepromConfig.CRCAtEnd[0]; zeroPIDstates(); c2 = crc32bEEPROM(&eepromConfig, false); cliPortPrintF("Config structure information:\n"); cliPortPrintF("Version : %d\n", eepromConfig.version ); cliPortPrintF("Size : %d\n", sizeof(eepromConfig) ); cliPortPrintF("CRC on last read : %08X\n", c1 ); cliPortPrintF("Current CRC : %08X\n", c2 ); if ( c1 != c2 ) cliPortPrintF(" CRCs differ. Current Config has not yet been saved.\n"); cliPortPrintF("CRC Flags :\n"); cliPortPrintF(" History Bad : %s\n", eepromConfig.CRCFlags & CRC_HistoryBad ? "true" : "false" ); validQuery = false; break; /////////////////////////// case 'c': // Write out to Console in Hex. (RAM -> console) // we assume the flyer is not in the air, so that this is ok; // these change randomly when not in flight and can mistakenly // make one think that the in-memory eeprom struct has changed zeroPIDstates(); cliPortPrintF("\n"); cliPrintEEPROM(&eepromConfig); cliPortPrintF("\n"); if (crcCheckVal != crc32bEEPROM(&eepromConfig, true)) { cliPortPrint("NOTE: in-memory config CRC invalid; there have probably been changes to\n"); cliPortPrint(" eepromConfig since the last write to flash/eeprom.\n"); } validQuery = false; break; /////////////////////////// case 'H': // clear bad history flag cliPortPrintF("Clearing Bad History flag.\n"); eepromConfig.CRCFlags &= ~CRC_HistoryBad; validQuery = false; break; /////////////////////////// case 'C': // Read in from Console in hex. Console -> RAM ; uint32_t sz = sizeof(eepromConfig); eepromConfig_t e; uint8_t *p = (uint8_t*)&e; uint8_t *end = (uint8_t*)(&e + 1); uint32_t t = millis(); enum { Timeout = 100 }; // timeout is in ms int second_nibble = 0; // 0 or 1 char c; uint32_t chars_encountered = 0; cliPortPrintF("Ready to read in config. Expecting %d (0x%03X) bytes as %d\n", sz, sz, sz * 2); cliPortPrintF("hexadecimal characters, optionally separated by [ \\n\\r_].\n"); cliPortPrintF("Times out if no character is received for %dms\n", Timeout); memset(p, 0, end - p); while (p < end) { while (!cliPortAvailable() && millis() - t < Timeout) {} t = millis(); c = cliPortAvailable() ? cliPortRead() : '\0'; int8_t hex = parse_hex(c); int ignore = c == ' ' || c == '\n' || c == '\r' || c == '_' ? true : false; if (c != '\0') // assume the person isn't sending null chars chars_encountered++; if (ignore) continue; if (hex == -1) break; *p |= second_nibble ? hex : hex << 4; p += second_nibble; second_nibble ^= 1; } if (c == 0) { cliPortPrintF("Did not receive enough hex chars! (got %d, expected %d)\n", (p - (uint8_t*)&e) * 2 + second_nibble, sz * 2); } else if (p < end || second_nibble) { cliPortPrintF("Invalid character found at position %d: '%c' (0x%02x)", chars_encountered, c, c); } // HJI else if (crcCheckVal != crc32bEEPROM(&e, true)) // HJI { // HJI cliPortPrintF("CRC mismatch! Not writing to in-memory config.\n"); // HJI cliPortPrintF("Here's what was received:\n\n"); // HJI cliPrintEEPROM(&e); // HJI } else { // check to see if the newly received eeprom config // actually differs from what's in-memory zeroPIDstates(); int i; for (i = 0; i < sz; i++) if (((uint8_t*)&e)[i] != ((uint8_t*)&eepromConfig)[i]) break; if (i == sz) { cliPortPrintF("NOTE: uploaded config was identical to in-memory config.\n"); } else { eepromConfig = e; cliPortPrintF("In-memory config updated!\n"); cliPortPrintF("NOTE: config not written to EEPROM; use 'W' to do so.\n"); } } // eat the next 100ms (or whatever Timeout is) of characters, // in case the person pasted too much by mistake or something t = millis(); while (millis() - t < Timeout) if (cliPortAvailable()) cliPortRead(); validQuery = false; break; /////////////////////////// case 'E': // Read in from EEPROM. (EEPROM -> RAM) cliPortPrint("Re-reading EEPROM.\n"); readEEPROM(); validQuery = false; break; /////////////////////////// case 'x': // exit EEPROM CLI cliPortPrint("\nExiting EEPROM CLI....\n\n"); cliBusy = false; return; break; /////////////////////////// case 'W': case 'e': // Write out to EEPROM. (RAM -> EEPROM) cliPortPrint("\nWriting EEPROM Parameters....\n\n"); validQuery = false; writeEEPROM(); break; /////////////////////////// case 'f': // Write out to sdCard FILE. (RAM -> FILE) validQuery = false; break; /////////////////////////// case 'F': // Read in from sdCard FILE. (FILE -> RAM) validQuery = false; break; /////////////////////////// case 'V': // Reset EEPROM Parameters cliPortPrint( "\nEEPROM Parameters Reset....(not rebooting)\n" ); checkFirstTime(true); validQuery = false; break; /////////////////////////// case '?': // 0 1 2 3 4 5 6 7 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789 cliPortPrintF("\n"); cliPortPrintF("'a' Display in-RAM config information\n"); cliPortPrintF("'c' Write in-RAM -> Console (as Hex) 'C' Read Console (as Hex) -> in-RAM\n"); cliPortPrintF("'e' Write in-RAM -> EEPROM 'E' Read EEPROM -> in-RAM\n"); cliPortPrintF("'f' Write in-RAM -> sd FILE (Not yet imp) 'F' Read sd FILE -> in-RAM (Not imp)\n"); cliPortPrintF(" 'H' Clear CRC Bad History flag\n"); cliPortPrintF(" 'V' Reset in-RAM config to default.\n"); cliPortPrintF("'x' Exit EEPROM CLI '?' Command Summary\n"); cliPortPrintF("\n"); cliPortPrintF("For compatability: 'W' Write in-RAM -> EEPROM\n"); cliPortPrintF("\n"); break; /////////////////////////// } } }