YanPenn
10/15/2018 - 3:25 AM

flash

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);
    }
}