StateResults StateNumber::CheckState(LexStateData &dat) { if(!dat.manip.GuessInChars(".0123456789", 11)) return Continue; dat.manip.unget(); int base = 10, ForceDouble = 0; if(dat.manip.GuessInChars("0", 1)) { if(dat.manip.GuessInChars("xX", 2)) return ReadBase16(dat); //{base=16;manip.UnfreezePos();manip.FreezePos();} if(dat.manip.GuessInChars("01234567", 8)) { dat.manip.unget(); base = 8; } } dat.manip.FreezePos(); while(dat.manip.GuessInChars("0123456789", 10)) ; if(dat.manip.GuessInChars("uU", 2)) return ConstructUnsigned(dat, base); if(!dat.manip.GuessInChars(".eE", 3)) return ConstructSigned(dat, base); else dat.manip.unget(); if(dat.manip.GuessInChars(".", 1)) { while(dat.manip.GuessInChars("0123456789", 10)) ; ForceDouble = 1; } string str = dat.manip.UnfreezeToStr(); dat.manip.FreezePos(); if(dat.manip.GuessInChars("eE", 2)) { dat.manip.GuessInChars("+-", 2); if(!dat.manip.GuessInChars("0123456789", 10)) { dat.manip.RestorePos(); if(ForceDouble) return ConstructDouble(dat, str); else return ConstructSigned(dat, str, base); } while(dat.manip.GuessInChars("0123456789", 10)) ; } str = str + dat.manip.UnfreezeToStr(); return ConstructDouble(dat, str); }
// load an Intel hex file into buffer bool ReadHexFile(char *filename) { FILE *fp; bool res = true; printf("\n"); fp = fopen(filename, "r"); if (fp == NULL) { printf("Unable to open %s.\n", filename); return false; } printf("Loading %s...\n", filename); memset(firmware_buffer, 0xFF, sizeof(firmware_buffer)); uint32_t base_addr = 0; int line_num = 0; while (feof(fp) != EOF) { line_num++; char line[1024]; if (fgets(line, sizeof(line), fp) == NULL) break; //printf("%u:\t%s", line_num, line); if (line[0] != ':') { printf("Invalid line %d (missing colon)\n", line_num); res = false; break; } char *c = &line[1]; uint8_t len = ReadBase16(c, 2); c += 2; uint16_t addr = ReadBase16(c, 4); c += 4; uint8_t type = ReadBase16(c, 2); c += 2; //printf("%u\t%X\t%u\n", len, addr, type); switch (type) { case 0: // data record for (uint16_t i = 0; i < len; i++) { uint32_t absadr = base_addr + (addr++); if (absadr > FIRMWARE_BUFFER_SIZE) { printf("Firmware image too large for buffer (%X).\n", absadr); res = false; goto exit; } firmware_buffer[absadr] = ReadBase16(c, 2); c += 2; if (absadr > firmware_size) firmware_size = absadr; } break; case 2: // extended segment address record if (len != 2) { printf("Invalid line %d (bad extended segment address length: %u)\n", line_num, len); res = false; break; } base_addr = ReadBase16(c, 4) << 4; //printf("%u:\tbase_addr = %X\n", line_num, base_addr); c += 4; } uint8_t checksum = ReadBase16(c, 2); // todo: check checksum if (res != true) break; } printf("Firmware size:\t%u bytes (0x%X)\n", firmware_size, firmware_size); // find embedded info uint32_t ptr = FindEmbeddedInfo(); if (ptr == 0xFFFFFFFF) { printf("Embedded info struct not found.\n"); fw_info = NULL; res = false; goto exit; } fw_info = (FW_INFO_t *)&firmware_buffer[ptr]; if (fw_info->flash_size_b > FIRMWARE_BUFFER_SIZE) { printf("Embedded flash size greater than buffer size.\n"); res = false; goto exit; } /* FW_INFO_t zzz; fw_info = &zzz; fw_info->flash_size_b = 0x40000; */ firmware_crc = xmega_nvm_crc32(firmware_buffer, fw_info->flash_size_b); printf("Firmware CRC:\t0x%lX\n", firmware_crc); printf("MCU ID:\t\t%02X%02X%02X\n", fw_info->mcu_signature[0], fw_info->mcu_signature[1], fw_info->mcu_signature[2]); printf("Flash size:\t%u bytes (0x%X)\n", fw_info->flash_size_b, fw_info->flash_size_b); printf("Page sise:\t%u bytes\n", fw_info->page_size_b); printf("Version:\t%u.%02u\n", fw_info->version_major, fw_info->version_minor); printf("\n"); exit: fclose(fp); return res; }