Flash write geo begin
i=1: lon=124.34,lat=24.45
i=2: lon=125.34,lat=25.45
i=3: lon=126.34,lat=26.45
i=4: lon=127.34,lat=27.45
i=5: lon=128.34,lat=28.45
i=6: lon=129.34,lat=29.45
i=7: lon=130.34,lat=30.45
i=8: lon=131.34,lat=31.45
i=9: lon=132.34,lat=32.45
i=10: lon=133.34,lat=33.45
i=11: lon=134.34,lat=34.45
i=12: lon=135.34,lat=35.45
i=13: lon=136.34,lat=36.45
i=14: lon=137.34,lat=37.45
i=15: lon=138.34,lat=38.45
i=16: lon=139.34,lat=39.45
i=17: lon=140.34,lat=40.45
i=18: lon=141.34,lat=41.45
i=19: lon=142.34,lat=42.45
i=20: lon=143.34,lat=43.45
i=21: lon=144.34,lat=44.45
i=22: lon=145.34,lat=45.45
i=23: lon=146.34,lat=46.45
i=24: lon=147.34,lat=47.45
i=25: lon=148.34,lat=48.45
i=26: lon=149.34,lat=49.45
i=27: lon=150.34,lat=50.45
i=28: lon=151.34,lat=51.45
i=29: lon=152.34,lat=52.45
i=30: lon=153.34,lat=53.45
i=31: lon=154.34,lat=54.45
i=32: lon=155.34,lat=55.45
void flash_geo_write(uint8_t i, geo_t geo) {
double lon = geo.longitude;
double lat = geo.latitude;
/**
* add support for cross sector write
* flash range: 256~4096(first sector store config)
* max spots: (4096-256)/16=240
*/
uint32_t dest = 256 * (1 + i / 16) + (i % 16 - 1) * 16;
W25Q16_Write_Page((void*)&lon, dest, 8);
W25Q16_Write_Page((void*)&lat, dest + 8, 8);
}
geo_t flash_geo_read(uint8_t i) {
uint8_t buffer[16];
uint32_t dest = 256 + (i - 1) * 16;
W25Q16_Read(buffer, dest, 16);
double lon = *(double*)buffer;
double lat = *(double*)(buffer + 8);
geo_t geo = {
.latitude = lat,
.longitude = lon,
};
return geo;
}
void flash_geo_test() {
usart_printf(UART4, "Flash write geo begin\n");
W25Q16_Init();
W25Q16_Erase_Sector(0);
for(uint8_t i = 1; i <= 32; i++) {
geo_t f_wr = {123.34 + i, 23.45 + i};
flash_geo_write(i, f_wr);
geo_t f_rd = flash_geo_read(i);
usart_printf(UART4, "i=%d: lon=%.2f,lat=%.2f\r\n", i, f_rd.longitude, f_rd.latitude);
}
}