Shared I2C1 bus (i2c1.c/h, PB8=SCL PB9=SDA 100kHz): - i2c1_init() called once in main() before sensor probes. - hi2c1 exported globally; baro and mag drivers use it directly. Barometer (bmp280.c): - Probes I2C1 at 0x76 then 0x77 (covers both SDO options). - bmp280_init() returns chip_id (0x58/0x60) on success, neg if absent. - Added bmp280_pressure_to_alt_cm() — ISA barometric formula. - Added bmp280.h (was missing). Magnetometer (mag.c / mag.h): - Auto-detects QMC5883L (0x0D, id=0xFF), HMC5883L (0x1E, id='H43'), IST8310 (0x0E, id=0x10) in that order. - mag_read_heading() returns degrees×10 (0–3599) or -1 if not ready. - HMC5883L: correct XZY byte order applied. - IST8310: single-measurement trigger mode. main.c: - i2c1_init() + bmp280_init() + mag_init() after all other inits. - Both skip gracefully (baro_ok=0, mag_type=MAG_NONE) if not present. - Telemetry JSON: incremental builder appends ",\"hd\":<n>" when mag found and ",\"alt\":<n>" when baro found. No extra bytes when absent. UI (index.html): - HEADING and ALT rows hidden until first packet with that field. - Heading shown in degrees, alt in metres (firmware sends cm). Closes #24. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
27 lines
638 B
C
27 lines
638 B
C
#ifndef MAG_H
|
||
#define MAG_H
|
||
|
||
#include <stdint.h>
|
||
|
||
typedef enum {
|
||
MAG_NONE = 0,
|
||
MAG_QMC5883L, /* I2C 0x0D — most common on external compass modules */
|
||
MAG_HMC5883L, /* I2C 0x1E — legacy Honeywell part */
|
||
MAG_IST8310, /* I2C 0x0E — iSentek part, common on CUAV boards */
|
||
} mag_type_t;
|
||
|
||
/*
|
||
* Auto-detect magnetometer on I2C1.
|
||
* Returns detected type (MAG_NONE if nothing found).
|
||
* Requires i2c1_init() before calling.
|
||
*/
|
||
mag_type_t mag_init(void);
|
||
|
||
/*
|
||
* Read compass heading (degrees × 10, 0–3599).
|
||
* Returns -1 if data not ready or no sensor.
|
||
*/
|
||
int16_t mag_read_heading(void);
|
||
|
||
#endif /* MAG_H */
|