pico-stuff/apps/altimeter/test.c

174 wiersze
4.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "pico/stdio.h"
#include "pico/stdlib.h"
#include <lfs_rp2040.h>
#include <bmp390.h>
static lfs_t lfs;
static struct lfs_config cfg;
uint32_t read_boot_count(bool increment) {
uint32_t boot_count = 0;
lfs_file_t boot_count_file;
lfs_file_open(&lfs, &boot_count_file, "boot_count", LFS_O_RDWR | LFS_O_CREAT);
lfs_file_read(&lfs, &boot_count_file, &boot_count, sizeof(boot_count));
if (increment) {
boot_count += 1;
lfs_file_rewind(&lfs, &boot_count_file);
lfs_file_write(&lfs, &boot_count_file, &boot_count, sizeof(boot_count));
}
lfs_file_close(&lfs, &boot_count_file);
return boot_count;
}
void reset_recordings() {
lfs_format(&lfs, &cfg);
lfs_mount(&lfs, &cfg);
}
void start_altimeter_mode() {
uint32_t boot_count = read_boot_count(true);
printf("Current recoding index: %d\n", boot_count);
char filename[64] = {0};
sprintf(filename, "REC_%03d", boot_count);
printf("Creating recording file: %s\n", filename);
lfs_file_t recording_file;
lfs_file_open(&lfs, &recording_file, filename, LFS_O_RDWR | LFS_O_CREAT);
bmp_t bmp;
bmp.oss = 5;
bmp.i2c.addr = 0x77;
bmp.i2c.inst = i2c1;
bmp.i2c.rate = 400000;
bmp.i2c.scl = 3;
bmp.i2c.sda = 2;
printf("Starting BMP390...\n");
if (!bmp_init(&bmp)) {
return;
}
while(true) {
if (!bmp_get_pressure_temperature(&bmp)) {
continue;
}
printf("---------------------------------------------\n");
printf("Temperature (ºC): %f\n", bmp.temperature);
printf("Pressure (hPa): %f\n", bmp.pressure);
printf("Altitude (m): %f\n", bmp.altitude);
lfs_file_write(&lfs, &recording_file, &bmp.temperature, sizeof(float));
lfs_file_write(&lfs, &recording_file, &bmp.pressure, sizeof(float));
lfs_file_sync(&lfs, &recording_file);
sleep_ms(250);
}
lfs_file_close(&lfs, &recording_file);
}
void dump_recording_file(uint32_t index) {
printf("<======");
char filename[64] = {0};
sprintf(filename, "REC_%03d", index);
lfs_file_t recording_file;
lfs_file_open(&lfs, &recording_file, filename, LFS_O_RDWR);
int32_t file_size = lfs_file_size(&lfs, &recording_file);
uint8_t read_buffer[128];
for (int32_t seek = 0; seek < file_size; seek += sizeof(read_buffer)) {
lfs_file_read(&lfs, &recording_file, read_buffer, sizeof(read_buffer));
for (int32_t i = 0; i < sizeof(read_buffer); i++) {
printf("%02X", read_buffer[i]);
}
}
lfs_file_close(&lfs, &recording_file);
printf("======>\n");
}
int main(void) {
stdio_init_all();
sleep_ms(2500);
printf("Hello from Pi Pico!\n");
printf("Checking hardware capabilities...\n");
lfs_rp2040_init(&cfg);
printf("Mounting filesystem...\n");
if (lfs_mount(&lfs, &cfg)) {
lfs_format(&lfs, &cfg);
lfs_mount(&lfs, &cfg);
}
printf("Filesystem Usage (blocks): %d/%d\n", lfs_fs_size(&lfs), cfg.block_count);
printf("Automatically starting altimeter in 5 seconds...\n");
printf("Press 'X' to enter in CLI mode.\n");
int elapsed = 0;
int iteration_time = 50;
while (getchar_timeout_us(0) != 'X') {
sleep_ms(iteration_time);
elapsed += iteration_time;
if (elapsed >= 5000) {
start_altimeter_mode();
}
}
printf("Available recordings: %d\n", read_boot_count(false));
printf("Commands:\n");
printf(" D - Dump recording file.\n");
printf(" + - Reset recording counter.\n");
uint32_t index;
while(true) {
char cmd = getchar_timeout_us(0);
switch(cmd) {
case 'D':
printf("Type the recording index.\n");
scanf("%d", &index);
if (index > read_boot_count(false)) {
printf("Index out of range.\n");
break;
}
printf("Dumping recording #%d\n", index);
dump_recording_file(index);
break;
case '+':
printf("Reseting recordings...\n");
reset_recordings();
printf("Done! Available recordings: %d\n", read_boot_count(false));
break;
default:
sleep_ms(30);
break;
}
}
lfs_unmount(&lfs);
return 0;
}