From 75853971c49858a2efbce37dbc93b4fca18d708c Mon Sep 17 00:00:00 2001 From: Matt Ricci Date: Wed, 22 Jan 2025 01:14:23 +1100 Subject: [PATCH 1/6] Fix erroneous duplicate of directories by merging SPI/ and spi/ --- Australis-Avionics/Core/Inc/SPI/flash/flash.h | 50 ---- Australis-Avionics/Core/Inc/SPI/lora/lora.h | 122 --------- .../Core/Inc/SPI/sensors/accel/KX134_1211.h | 77 ------ .../Core/Inc/SPI/sensors/baro/BMP581.h | 87 ------- .../Core/Inc/SPI/sensors/gyro/A3G4250D.h | 63 ----- .../Core/Inc/SPI/sensors/sensors.h | 26 -- Australis-Avionics/Core/Inc/SPI/spi.h | 65 ----- Australis-Avionics/Core/Inc/spi/flash/flash.h | 2 +- Australis-Avionics/Core/Inc/spi/lora/lora.h | 3 +- .../Core/Inc/spi/sensors/baro/BMP581.h | 3 + .../Core/Inc/spi/sensors/sensors.h | 2 +- Australis-Avionics/Core/Inc/spi/spi.h | 12 +- Australis-Avionics/Core/Src/SPI/flash/flash.c | 220 ---------------- Australis-Avionics/Core/Src/SPI/lora/lora.c | 246 ------------------ .../Core/Src/SPI/sensors/accel/KX134_1211.c | 205 --------------- .../Core/Src/SPI/sensors/baro/BMP581.c | 224 ---------------- .../Core/Src/SPI/sensors/gyro/A3G4250D.c | 158 ----------- .../Core/Src/SPI/sensors/sensors.c | 69 ----- Australis-Avionics/Core/Src/SPI/spi.c | 96 ------- Australis-Avionics/Core/Src/spi/lora/lora.c | 17 ++ .../Core/Src/spi/sensors/baro/BMP581.c | 18 +- 21 files changed, 42 insertions(+), 1723 deletions(-) delete mode 100755 Australis-Avionics/Core/Inc/SPI/flash/flash.h delete mode 100755 Australis-Avionics/Core/Inc/SPI/lora/lora.h delete mode 100755 Australis-Avionics/Core/Inc/SPI/sensors/accel/KX134_1211.h delete mode 100755 Australis-Avionics/Core/Inc/SPI/sensors/baro/BMP581.h delete mode 100755 Australis-Avionics/Core/Inc/SPI/sensors/gyro/A3G4250D.h delete mode 100755 Australis-Avionics/Core/Inc/SPI/sensors/sensors.h delete mode 100755 Australis-Avionics/Core/Inc/SPI/spi.h delete mode 100755 Australis-Avionics/Core/Src/SPI/flash/flash.c delete mode 100755 Australis-Avionics/Core/Src/SPI/lora/lora.c delete mode 100755 Australis-Avionics/Core/Src/SPI/sensors/accel/KX134_1211.c delete mode 100755 Australis-Avionics/Core/Src/SPI/sensors/baro/BMP581.c delete mode 100755 Australis-Avionics/Core/Src/SPI/sensors/gyro/A3G4250D.c delete mode 100755 Australis-Avionics/Core/Src/SPI/sensors/sensors.c delete mode 100755 Australis-Avionics/Core/Src/SPI/spi.c diff --git a/Australis-Avionics/Core/Inc/SPI/flash/flash.h b/Australis-Avionics/Core/Inc/SPI/flash/flash.h deleted file mode 100755 index 640585c..0000000 --- a/Australis-Avionics/Core/Inc/SPI/flash/flash.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @author Matt Ricci - * @ingroup SPI - * @addtogroup Flash - */ - -#ifndef _FLASH_H -#define _FLASH_H - -#include "stm32f439xx.h" -#include "string.h" - -#include "devices.h" -#include "spi.h" - -#define FLASH_PAGE_PROGRAM 0x02 -#define FLASH_READ_DATA 0x03 -#define FLASH_WRITE_ENABLE 0x06 -#define FLASH_ERASE_CHIP 0x60 -#define FLASH_READ_STATUS_REGISTER_1 0x05 -#define FLASH_READ_STATUS_REGISTER_2 0x35 -#define FLASH_READ_STATUS_REGISTER_3 0x15 - -/** - * @addtogroup Flash - * @{ - */ - -/** @extends SPI */ -typedef struct Flash { - SPI base; //!< Parent SPI interface - int pageSize; - long pageCount; - void (*erase)(struct Flash *); //!< Chip erase method. @see Flash_erase - void (*readPage)(struct Flash *, uint32_t, volatile uint8_t *); //!< Read page method. @see Flash_readPage - void (*writePage)(struct Flash *, uint32_t, uint8_t *); //!< Write page method. @see Flash_writePage -} Flash; - -void configure_SPI4_Flash(); -DeviceHandle_t Flash_init(Flash *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, int, long); -void Flash_readPage(Flash *, uint32_t, volatile uint8_t *); -void Flash_writePage(Flash *, uint32_t, uint8_t *); -void Flash_erase(Flash *); -void _Flash_writeEnable(Flash *); -void _Flash_readStatus1(Flash *, uint8_t *); -void _Flash_readStatus2(Flash *, uint8_t *); -void _Flash_readStatus3(Flash *, uint8_t *); - -/** @} */ -#endif diff --git a/Australis-Avionics/Core/Inc/SPI/lora/lora.h b/Australis-Avionics/Core/Inc/SPI/lora/lora.h deleted file mode 100755 index 9b51fec..0000000 --- a/Australis-Avionics/Core/Inc/SPI/lora/lora.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @author Matt Ricci - * @ingroup SPI - * @addtogroup LoRa - */ - -#ifndef _LORA_H -#define _LORA_H - -#include "stm32f439xx.h" -#include "string.h" - -#include "devices.h" -#include "spi.h" - -#define LORA_REG_FIFO 0x00 -#define LORA_REG_FIFO_ADDR_PTR 0x0D -#define LORA_REG_FIFO_TX_BASE_ADDR 0x0E -#define LORA_REG_FIFO_RX_BASE_ADDR 0x0F -#define LORA_REG_FIFO_RX_CURR_ADDR 0x10 -#define LORA_REG_IRQ_FLAGS_MASK 0x11 -#define LORA_REG_IRQ_FLAGS 0x12 - -#define LORA_REG_OP_MODE 0x01 -#define LORA_REG_OP_MODE_LONG_RANGE_Pos 0x07 -#define LORA_REG_OP_MODE_MODE_Pos 0x00 - -#define LORA_REG_MODEM_CONFIG1 0x1D -#define LORA_REG_MODEM_CONFIG1_BW_Pos 0x06 -#define LORA_REG_MODEM_CONFIG1_CR_Pos 0x03 -#define LORA_REG_MODEM_CONFIG1_CRC_Pos 0x01 - -#define LORA_REG_MODEM_CONFIG2 0x1E -#define LORA_REG_MODEM_CONFIG2_SF_Pos 0x04 - -#define LORA_REG_PAYLOAD_LENGTH 0x22 -#define LORA_REG_MAX_PAYLOAD_LENGTH 0x23 - -#define RegSymbTimeoutLsb 0x1F -#define RegPreambleMsb 0x20 -#define RegPreambleLsb 0x21 -#define RegHopPeriod 0x24 -#define RegFifoRxByteAddr 0x25 -#define RegDioMapping1 0x40 -#define RegDioMapping2 0x41 - -#define LORA_MSG_LENGTH 0x20 -#define LORA_MSG_PAYLOAD_LENGTH (LORA_MSG_LENGTH - 1) - -/** - * @addtogroup LoRa - * @{ - */ - -typedef enum { - BW125, - BW250, - BW500, -} Bandwidth; - -typedef enum { - CR5 = 1, - CR6, - CR7, - CR8, -} CodingRate; - -typedef enum { - SF6 = 6, - SF7, - SF8, - SF9, - SF10, - SF11, - SF12, -} SpreadingFactor; - -typedef enum { - SLEEP, - STDBY, - FSTX, - TX, - FSRX, - RXCONTINUOUS, - RXSINGLE, - CAD -} Mode; - -typedef struct { - uint8_t id; //!< Packet header ID - uint8_t data[LORA_MSG_PAYLOAD_LENGTH]; //!< Packet payload -} LoRa_Packet; - -/** @extends SPI */ -typedef struct LoRa { - SPI base; //!< Parent SPI interface - void (*transmit)(struct LoRa *, uint8_t *); //!< LoRa transmit method. @see LoRa_transmit -} LoRa; - -DeviceHandle_t LoRa_init(LoRa *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, Bandwidth, SpreadingFactor, CodingRate); -void LoRa_transmit(LoRa *, uint8_t *); -void LoRa_writeRegister(LoRa *, uint8_t, uint8_t); -uint8_t LoRa_readRegister(LoRa *, uint8_t); - -LoRa_Packet LoRa_AVData( - uint8_t, - uint8_t, - uint8_t *, - uint8_t *, - uint8_t, - uint8_t *, - uint8_t, - float, - float -); -LoRa_Packet LoRa_GPSData(uint8_t, char *, char *, uint8_t); -LoRa_Packet LoRa_PayloadData(uint8_t, uint8_t, uint8_t *, uint8_t); - -void _LoRa_setMode(LoRa *, Mode); - -/** @} */ -#endif diff --git a/Australis-Avionics/Core/Inc/SPI/sensors/accel/KX134_1211.h b/Australis-Avionics/Core/Inc/SPI/sensors/accel/KX134_1211.h deleted file mode 100755 index 78f319f..0000000 --- a/Australis-Avionics/Core/Inc/SPI/sensors/accel/KX134_1211.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @author Matt Ricci - * @ingroup Sensors - * @addtogroup Accelerometer - * @file KX134_1211.h - */ - -#ifndef _KX134_1211_H -#define _KX134_1211_H - -#include "stm32f439xx.h" -#include "string.h" - -#include "devices.h" -#include "spi.h" - -#define KX134_1211_SENSITIVITY_32G (1.0f / 1024.0f) -#define KX134_1211_SENSITIVITY_16G (1.0f / 2048.0f) -#define KX134_1211_SENSITIVITY(scale) KX134_1211_SENSITIVITY_##scale##G -#define KX134_1211_CNTL1 0x1B -#define KX134_1211_CNTL1_PC1 0x80 -#define KX134_1211_CNTL1_DRDYE 0x20 -#define KX134_1211_CNTL1_RES 0x40 -#define KX134_1211_CNTL1_GSEL_32G 0x10 -#define KX134_1211_CNTL1_GSEL_16G 0x08 -#define KX134_1211_CNTL1_GSEL_8G 0x00 -#define KX134_1211_CNTL1_GSEL(scale) KX134_1211_CNTL1_GSEL_##scale##G -#define KX134_1211_ODCNTL 0x21 -#define KX134_1211_ODCNTL_RESERVED 0x90 -#define KX134_1211_XOUT_L 0x08 -#define KX134_1211_XOUT_H 0x09 -#define KX134_1211_YOUT_L 0x0A -#define KX134_1211_YOUT_H 0x0B -#define KX134_1211_ZOUT_L 0x0C -#define KX134_1211_ZOUT_H 0x0D -#define KX134_1211_INS2 0x17 - -#define KX134_1211_INS2_DRDY 0x10 - - -#define KX134_1211_DATA_SIZE 2 // Two bytes per axis -#define KX134_1211_DATA_COUNT 3 // Three axes - X Y Z -#define KX134_1211_DATA_TOTAL (KX134_1211_DATA_COUNT * KX134_1211_DATA_SIZE) - -/** - * @ingroup Accelerometer - * @defgroup KX134-1211 - * @addtogroup KX134-1211 - * @{ - */ - -/** @extends SPI */ -typedef struct KX134_1211 { - SPI base; //!< Parent SPI interface - float sensitivity; //!< Accelerometer sensitivity - void (*update)(struct KX134_1211 *); //!< Accel update method. @see KX134_1211_update - void (*readAccel)(struct KX134_1211 *, float *); //!< Accel read method. @see KX134_1211_readAccel - void (*readRawBytes)(struct KX134_1211 *, uint8_t *); //!< Raw accel read method. @see KX134_1211_readRawBytes - void (*processRawBytes)(struct KX134_1211 *, uint8_t *, float *); //!< Process raw accel method. @see KX134_1211_processRawBytes - uint8_t axes[KX134_1211_DATA_COUNT]; //!< Array defining axes of mounting - int8_t sign[KX134_1211_DATA_COUNT]; //!< Array defining sign of axes - uint8_t rawAccelData[KX134_1211_DATA_TOTAL]; //!< Raw accelerations array - float accelData[KX134_1211_DATA_COUNT]; //!< Processed accelerations array -} KX134_1211; - -DeviceHandle_t KX134_1211_init(KX134_1211 *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, const uint8_t, const uint8_t *, const int8_t *); -void KX134_1211_update(KX134_1211 *); -void KX134_1211_readAccel(KX134_1211 *, float *); -void KX134_1211_readRawBytes(KX134_1211 *, uint8_t *); -void KX134_1211_processRawBytes(KX134_1211 *, uint8_t *, float *); - -void KX134_1211_readRegisters(KX134_1211 *, uint8_t, uint8_t, uint8_t *); -uint8_t KX134_1211_readRegister(KX134_1211 *, uint8_t); -void KX134_1211_writeRegister(KX134_1211 *, uint8_t, uint8_t); - -/** @} */ -#endif diff --git a/Australis-Avionics/Core/Inc/SPI/sensors/baro/BMP581.h b/Australis-Avionics/Core/Inc/SPI/sensors/baro/BMP581.h deleted file mode 100755 index a48cad0..0000000 --- a/Australis-Avionics/Core/Inc/SPI/sensors/baro/BMP581.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @author Matt Ricci - * @ingroup Sensors - * @addtogroup Barometer - * @file BMP581.h - * @todo Document interface - */ - -#ifndef _BMP581_H -#define _BMP581_H - -#include "stm32f439xx.h" -#include "string.h" - -#include "devices.h" -#include "spi.h" - -#define BMP581_TEMP_SENSITIVITY (1.0f / 65535) -#define BMP581_PRESS_SENSITIVITY (1.0f / 64) -#define BMP581_CHIP_ID 0x01 -#define BMP581_ODR_CFG 0x37 -#define BMP581_ODR_CFG_PWR 0x03 -#define BMP581_ODR_CFG_PWR_STANDBY 0x00 -#define BMP581_ODR_CFG_PWR_CONTINUOUS 0x03 -#define BMP581_ODR_CFG_DEEP_DIS 0x80 -#define BMP581_OSR_CFG_RESERVED 0x80 -#define BMP581_OSR_CFG 0x36 -#define BMP581_OSR_CFG_OSR_P 0x38 -#define BMP581_OSR_CFG_OSR_P_16 0x04 -#define BMP581_OSR_CFG_PRESS_EN 0x40 -#define BMP581_INT_STATUS 0x27 -#define BMP581_STATUS 0x28 -#define BMP581_STATUS_NVM_RDY 0x02 -#define BMP581_STATUS_NVM_ERR 0x04 -#define BMP581_OSR_CFG_PRESS_EN 0x40 -#define BMP581_TEMPERATURE_XLSB 0x1D -#define BMP581_TEMPERATURE_LSB 0x1E -#define BMP581_TEMPERATURE_MSB 0x1F -#define BMP581_PRESSURE_XLSB 0x20 -#define BMP581_PRESSURE_LSB 0x21 -#define BMP581_PRESSURE_MSB 0x22 -#define BMP581_CMD 0x7E - -#define BMP581_DATA_SIZE 3 // Three bytes per reading -#define BMP581_DATA_COUNT 2 // Two readings - temperature, pressure -#define BMP581_DATA_TOTAL (BMP581_DATA_COUNT * BMP581_DATA_SIZE) - -/** - * @ingroup Barometer - * @addtogroup BMP581 - * @{ - */ - -/** @extends SPI */ -typedef struct BMP581 { - SPI base; - float pressSensitivity; - float tempSensitivity; - void (*update)(struct BMP581 *); - void (*readTemp)(struct BMP581 *, float *); - void (*readPress)(struct BMP581 *, float *); - void (*readRawTemp)(struct BMP581 *, uint8_t *); - void (*readRawPress)(struct BMP581 *, uint8_t *); - void (*processRawTemp)(struct BMP581 *, uint8_t *, float *); - void (*processRawPress)(struct BMP581 *, uint8_t *, float *); - uint8_t rawTemp[BMP581_DATA_SIZE]; - uint8_t rawPress[BMP581_DATA_SIZE]; - float temp; - float press; - float groundPress; -} BMP581; - -DeviceHandle_t BMP581_init(BMP581 *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, const float, const float); -void BMP581_update(BMP581 *); -void BMP581_readTemp(BMP581 *, float *); -void BMP581_readPress(BMP581 *, float *); -void BMP581_readRawTemp(BMP581 *, uint8_t *); -void BMP581_readRawPress(BMP581 *, uint8_t *); -void BMP581_processRawTemp(BMP581 *, uint8_t *, float *); -void BMP581_processRawPress(BMP581 *, uint8_t *, float *); - -uint8_t BMP581_readRegister(BMP581 *, uint8_t); -void BMP581_readRegisters(BMP581 *, uint8_t , uint8_t , uint8_t *); -void BMP581_writeRegister(BMP581 *, uint8_t, uint8_t); - -/** @} */ -#endif diff --git a/Australis-Avionics/Core/Inc/SPI/sensors/gyro/A3G4250D.h b/Australis-Avionics/Core/Inc/SPI/sensors/gyro/A3G4250D.h deleted file mode 100755 index cd0dc24..0000000 --- a/Australis-Avionics/Core/Inc/SPI/sensors/gyro/A3G4250D.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @author Matt Ricci - * @ingroup Sensors - * @addtogroup Gyroscope - * @file A3G4250D.h - */ - -#ifndef _A3G4250D_H -#define _A3G4250D_H - -#include "stm32f439xx.h" -#include "string.h" - -#include "devices.h" -#include "spi.h" - -#define A3G4250D_SENSITIVITY (0.00875f) -#define A3G4250D_CTRL_REG1 0x20 -#define A3G4250D_CTRL_REG1_ODR_800Hz 0xC0 -#define A3G4250D_CTRL_REG1_PD_ENABLE 0x08 -#define A3G4250D_CTRL_REG1_AXIS_ENABLE 0x07 -#define A3G4250D_OUT_X_L 0x28 -#define A3G4250D_OUT_X_H 0x29 -#define A3G4250D_OUT_Y_L 0x2A -#define A3G4250D_OUT_Y_H 0x2B -#define A3G4250D_OUT_Z_L 0x2C -#define A3G4250D_OUT_Z_H 0x2D - -#define A3G4250D_DATA_SIZE 2 // Two bytes per axis -#define A3G4250D_DATA_COUNT 3 // Three axes - X Y Z -#define A3G4250D_DATA_TOTAL (A3G4250D_DATA_COUNT * A3G4250D_DATA_SIZE) - -/** - * @ingroup Gyroscope - * @addtogroup A3G4250D - * @{ - */ - -/** @extends SPI */ -typedef struct A3G4250D { - SPI base; //!< Parent SPI interface - float sensitivity; //!< Gyroscope sensitivity - void (*update)(struct A3G4250D *); //!< Gyro update method. @see A3G4250D_update - void (*readGyro)(struct A3G4250D *, float *); //!< Gyro read method. @see A3G4250D_readGyro - void (*readRawBytes)(struct A3G4250D *, uint8_t *); //!< Raw gyro read method. @see A3G4250D_readRawBytes - void (*processRawBytes)(struct A3G4250D *, uint8_t *, float *); //!< Process raw gyro method. @see A3G4250D_processRawBytes - uint8_t axes[A3G4250D_DATA_COUNT]; //!< Array defining axes of mounting - int8_t sign[A3G4250D_DATA_COUNT]; //!< Array defining sign of axes - uint8_t rawGyroData[A3G4250D_DATA_TOTAL]; //!< Raw gyro rates array - float gyroData[A3G4250D_DATA_COUNT]; //!< Processed gyro rates array -} A3G4250D; - -DeviceHandle_t A3G4250D_init(A3G4250D *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, const float, const uint8_t *, const int8_t *); -void A3G4250D_update(A3G4250D *); -void A3G4250D_readGyro(A3G4250D *, float *); -void A3G4250D_readRawBytes(A3G4250D *, uint8_t *); -void A3G4250D_processRawBytes(A3G4250D *, uint8_t *, float *); - -uint8_t A3G4250D_readRegister(A3G4250D *, uint8_t); -void A3G4250D_writeRegister(A3G4250D *, uint8_t, uint8_t); - -/** @} */ -#endif diff --git a/Australis-Avionics/Core/Inc/SPI/sensors/sensors.h b/Australis-Avionics/Core/Inc/SPI/sensors/sensors.h deleted file mode 100755 index 325c31b..0000000 --- a/Australis-Avionics/Core/Inc/SPI/sensors/sensors.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @author Matt Ricci - * @ingroup SPI - * @addtogroup Sensors - */ - -#ifndef _SENSORS_H -#define _SENSORS_H - -#include "stdarg.h" -#include "stm32f439xx.h" - -#define XINDEX 0 -#define YINDEX 1 -#define ZINDEX 2 - -#define ROLL_INDEX 0 -#define PITCH_INDEX 1 -#define YAW_INDEX 2 - -#define ACCEL_SCALE_HIGH 32 -#define ACCEL_SCALE_LOW 16 - -void configure_SPI1_Sensor_Suite(); - -#endif diff --git a/Australis-Avionics/Core/Inc/SPI/spi.h b/Australis-Avionics/Core/Inc/SPI/spi.h deleted file mode 100755 index 49828d6..0000000 --- a/Australis-Avionics/Core/Inc/SPI/spi.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @author Matt Ricci - * @addtogroup API API Reference - * @{ - * @addtogroup SPI - * @} - */ - - -#ifndef _SPI_H -#define _SPI_H - -#include "stm32f439xx.h" -#include - -/** - * @ingroup SPI - * @addtogroup SPI_Interface Interface - * @brief SPI interface from which slave devices inherit. - * @todo Add in code block examples to API documentation. - * @{ - */ - -/** - * @brief Device type enum - * Describes the type of peripheral implementing an SPI interface. - */ -typedef enum { - SENSOR_ACCEL, //!< Accelerometer. - SENSOR_GYRO, //!< Gyroscope. - SENSOR_BARO, //!< Barometer. - MEMORY_FLASH, //!< Flash memory. - COMM_LORA //!< LoRa module -} DeviceType; - -/** - * @brief Data format enum - * Describes the format of dataframes sent on the SPI data bus. - */ -typedef enum { - MODE8, - MODE16 -} DataFormat; - -/** - * @brief Struct definition for \ref SPI "SPI interface". - * Provides the interface for API consumers to interact with the SPI peripheral. - */ -typedef struct SPI { - DeviceType device; //!< Enum specifier for device type. - SPI_TypeDef *interface; //!< Pointer to SPI interface struct. - GPIO_TypeDef *port; //!< Pointer to GPIO port struct. - unsigned long cs; //!< Device chip select address. - void (*send)(struct SPI *, uint16_t); //!< SPI send method. @see SPI_send - void (*receive)(struct SPI *, volatile uint16_t *); //!< SPI receive method. @see SPI_receive - uint16_t (*transmit)(struct SPI *, uint16_t); //!< SPI transmit method. @see SPI_transmit -} SPI; - -void SPI_init(SPI *, DeviceType, SPI_TypeDef *, DataFormat, GPIO_TypeDef *, unsigned long); -void SPI_send(SPI *, uint16_t); -void SPI_receive(SPI *, volatile uint16_t *); -uint16_t SPI_transmit(SPI *, uint16_t); - -/** @} */ -#endif diff --git a/Australis-Avionics/Core/Inc/spi/flash/flash.h b/Australis-Avionics/Core/Inc/spi/flash/flash.h index 03adecb..640585c 100755 --- a/Australis-Avionics/Core/Inc/spi/flash/flash.h +++ b/Australis-Avionics/Core/Inc/spi/flash/flash.h @@ -1,6 +1,6 @@ /** * @author Matt Ricci - * @ingroup SPI_API + * @ingroup SPI * @addtogroup Flash */ diff --git a/Australis-Avionics/Core/Inc/spi/lora/lora.h b/Australis-Avionics/Core/Inc/spi/lora/lora.h index 1df860e..9b51fec 100755 --- a/Australis-Avionics/Core/Inc/spi/lora/lora.h +++ b/Australis-Avionics/Core/Inc/spi/lora/lora.h @@ -1,6 +1,6 @@ /** * @author Matt Ricci - * @ingroup SPI_API + * @ingroup SPI * @addtogroup LoRa */ @@ -114,6 +114,7 @@ LoRa_Packet LoRa_AVData( float ); LoRa_Packet LoRa_GPSData(uint8_t, char *, char *, uint8_t); +LoRa_Packet LoRa_PayloadData(uint8_t, uint8_t, uint8_t *, uint8_t); void _LoRa_setMode(LoRa *, Mode); diff --git a/Australis-Avionics/Core/Inc/spi/sensors/baro/BMP581.h b/Australis-Avionics/Core/Inc/spi/sensors/baro/BMP581.h index ef3bca6..a48cad0 100755 --- a/Australis-Avionics/Core/Inc/spi/sensors/baro/BMP581.h +++ b/Australis-Avionics/Core/Inc/spi/sensors/baro/BMP581.h @@ -25,6 +25,9 @@ #define BMP581_ODR_CFG_DEEP_DIS 0x80 #define BMP581_OSR_CFG_RESERVED 0x80 #define BMP581_OSR_CFG 0x36 +#define BMP581_OSR_CFG_OSR_P 0x38 +#define BMP581_OSR_CFG_OSR_P_16 0x04 +#define BMP581_OSR_CFG_PRESS_EN 0x40 #define BMP581_INT_STATUS 0x27 #define BMP581_STATUS 0x28 #define BMP581_STATUS_NVM_RDY 0x02 diff --git a/Australis-Avionics/Core/Inc/spi/sensors/sensors.h b/Australis-Avionics/Core/Inc/spi/sensors/sensors.h index a2009f1..325c31b 100755 --- a/Australis-Avionics/Core/Inc/spi/sensors/sensors.h +++ b/Australis-Avionics/Core/Inc/spi/sensors/sensors.h @@ -1,6 +1,6 @@ /** * @author Matt Ricci - * @ingroup SPI_API + * @ingroup SPI * @addtogroup Sensors */ diff --git a/Australis-Avionics/Core/Inc/spi/spi.h b/Australis-Avionics/Core/Inc/spi/spi.h index 1c7078b..49828d6 100755 --- a/Australis-Avionics/Core/Inc/spi/spi.h +++ b/Australis-Avionics/Core/Inc/spi/spi.h @@ -1,8 +1,12 @@ /** * @author Matt Ricci - * @defgroup SPI_API SPI + * @addtogroup API API Reference + * @{ + * @addtogroup SPI + * @} */ - + + #ifndef _SPI_H #define _SPI_H @@ -10,8 +14,8 @@ #include /** - * @ingroup SPI_API - * @addtogroup SPI Interface + * @ingroup SPI + * @addtogroup SPI_Interface Interface * @brief SPI interface from which slave devices inherit. * @todo Add in code block examples to API documentation. * @{ diff --git a/Australis-Avionics/Core/Src/SPI/flash/flash.c b/Australis-Avionics/Core/Src/SPI/flash/flash.c deleted file mode 100755 index 3f047ed..0000000 --- a/Australis-Avionics/Core/Src/SPI/flash/flash.c +++ /dev/null @@ -1,220 +0,0 @@ -/*********************************************************************************** - * @file flash.c * - * @author Matt Ricci * - * @addtogroup Flash * - * @brief Brief description of the file's purpose. * - * * - * @{ * - ***********************************************************************************/ - -#include "flash.h" - -/* SPI4 FLASH - * --------------------------------------------- - * Flash Pin | MCU GPIO Pin | SIGNAL TYPE - * ----------------|---------------|------------ - * SDI | PE14 | DATA - * SDO | PE13 | DATA - * SCLK | PE12 | DATA - * CS | PE11 | CONTROL - * Memory Hold | PE10 | CONTROL - * Write Protect | PE9 | CONTROL */ - -/* =============================================================================== */ -/** - * @brief Initialise flash struct. - * - * @param *flash Pointer to Flash struct. - * @param *port Pointer to GPIO port. - * @param cs Address to flash chip select. - * @return @c NULL. - ** - * =============================================================================== */ -DeviceHandle_t Flash_init( - Flash *flash, - char name[DEVICE_NAME_LENGTH], - GPIO_TypeDef *port, - unsigned long cs, - int pageSize, - long pageCount -) { - SPI_init(&flash->base, MEMORY_FLASH, SPI4, MODE16, port, cs); - flash->pageSize = pageSize; - flash->pageCount = pageCount; - flash->erase = Flash_erase; - flash->readPage = Flash_readPage; - flash->writePage = Flash_writePage; - - DeviceHandle_t handle; - strcpy(handle.name, name); - handle.device = flash; - return handle; -} - -/********************************* PRIVATE METHODS *********************************/ - -#ifndef DOXYGEN_PRIVATE - -/* =============================================================================== */ -/** - * @brief Send Write Enable instruction to the flash device. - * - * @param *flash Pointer to Flash struct. - * @return @c NULL. - ** - * =============================================================================== */ -void _Flash_writeEnable(Flash *flash) { - SPI spi = flash->base; - - spi.port->ODR &= ~spi.cs; - spi.transmit(&spi, FLASH_WRITE_ENABLE); - spi.port->ODR |= spi.cs; -} - -/* =============================================================================== */ -/** - * @brief Read from Status Register 1. - * - * @param *flash Pointer to Flash struct. - * @param *status Pointer to status output variable. - * @return @c NULL. - ** - * =============================================================================== */ -void _Flash_readStatus1(Flash *flash, uint8_t *status) { - SPI spi = flash->base; - - spi.port->ODR &= ~spi.cs; - *status = spi.transmit(&spi, FLASH_READ_STATUS_REGISTER_1); - *status = spi.transmit(&spi, 0x0F); - spi.port->ODR |= spi.cs; -} - -/* =============================================================================== */ -/** - * @brief Read from Status Register 2. - * - * @param *flash Pointer to Flash struct. - * @param *status Pointer to status output variable. - * @return @c NULL. - ** - * =============================================================================== */ -void _Flash_readStatus2(Flash *flash, uint8_t *status) { - SPI spi = flash->base; - - spi.port->ODR &= ~spi.cs; - *status = spi.transmit(&spi, FLASH_READ_STATUS_REGISTER_2); - *status = spi.transmit(&spi, 0x0F); - spi.port->ODR |= spi.cs; -} - -/* =============================================================================== */ -/** - * @brief Read from Status Register 3. - * - * @param *flash Pointer to Flash struct. - * @param *status Pointer to status output variable. - * @return @c NULL. - ** - * =============================================================================== */ -void _Flash_readStatus3(Flash *flash, uint8_t *status) { - SPI spi = flash->base; - - spi.port->ODR &= ~spi.cs; - *status = spi.transmit(&spi, FLASH_READ_STATUS_REGISTER_3); - *status = spi.transmit(&spi, 0x0F); - spi.port->ODR |= spi.cs; -} - -#endif - -/********************************* DEVICE METHODS **********************************/ - -/* =============================================================================== */ -/** - * @brief Erase flash chip. - * - * @param *flash Pointer to Flash struct. - * @return @c NULL. - ** - * =============================================================================== */ -void Flash_erase(Flash *flash) { - _Flash_writeEnable(flash); - SPI spi = flash->base; - uint8_t status = 0; - - // Send Erase Chip instruction - spi.port->ODR &= ~spi.cs; - spi.transmit(&spi, FLASH_ERASE_CHIP); - spi.port->ODR |= spi.cs; - - // Wait until chip BUSY is clear - do { - _Flash_readStatus1(flash, &status); - } while (status & 0x01); -} - -/* =============================================================================== */ -/** - * @brief Write page to flash. - * - * @param *flash Pointer to Flash struct. - * @param address Address in memory to write to. - * @param *data Pointer to start of page buffer to write. - * @return @c NULL. - ** - * =============================================================================== */ -void Flash_writePage(Flash *flash, uint32_t address, uint8_t *data) { - _Flash_writeEnable(flash); - uint8_t status = 0; - SPI spi = flash->base; - - spi.port->ODR &= ~spi.cs; - - // Send Page Program instruction and 24-bit address - spi.transmit(&spi, FLASH_PAGE_PROGRAM); - spi.transmit(&spi, (address & 0xFF0000) >> 16); - spi.transmit(&spi, (address & 0xFF00) >> 8); - spi.transmit(&spi, (address & 0xFF)); - - // Send page data - for (int i = 0; i < 256; i++) { - spi.transmit(&spi, data[i]); - } - - spi.port->ODR |= spi.cs; - - // Wait until chip BUSY is clear - do { - _Flash_readStatus1(flash, &status); - } while (status & 0x1); -} - -/* =============================================================================== */ -/** - * @brief Read from flash. - * - * @param *flash Pointer to Flash struct. - * @param address Address in memory to write to. - * @param *data Pointer to start of page buffer to read to. - * @return @c NULL. - ** - * =============================================================================== */ -void Flash_readPage(Flash *flash, uint32_t address, volatile uint8_t *data) { - SPI spi = flash->base; - - spi.port->ODR &= ~spi.cs; - - // Send Read Data instruction and 24-bit address - spi.transmit(&spi, FLASH_READ_DATA); - spi.transmit(&spi, (address & 0xFF0000) >> 16); - spi.transmit(&spi, (address & 0xFF00) >> 8); - spi.transmit(&spi, (address & 0xFF)); - - for (int i = 0; i < 256; i++) { - data[i] = spi.transmit(&spi, 0x0F); - } - - spi.port->ODR |= spi.cs; -} - -/** @} */ diff --git a/Australis-Avionics/Core/Src/SPI/lora/lora.c b/Australis-Avionics/Core/Src/SPI/lora/lora.c deleted file mode 100755 index b76f41a..0000000 --- a/Australis-Avionics/Core/Src/SPI/lora/lora.c +++ /dev/null @@ -1,246 +0,0 @@ -/*********************************************************************************** - * @file lora.c * - * @author Matt Ricci * - * @addtogroup LoRa * - * @brief Brief description of the file's purpose. * - * * - * @todo Implement adjustable packet size * - * @{ * - ***********************************************************************************/ - -#include "lora.h" - -/* SPI3 LORA - * ------------------------------------ - * Flash Pin | MCU GPIO Pin | SIGNAL TYPE - * -----------|---------------|------------ - * SDI | PC12 | DATA - * SDO | PC11 | DATA - * SCLK | PC10 | DATA - * RST | PD7 | CONTROL - * DI0 | PD1 | DATA - * CS | PD0 | CONTROL */ - -/* =============================================================================== */ -/** - * @brief Initializes the LoRa module with specified configuration parameters. - * - * @param *lora Pointer to LoRa struct to be initialised. - * @param *port Pointer to GPIO port struct. - * @param cs Device chip select address. - * @param bw Bandwidth setting for the LoRa module. - * @param sf Spreading factor for the LoRa module. - * @param cr Coding rate for the LoRa module. - * @return @c NULL. - ** - * =============================================================================== */ -DeviceHandle_t LoRa_init( - LoRa *lora, - char name[DEVICE_NAME_LENGTH], - GPIO_TypeDef *port, - unsigned long cs, - Bandwidth bw, - SpreadingFactor sf, - CodingRate cr -) { - SPI_init(&lora->base, COMM_LORA, SPI3, MODE16, port, cs); - lora->transmit = LoRa_transmit; - - _LoRa_setMode(lora, SLEEP); // Set mode to sleep - - // Set interrupt pin - LoRa_writeRegister(lora, RegDioMapping1, 0x40); - - /* clang-format off */ - LoRa_writeRegister(lora, LORA_REG_OP_MODE, - 0x01 << LORA_REG_OP_MODE_LONG_RANGE_Pos // Enable LoRa - ); - - LoRa_writeRegister(lora, LORA_REG_MODEM_CONFIG1, - bw << LORA_REG_MODEM_CONFIG1_BW_Pos // Set bandwidth - | cr << LORA_REG_MODEM_CONFIG1_CR_Pos // Set coding rate - | 0x00 << LORA_REG_MODEM_CONFIG1_CRC_Pos // Enable CRC - ); - /* clang-format on */ - - /** @todo set spreading factor */ - LoRa_writeRegister(lora, LORA_REG_MODEM_CONFIG2, 0x94); - - // Set payload length - LoRa_writeRegister(lora, LORA_REG_PAYLOAD_LENGTH, LORA_MSG_LENGTH); - LoRa_writeRegister(lora, LORA_REG_MAX_PAYLOAD_LENGTH, LORA_MSG_LENGTH); - - _LoRa_setMode(lora, STDBY); // Set mode to standby - - DeviceHandle_t handle; - strcpy(handle.name, name); - handle.device = lora; - return handle; -} - -/********************************** PRIVATE METHODS ********************************/ - -#ifndef DOXYGEN_PRIVATE - -/* =============================================================================== */ -/** - * @brief Sets the operational mode of the LoRa module. - * - * @param *lora Pointer to LoRa struct. - * @param mode Desired operational mode to be set. - * @return @c NULL. - ** - * =============================================================================== */ -void _LoRa_setMode(LoRa *lora, Mode mode) { - uint8_t regOpMode = LoRa_readRegister(lora, LORA_REG_OP_MODE); - regOpMode &= ~0x07; // Mask to mode bits - regOpMode |= mode; // Set mode - LoRa_writeRegister(lora, LORA_REG_OP_MODE, regOpMode); -} - -#endif - -/********************************** STATIC METHODS *********************************/ - -/* =============================================================================== */ -/** - * @brief Constructs a LoRa packet with accelerometer and gyroscope data, altitude, - * and velocity for transmission. - * - * @param id Identifier for the packet. - * @param currentState Current state to be included in the packet. - * @param *lAccelData Pointer to low byte accelerometer data. - * @param *hAccelData Pointer to high byte accelerometer data. - * @param lenAccel Length of the accelerometer data. - * @param *gyroData Pointer to gyroscope data. - * @param lenGyro Length of the gyroscope data. - * @param altitude Altitude value to be included in the packet. - * @param velocity Velocity value to be included in the packet. - * @return Constructed LoRa packet containing the provided data. - ** - * =============================================================================== */ -LoRa_Packet LoRa_AVData( - uint8_t id, - uint8_t currentState, - uint8_t *lAccelData, - uint8_t *hAccelData, - uint8_t lenAccel, - uint8_t *gyroData, - uint8_t lenGyro, - float altitude, - float velocity -) { - LoRa_Packet msg; - - // Convert altitude float to byte array - union { - float f; - uint8_t b[4]; - } a; - a.f = altitude; - - // Convert velocity float to byte array - union { - float f; - uint8_t b[4]; - } v; - v.f = velocity; - - int idx = 0; - // Append to struct data array - msg.id = id; - msg.data[idx++] = currentState; - memcpy(&msg.data[idx], lAccelData, lenAccel); - memcpy(&msg.data[idx += lenAccel], hAccelData, lenAccel); - memcpy(&msg.data[idx += lenAccel], gyroData, lenGyro); - memcpy(&msg.data[idx += lenGyro], a.b, sizeof(float)); - memcpy(&msg.data[idx += sizeof(float)], v.b, sizeof(float)); - - return msg; -} - -LoRa_Packet LoRa_GPSData( - uint8_t id, - char *latitude, - char *longitude, - uint8_t flags -) { - LoRa_Packet msg; - - int idx = 0; - // Append to struct data array - msg.id = id; - memcpy(&msg.data[idx], latitude, 15); //!< @todo Move magic number to definition/parameter - memcpy(&msg.data[idx += 15], longitude, 15); - msg.data[idx += 15] = flags; - - return msg; -} - -LoRa_Packet LoRa_PayloadData( - uint8_t id, - uint8_t state, - uint8_t *accelData, - uint8_t lenAccelData -) { - LoRa_Packet msg; - - int idx = 0; - // Append to struct data array - msg.id = id; - msg.data[idx++] = state; - memcpy(&msg.data[idx+lenAccelData], accelData, lenAccelData); - - return msg; -} - -/********************************** DEVICE METHODS *********************************/ - -/* =============================================================================== */ -/** - * @brief Transmits data using the LoRa module. - * - * @param lora Pointer to LoRa struct. - * @param pointerdata Pointer to the data to be transmitted. - ** - * =============================================================================== */ -void LoRa_transmit(LoRa *lora, uint8_t *pointerdata) { - LoRa_writeRegister(lora, LORA_REG_IRQ_FLAGS, 0x08); // clears the status flags - LoRa_writeRegister(lora, LORA_REG_FIFO_ADDR_PTR, 0x80); // set pointer adddress to TX - - // Load data into transmit FIFO - for (int i = 0; i < 32; i++) { - LoRa_writeRegister(lora, LORA_REG_FIFO, pointerdata[i]); - } - - // Set device to transmit - _LoRa_setMode(lora, TX); - - // Clear the status flags - LoRa_writeRegister(lora, LORA_REG_IRQ_FLAGS, 0x08); -} - -/******************************** INTERFACE METHODS ********************************/ - -void LoRa_writeRegister(LoRa *lora, uint8_t address, uint8_t data) { - SPI spi = lora->base; - - uint16_t payload = (address << 0x08) | (1 << 0x0F); // Load payload with address and write command - payload |= data; // Append data to payload - spi.port->ODR &= ~spi.cs; // Lower chip select - spi.transmit(&spi, payload); // Send payload over SPI - spi.port->ODR |= spi.cs; // Raise chip select -} - -uint8_t LoRa_readRegister(LoRa *lora, uint8_t address) { - SPI spi = lora->base; - uint16_t response; - - uint16_t payload = (address << 0x08); // Load payload with address and read command - spi.port->ODR &= ~spi.cs; // Lower chip select - response = spi.transmit(&spi, payload); // Receive payload over SPI - spi.port->ODR |= spi.cs; // Raise chip select - return (uint8_t)response; -} - - /** @} */ diff --git a/Australis-Avionics/Core/Src/SPI/sensors/accel/KX134_1211.c b/Australis-Avionics/Core/Src/SPI/sensors/accel/KX134_1211.c deleted file mode 100755 index 89ee8b1..0000000 --- a/Australis-Avionics/Core/Src/SPI/sensors/accel/KX134_1211.c +++ /dev/null @@ -1,205 +0,0 @@ -/*********************************************************************************** - * @file KX134_1211.c * - * @author Matt Ricci * - * @addtogroup KX134_1211 * - * * - * @todo Move private interface methods (read/write register) to static functions * - * with internal prototypes. * - * @{ * - ***********************************************************************************/ - -#include "KX134_1211.h" - -/* =============================================================================== */ -/** - * @brief Initialiser for a KX134-1211 accelerometer. - * - * @param *accel Pointer to KX134-1211 struct to be initialised. - * @param *port Pointer to GPIO port struct. - * @param cs Device chip select address. - * @param scale Selected scale for read accelerations. - * @param *axes Array defining sensor mounting axes. - * @return @c NULL. - ** - * =============================================================================== */ -DeviceHandle_t KX134_1211_init( - KX134_1211 *accel, - char name[DEVICE_NAME_LENGTH], - GPIO_TypeDef *port, - unsigned long cs, - uint8_t scale, - const uint8_t *axes, - const int8_t *sign -) { - SPI_init(&accel->base, SENSOR_ACCEL, SPI1, MODE8, port, cs); - accel->update = KX134_1211_update; - accel->readAccel = KX134_1211_readAccel; - accel->readRawBytes = KX134_1211_readRawBytes; - accel->processRawBytes = KX134_1211_processRawBytes; - memcpy(accel->axes, axes, KX134_1211_DATA_COUNT); - memcpy(accel->sign, sign, KX134_1211_DATA_COUNT); - - // Set value of GSEL and sensitivity based on selected scale - uint8_t GSEL = 0x00; - if (scale == 32) { - GSEL = KX134_1211_CNTL1_GSEL(32); - accel->sensitivity = KX134_1211_SENSITIVITY(32); - } else if (scale == 16) { - GSEL = KX134_1211_CNTL1_GSEL(16); - accel->sensitivity = KX134_1211_SENSITIVITY(16); - } - - // Perform powerup procedure as per datasheet - KX134_1211_writeRegister(accel, 0x7F, 0x00); - KX134_1211_writeRegister(accel, 0x1C, 0x00); - KX134_1211_writeRegister(accel, 0x1C, 0x80); - - const uint32_t superDelay = 0xFFFF; - volatile uint8_t counter = 0; - - // Wait for the spefified period - need to wait for 2ms here. - for (uint32_t i = 0; i < superDelay; i++) { - counter++; - } - - uint8_t chipID = KX134_1211_readRegister(accel, 0x13); - uint8_t cotr = KX134_1211_readRegister(accel, 0x12); - - // Configure accelerometer registers - KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_RES | GSEL); // Accel select, selected sensitivity - uint8_t ODCNTL = KX134_1211_readRegister(accel, KX134_1211_ODCNTL); // Read from register for reserve mask - KX134_1211_writeRegister(accel, KX134_1211_ODCNTL, (KX134_1211_ODCNTL_RESERVED & ODCNTL) | 0x2A); // No filter, fast startup, 800Hz - KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_PC1 | KX134_1211_CNTL1_RES | GSEL); // Enable PC1 - - DeviceHandle_t handle; - strcpy(handle.name, name); - handle.device = accel; - return handle; -} - -/********************************** DEVICE METHODS *********************************/ - -/* =============================================================================== */ -/** - * @brief Read 3-axis floating point accelerations. - * - * @param *accel Pointer to accel struct. - * @param *out Floating point acceleration array. - * @returns @c NULL. - ** - * =============================================================================== */ -void KX134_1211_readAccel(KX134_1211 *accel, float *out) { - accel->update(accel); - out = accel->accelData; -} - -/* =============================================================================== */ -/** - * @brief Updates internally stored acceleration readings. - * - * @param *accel Pointer to accel struct. - * @returns @c NULL. - ** - * =============================================================================== */ -void KX134_1211_update(KX134_1211 *accel) { - accel->readRawBytes(accel, accel->rawAccelData); - accel->processRawBytes(accel, accel->rawAccelData, accel->accelData); -} - -/* =============================================================================== */ -/** - * @brief Process raw 3-axis data to floating point accelerations. - * - * @param *accel Pointer to accel struct. - * @param *bytes Raw 3-axis data array. - * @param *out Processed 3-axis data array to write. - * @returns @c NULL. - ** - * =============================================================================== */ -void KX134_1211_processRawBytes(KX134_1211 *accel, uint8_t *bytes, float *out) { - out[0] = accel->sign[0] * accel->sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]); // Accel X - out[1] = accel->sign[1] * accel->sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]); // Accel Y - out[2] = accel->sign[2] * accel->sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]); // Accel Z -} - -/* =============================================================================== */ -/** - * @brief Read raw 3-axis data. - * - * @param *accel Pointer to accel struct. - * @param *out Raw 3-axis data array to write. - * @returns @c NULL. - ** - * =============================================================================== */ -void KX134_1211_readRawBytes(KX134_1211 *accel, uint8_t *out) { -// Map raw indices to mounting axis -#define INDEX_AXES(index, byte) 2 * accel->axes[index] + byte - uint8_t tmp[KX134_1211_DATA_TOTAL]; - KX134_1211_readRegisters(accel, KX134_1211_XOUT_L, KX134_1211_DATA_TOTAL, tmp); - out[INDEX_AXES(0, 1)] = tmp[0]; // Accel X high - out[INDEX_AXES(0, 0)] = tmp[1]; // Accel X low - out[INDEX_AXES(1, 1)] = tmp[2]; // Accel Y high - out[INDEX_AXES(1, 0)] = tmp[3]; // Accel Y low - out[INDEX_AXES(2, 1)] = tmp[4]; // Accel Z high - out[INDEX_AXES(2, 0)] = tmp[5]; // Accel Z low -#undef INDEX_AXES -} - -/******************************** INTERFACE METHODS ********************************/ - -void KX134_1211_writeRegister(KX134_1211 *accel, uint8_t address, uint8_t data) { - SPI spi = accel->base; - - spi.port->ODR &= ~spi.cs; - - while((spi.interface->SR & SPI_SR_TXE) == 0); - spi.interface->DR = (address & 0x7F); // Send out the device address - while((spi.interface->SR & SPI_SR_RXNE) == 0); // Wait for the recieve to become available. - uint8_t response = spi.interface->DR; // Read the dummy response. - while((spi.interface->SR & SPI_SR_TXE) == 0); // Wait for the SPI bus to become ready. - spi.interface->DR = data; // Send out the device address - while((spi.interface->SR & SPI_SR_RXNE) == 0); // Wait for the recieve to become available. - response = spi.interface->DR; // Read the dummy response. - while((spi.interface->SR & SPI_SR_BSY) == SPI_SR_BSY); // Wait for the peripheral to finsh. - - spi.port->ODR |= spi.cs; -} - -uint8_t KX134_1211_readRegister(KX134_1211 *accel, uint8_t address) { - uint8_t response = 0; - SPI spi = accel->base; - - spi.port->ODR &= ~spi.cs; - - // Send read command and address - uint8_t payload = address | 0x80; // Load payload with address and read command - response = spi.transmit(&spi, payload); // Transmit payload - response = spi.transmit(&spi, 0xFF); // Transmit dummy data and read response data - - spi.port->ODR |= spi.cs; - - return response; -} - -void KX134_1211_readRegisters(KX134_1211 *accel, uint8_t address, uint8_t count, uint8_t *out) { - SPI spi = accel->base; - - spi.port->ODR &= ~spi.cs; // Manually drop the chip select. - - while((spi.interface->SR & SPI_SR_TXE) == 0); // Wait for the SPI bus to become ready. - spi.interface->DR = (address | 0x80); // Send out the device address - while((spi.interface->SR & SPI_SR_RXNE) == 0); // Wait for the recieve to become available. - uint8_t response = spi.interface->DR; // Read the dummy response. - - for (int i = 0; i < count; i++) { - while((spi.interface->SR & SPI_SR_TXE) == 0); // Wait for the SPI bus to become ready. - spi.interface->DR = 0xFF; // Send out the dummy data - while((spi.interface->SR & SPI_SR_RXNE) == 0); // Wait for the recieve to become available. - out[i] = spi.interface->DR; // Read the dummy response. - } - - while((spi.interface->SR & SPI_SR_BSY) == SPI_SR_BSY); // Wait for the peripheral to finsh. - spi.port->ODR |= spi.cs; // Raise chip select -} - -/** @} */ diff --git a/Australis-Avionics/Core/Src/SPI/sensors/baro/BMP581.c b/Australis-Avionics/Core/Src/SPI/sensors/baro/BMP581.c deleted file mode 100755 index ea3c49b..0000000 --- a/Australis-Avionics/Core/Src/SPI/sensors/baro/BMP581.c +++ /dev/null @@ -1,224 +0,0 @@ -/*********************************************************************************** - * @file BMP581.c * - * @author Matt Ricci * - * @addtogroup BMP581 * - * * - * @todo Add altitude calculation method * - * @todo Document implementation * - * @todo Move private interface methods (read/write register) to static functions * - * with internal prototypes. * - * @todo Replace giga loops with hardware timer * - * @{ * - ***********************************************************************************/ - -#include "BMP581.h" - -/* =============================================================================== */ -/** - * @brief Initialiser for a BMP581 barometer. - * @param *baro Pointer to BMP581 struct to be initialised. - * @param *port Pointer to GPIO port struct. - * @param cs Device chip select address. - * @param tempSensitivity Barometer temperature sensitivity. - * @param pressSensitivity Barometer pressure sensitivity. - * @return @c NULL. - ** - * =============================================================================== */ -DeviceHandle_t BMP581_init( - BMP581 *baro, - char name[DEVICE_NAME_LENGTH], - GPIO_TypeDef *port, - unsigned long cs, - float tempSensitivity, - float pressSensitivity -) { - SPI_init(&baro->base, SENSOR_BARO, SPI1, MODE8, port, cs); - baro->tempSensitivity = tempSensitivity; - baro->pressSensitivity = pressSensitivity; - baro->update = BMP581_update; - baro->readTemp = BMP581_readTemp; - baro->readRawTemp = BMP581_readRawTemp; - baro->processRawTemp = BMP581_processRawTemp; - baro->readPress = BMP581_readPress; - baro->readRawPress = BMP581_readRawPress; - baro->processRawPress = BMP581_processRawPress; - - // Initial dummy read - BMP581_readRegister(baro, 0x01); - - // Soft reset device - BMP581_writeRegister(baro, BMP581_CMD, 0xB6); - - while(BMP581_readRegister(baro, BMP581_CHIP_ID) == 0x00); // Check chip ID - while(BMP581_readRegister(baro, BMP581_INT_STATUS) != 0x10); // Wait for POR complete - while(!(BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_RDY)); // Check device status NVM ready - while((BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_ERR)); // Check device status NVM err - - volatile uint8_t counter = 0; - - - - BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS); // Disable deep sleep - for (uint32_t i = 0; i < 0x1FFFF; i++) {counter++;} // Wait for at least t_standby - BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS | BMP581_ODR_CFG_PWR_CONTINUOUS); // Set continuous sample - - uint8_t OSRCFG = BMP581_readRegister(baro, BMP581_OSR_CFG); - BMP581_writeRegister(baro, BMP581_OSR_CFG, (BMP581_OSR_CFG_RESERVED & OSRCFG) | BMP581_OSR_CFG_PRESS_EN | BMP581_OSR_CFG_OSR_P_16); - - // Set ground pressure reading on init - for (uint32_t i = 0; i < 0x1FFFF; i++) {counter++;} // Wait for at least t_reconf - baro->readPress(baro, &baro->groundPress); // Read current pressure - - DeviceHandle_t handle; - strcpy(handle.name, name); - handle.device = baro; - return handle; -} - -/******************************** DEVICE METHODS ********************************/ - -/* =============================================================================== */ -/** - * @brief Updates the BMP581 barometer readings. - * @param *baro Pointer to BMP581 struct to be updated. - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_update(BMP581 *baro) { - baro->readRawTemp(baro, baro->rawTemp); - baro->processRawTemp(baro, baro->rawTemp, &baro->temp); - - baro->readRawPress(baro, baro->rawPress); - baro->processRawPress(baro, baro->rawPress, &baro->press); -} - -/* =============================================================================== */ -/** - * @brief Read the temperature from the BMP581 sensor. - * @param *baro Pointer to BMP581 struct. - * @param *out Pointer to float where the temperature will be stored. - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_readTemp(BMP581 *baro, float *out) { - uint8_t bytes[BMP581_DATA_TOTAL]; - baro->readRawTemp(baro, bytes); - baro->processRawTemp(baro, bytes, out); -} - -/* =============================================================================== */ -/** - * @brief Processes raw temperature data from BMP581 sensor. - * @param *baro Pointer to BMP581 struct. - * @param *bytes Pointer to array containing raw temperature. - * @param *out Pointer to a float where processed temperature value will be stored. - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_processRawTemp(BMP581 *baro, uint8_t *bytes, float *out) { - *out = baro->tempSensitivity * (int32_t)(((uint32_t)bytes[0] << 16) | ((uint32_t)bytes[1] << 8) | bytes[0]); -} - -/* =============================================================================== */ -/** - * @brief - * @param - * @param - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_readRawTemp(BMP581 *baro, uint8_t *out) { - out[0] = BMP581_readRegister(baro, BMP581_TEMPERATURE_MSB); // temp high - out[1] = BMP581_readRegister(baro, BMP581_TEMPERATURE_LSB); // temp low - out[2] = BMP581_readRegister(baro, BMP581_TEMPERATURE_XLSB); // temp mid -} - -/* =============================================================================== */ -/** - * @brief - * @param - * @param - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_readPress(BMP581 *baro, float *out) { - uint8_t bytes[BMP581_DATA_TOTAL]; - baro->readRawPress(baro, bytes); - baro->processRawPress(baro, bytes, out); -} - -/* =============================================================================== */ -/** - * @brief - * @param - * @param - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_processRawPress(BMP581 *baro, uint8_t *bytes, float *out) { - *out = baro->pressSensitivity * (int32_t)(((uint32_t)bytes[0] << 16) | ((uint32_t)bytes[1] << 8) | bytes[0]); -} - -/* =============================================================================== */ -/** - * @brief - * @param - * @param - * @returns @c NULL. - ** - * =============================================================================== */ -void BMP581_readRawPress(BMP581 *baro, uint8_t *out) { - uint8_t tmp[BMP581_DATA_SIZE]; - BMP581_readRegisters(baro, BMP581_PRESSURE_XLSB, BMP581_DATA_SIZE, tmp); - out[0] = tmp[2]; // temp high - out[1] = tmp[1]; // temp low - out[2] = tmp[0]; // temp mid -} - -/******************************** INTERFACE METHODS ********************************/ - -void BMP581_writeRegister(BMP581 *baro, uint8_t address, uint8_t data) { - SPI spi = baro->base; - - spi.port->ODR &= ~spi.cs; - - // Send read command and address - uint8_t payload = address & 0x7F; // Load payload with address and read command - spi.transmit(&spi, payload); // Transmit payload - spi.transmit(&spi, data); // Transmit dummy data and read response data - - spi.port->ODR |= spi.cs; -} - -uint8_t BMP581_readRegister(BMP581 *baro, uint8_t address) { - uint8_t response = 0; - SPI spi = baro->base; - - spi.port->ODR &= ~spi.cs; - - // Send read command and address - uint8_t payload = address | 0x80; // Load payload with address and read command - response = spi.transmit(&spi, payload); // Transmit payload - response = spi.transmit(&spi, 0xFF); // Transmit dummy data and read response data - - spi.port->ODR |= spi.cs; - - return response; -} - -void BMP581_readRegisters(BMP581 *baro, uint8_t address, uint8_t count, uint8_t *out) { - SPI spi = baro->base; - - spi.port->ODR &= ~spi.cs; - - // Send read command and address - uint8_t payload = address | 0x80; // Load payload with address and read command - spi.transmit(&spi, payload); // Transmit payload - - // Auto increment read through registers - for (uint8_t i = 0; i < count; i++) { - out[i] = spi.transmit(&spi, 0xFF); - } - - spi.port->ODR |= spi.cs; -} diff --git a/Australis-Avionics/Core/Src/SPI/sensors/gyro/A3G4250D.c b/Australis-Avionics/Core/Src/SPI/sensors/gyro/A3G4250D.c deleted file mode 100755 index 7bf5763..0000000 --- a/Australis-Avionics/Core/Src/SPI/sensors/gyro/A3G4250D.c +++ /dev/null @@ -1,158 +0,0 @@ -/*********************************************************************************** - * - * @file A3G4250D.c * - * @author Matt Ricci * - * @addtogroup A3G4250D * - * * - * @todo Move private interface methods (read/write register) to static functions * - * with internal prototypes. * - * @{ * - ***********************************************************************************/ - -#include "A3G4250D.h" -#include "devices.h" - -/* =============================================================================== */ -/** - * @brief Initialiser for a A3G4250D gyroscope. - * - * @param *gyro Pointer to A3G4250D struct to be initialised. - * @param *port Pointer to GPIO port struct. - * @param cs Device chip select address. - * @param scale Selected scale for read gyro rates. - * @param *axes Array defining sensor mounting axes. - * @return @c NULL. - ** - * =============================================================================== */ -DeviceHandle_t A3G4250D_init( - A3G4250D *gyro, - char name[DEVICE_NAME_LENGTH], - GPIO_TypeDef *port, - unsigned long cs, - float sensitivity, - const uint8_t *axes, - const int8_t *sign -) { - SPI_init(&gyro->base, SENSOR_GYRO, SPI1, MODE8, port, cs); - gyro->sensitivity = sensitivity; - gyro->update = A3G4250D_update; - gyro->readGyro = A3G4250D_readGyro; - gyro->readRawBytes = A3G4250D_readRawBytes; - gyro->processRawBytes = A3G4250D_processRawBytes; - memcpy(gyro->axes, axes, A3G4250D_DATA_COUNT); - memcpy(gyro->sign, sign, A3G4250D_DATA_COUNT); - - const uint32_t superDelay = 0xFFFF; - volatile uint8_t counter = 0; - - // Wait for the spefified period - need to wait for 2ms here. - for (uint32_t i = 0; i < superDelay; i++) { - counter++; - } - - A3G4250D_writeRegister(gyro, A3G4250D_CTRL_REG1, A3G4250D_CTRL_REG1_ODR_800Hz | A3G4250D_CTRL_REG1_AXIS_ENABLE | A3G4250D_CTRL_REG1_PD_ENABLE); - - static DeviceHandle_t handle; - strcpy(handle.name, name); - handle.device = gyro; - return handle; -} - -/******************************** DEVICE METHODS ********************************/ - -/* =============================================================================== */ -/** - * @brief Read 3-axis floating point gyro rates. - * - * @param *gyro Pointer to gyro struct. - * @param *out Floating point gyro rate array. - * @returns @c NULL. - ** - * =============================================================================== */ -void A3G4250D_readGyro(A3G4250D *gyro, float *out) { - uint8_t bytes[A3G4250D_DATA_TOTAL]; - gyro->readRawBytes(gyro, bytes); - gyro->processRawBytes(gyro, bytes, out); -} - -/* =============================================================================== */ -/** - * @brief Updates internally stored gyro readings. - * - * @param *gyro Pointer to gyro struct. - * @returns @c NULL. - ** - * =============================================================================== */ -void A3G4250D_update(A3G4250D *gyro) { - gyro->readRawBytes(gyro, gyro->rawGyroData); - gyro->processRawBytes(gyro, gyro->rawGyroData, gyro->gyroData); -} - -/* =============================================================================== */ -/** - * @brief Process raw 3-axis data to floating point gyro rates. - * - * @param *gyro Pointer to gyro struct. - * @param *bytes Raw 3-axis data array. - * @param *out Processed 3-axis data array to write. - * @returns @c NULL. - ** - * =============================================================================== */ -void A3G4250D_processRawBytes(A3G4250D *gyro, uint8_t *bytes, float *out) { - out[0] = gyro->sign[0] * gyro->sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]); // gyro X - out[1] = gyro->sign[1] * gyro->sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]); // gyro Y - out[2] = gyro->sign[2] * gyro->sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]); // gyro Z -} - -/* =============================================================================== */ -/** - * @brief Read raw 3-axis data. - * - * @param *gyro Pointer to gyro struct. - * @param *out Raw 3-axis data array to write. - * @returns @c NULL. - ** - * =============================================================================== */ -void A3G4250D_readRawBytes(A3G4250D *gyro, uint8_t *out) { -#define INDEX_AXES(index, byte) 2 * gyro->axes[index] + byte - out[INDEX_AXES(0, 0)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_X_H); // gyro X high - out[INDEX_AXES(0, 1)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_X_L); // gyro X low - out[INDEX_AXES(1, 0)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Y_H); // gyro Y high - out[INDEX_AXES(1, 1)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Y_L); // gyro Y low - out[INDEX_AXES(2, 0)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Z_H); // gyro Z high - out[INDEX_AXES(2, 1)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Z_L); // gyro Z low -#undef INDEX_AXES -} - -/******************************** INTERFACE METHODS ********************************/ - -void A3G4250D_writeRegister(A3G4250D *gyro, uint8_t address, uint8_t data) { - SPI spi = gyro->base; - - spi.port->ODR &= ~spi.cs; - - // Send read command and address - uint8_t payload = address & 0x7F; // Load payload with address and read command - spi.transmit(&spi, payload); // Transmit payload - spi.transmit(&spi, data); // Transmit dummy data and read response data - - spi.port->ODR |= spi.cs; -} - -uint8_t A3G4250D_readRegister(A3G4250D *gyro, uint8_t address) { - uint8_t response = 0; - SPI spi = gyro->base; - - spi.port->ODR &= ~spi.cs; - - // Send read command and address - uint8_t payload = address | 0x80; // Load payload with address and read command - response = spi.transmit(&spi, payload); // Transmit payload - response = spi.transmit(&spi, 0xFF); // Transmit dummy data and read response data - - spi.port->ODR |= spi.cs; - - return response; -} - -/** @} */ diff --git a/Australis-Avionics/Core/Src/SPI/sensors/sensors.c b/Australis-Avionics/Core/Src/SPI/sensors/sensors.c deleted file mode 100755 index 657af47..0000000 --- a/Australis-Avionics/Core/Src/SPI/sensors/sensors.c +++ /dev/null @@ -1,69 +0,0 @@ -/*********************************************************************************** - * @file sensors.c * - * @author Matt Ricci * - * * - * @todo Move initialisation of SPI interface to individual devices initialising * - * relevant registers and peripherals. * - ***********************************************************************************/ - -#include "sensors.h" - -void configure_SPI1_Sensor_Suite(void) { - GPIOA->MODER &= (~(GPIO_MODER_MODE5_Msk | GPIO_MODER_MODE6_Msk | GPIO_MODER_MODE7_Msk)); - GPIOA->MODER |= ((0x2 << GPIO_MODER_MODE5_Pos) | (0x2 << GPIO_MODER_MODE6_Pos) | (0x2 << GPIO_MODER_MODE7_Pos)); - GPIOA->AFR[0] &= (~(0xFFF00000)); // clears AFRL 5, 6 and 7 - GPIOA->AFR[0] |= (0x55500000); // sets ports 5,6,7 to AF5 - - GPIOA->OTYPER &= (~(GPIO_OTYPER_OT5 | GPIO_OTYPER_OT6 | GPIO_OTYPER_OT7)); // configure as push pull - GPIOA->OSPEEDR &= (~(GPIO_OSPEEDR_OSPEED5_Msk | GPIO_OSPEEDR_OSPEED6_Msk | GPIO_OSPEEDR_OSPEED7_Msk)); // clears OSPEED - GPIOA->OSPEEDR |= (0x2 << GPIO_OSPEEDR_OSPEED5_Pos | 0x2 << GPIO_OSPEEDR_OSPEED6_Pos | 0x2 << GPIO_OSPEEDR_OSPEED7_Pos); // sets as high speed - // pins PC2, PC3, PC4 need to be set to interrupt pins - // - // pins PA2, PA4, PA1, PB0 need to set as general purpose outputs - GPIOA->MODER &= (~(GPIO_MODER_MODE1_Msk | GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk | GPIO_MODER_MODE4_Msk)); - GPIOA->MODER |= ((0x1 << GPIO_MODER_MODE1_Pos) | (0x1 << GPIO_MODER_MODE2_Pos) | (0x1 << GPIO_MODER_MODE3_Pos) | (0x1 << GPIO_MODER_MODE4_Pos)); - GPIOA->OTYPER &= (uint32_t)(~(GPIO_OTYPER_OT1 | GPIO_OTYPER_OT2 | GPIO_OTYPER_OT3 | GPIO_OTYPER_OT4)); // sets 0xboth as push-pull - GPIOA->OSPEEDR &= (~(GPIO_OSPEEDR_OSPEED1_Msk | GPIO_OSPEEDR_OSPEED2_Msk | GPIO_OSPEEDR_OSPEED3_Msk | GPIO_OSPEEDR_OSPEED4_Msk)); // clears Port 14 and 15 section - GPIOA->OSPEEDR |= ((0x2 << GPIO_OSPEEDR_OSPEED1_Pos) | (0x2 << GPIO_OSPEEDR_OSPEED2_Pos) | (0x2 << GPIO_OSPEEDR_OSPEED3_Pos) | (0x2 << GPIO_OSPEEDR_OSPEED4_Pos)); // sets slew rate as high speed - // PA2 Gryo Chip Select - set to high for default - // PA1 Accel 1 Chip Select - set to high for default - // PA4 Mag - chip select - set to high for dafault - - GPIOA->ODR |= (GPIO_ODR_OD1 | GPIO_ODR_OD2 | GPIO_ODR_OD3 | GPIO_ODR_OD4); // sets to high to disable chip select - - GPIOB->MODER &= (~(GPIO_MODER_MODE0_Msk)); - GPIOB->MODER |= (0x1 << GPIO_MODER_MODE0_Pos); - GPIOB->OTYPER &= (~(GPIO_OTYPER_OT0)); - GPIOB->OSPEEDR &= (~(GPIO_OSPEEDR_OSPEED0_Msk)); - GPIOB->OSPEEDR |= (0x2 << GPIO_OSPEEDR_OSPEED0_Pos); - - // PB0 Accel 1 Chip Select - set to high for default - GPIOB->ODR |= (GPIO_ODR_OD0); - - // Clear the First Control register of the SPI peripheral. - SPI1->CR1 &= 0xFFFF0000; - - // Configure the SCLK to be divide by 8, - SPI1->CR1 |= (0x02 << SPI_CR1_BR_Pos) | (1 << SPI_CR1_CPOL_Pos) | (1 << SPI_CR1_CPHA_Pos) | (0 << SPI_CR1_DFF_Pos); - - - // Set to full duplex, master mode. - // In full duplex, both the MISO and MOSI pins are required. - SPI1->CR1 &= ~(SPI_CR1_BIDIMODE); - SPI1->CR1 &= ~(SPI_CR1_RXONLY); - - // Set the slave select - software management. - SPI1->CR1 |= (SPI_CR1_SSM | SPI_CR1_SSI); - - // Specify master operation. - SPI1->CR1 |= SPI_CR1_MSTR; - - // Manually raise the chip select. - GPIOA->ODR |= (1 << GPIO_ODR_OD4_Pos) | (1 << GPIO_ODR_OD3_Pos) | (1 << GPIO_ODR_OD2_Pos) | (1 << GPIO_ODR_OD1_Pos); - - // Enable the SPI peripheral - SPI1->CR1 |= SPI_CR1_SPE; - - - -} diff --git a/Australis-Avionics/Core/Src/SPI/spi.c b/Australis-Avionics/Core/Src/SPI/spi.c deleted file mode 100755 index d9c447e..0000000 --- a/Australis-Avionics/Core/Src/SPI/spi.c +++ /dev/null @@ -1,96 +0,0 @@ -/*********************************************************************************** - * @file spi.c * - * @author Matt Ricci * - * @addtogroup SPI * - * @brief Implements functions for SPI device interface initialization and * - * communication. * - * * - * @todo Rewrite initialisation to implement enum check for 8/16 bit mode * - * and assign approprriate function pointers * - ***********************************************************************************/ - -#include "spi.h" - -static void SPI_send8(SPI *, uint16_t); -static void SPI_send16(SPI *, uint16_t); - -static void SPI_receive8(SPI *, volatile uint16_t *); -static void SPI_receive16(SPI *, volatile uint16_t *); - -/* =============================================================================== */ -/** - * @brief Initialiser for an SPI device interface. - * - * @param *spi Pointer to SPI struct to be initialised. - * @param device Enum specifier for device type. - * @param *interface Pointer to SPI interface struct. - * @param *port Pointer to GPIO port struct. - * @param cs Device chip select address. - * @return @c NULL. - ** - * =============================================================================== */ -void SPI_init(SPI *spi, DeviceType device, SPI_TypeDef *interface, DataFormat df, GPIO_TypeDef *port, unsigned long cs) { - spi->device = device; - spi->interface = interface; - spi->port = port; - spi->cs = cs; - - spi->send = (df == MODE8) ? SPI_send8 : SPI_send16; - spi->receive = (df == MODE8) ? SPI_receive8 : SPI_receive16; - spi->transmit = SPI_transmit; -} - -/* =============================================================================== */ -/** - * @brief Instance method to communicate a SPI transaction with slave device. - * - * @param *spi Pointer to SPI struct. - * @param data Data payload to be sent to slave device. - * @retval response Returns the slave device response from the transaction. - ** - * =============================================================================== */ -uint16_t SPI_transmit(SPI *spi, uint16_t data) { - volatile uint16_t response; - spi->send(spi, data); - spi->receive(spi, &response); - while (spi->interface->SR & SPI_SR_BSY); - return response; -} - -/* =============================================================================== */ -/** - * @brief Send data through the SPI interface. - * - * @param *spi Pointer to SPI struct. - * @param data The data to send. - * @return @c NULL. - ** - * =============================================================================== */ -static void SPI_send8(SPI *spi, uint16_t data) { - while (!(spi->interface->SR & SPI_SR_TXE)); - spi->interface->DR = (uint8_t)data; -} - -static void SPI_send16(SPI *spi, uint16_t data) { - while (!(spi->interface->SR & SPI_SR_TXE)); - spi->interface->DR = data; -} - -/* =============================================================================== */ -/** - * @brief Receive data through the SPI interface. - * - * @param *spi Pointer to SPI struct. - * @param data Pointer to variable to receive data into. - * @return @c NULL. - ** - * =============================================================================== */ -static void SPI_receive8(SPI *spi, volatile uint16_t *data) { - while (!(spi->interface->SR & SPI_SR_RXNE)); - *data = (uint8_t) spi->interface->DR; -} - -static void SPI_receive16(SPI *spi, volatile uint16_t *data) { - while (!(spi->interface->SR & SPI_SR_RXNE)); - *data = spi->interface->DR; -} diff --git a/Australis-Avionics/Core/Src/spi/lora/lora.c b/Australis-Avionics/Core/Src/spi/lora/lora.c index af373f9..b76f41a 100755 --- a/Australis-Avionics/Core/Src/spi/lora/lora.c +++ b/Australis-Avionics/Core/Src/spi/lora/lora.c @@ -177,6 +177,23 @@ LoRa_Packet LoRa_GPSData( return msg; } +LoRa_Packet LoRa_PayloadData( + uint8_t id, + uint8_t state, + uint8_t *accelData, + uint8_t lenAccelData +) { + LoRa_Packet msg; + + int idx = 0; + // Append to struct data array + msg.id = id; + msg.data[idx++] = state; + memcpy(&msg.data[idx+lenAccelData], accelData, lenAccelData); + + return msg; +} + /********************************** DEVICE METHODS *********************************/ /* =============================================================================== */ diff --git a/Australis-Avionics/Core/Src/spi/sensors/baro/BMP581.c b/Australis-Avionics/Core/Src/spi/sensors/baro/BMP581.c index 9ad372f..ea3c49b 100755 --- a/Australis-Avionics/Core/Src/spi/sensors/baro/BMP581.c +++ b/Australis-Avionics/Core/Src/spi/sensors/baro/BMP581.c @@ -52,20 +52,22 @@ DeviceHandle_t BMP581_init( while(BMP581_readRegister(baro, BMP581_CHIP_ID) == 0x00); // Check chip ID while(BMP581_readRegister(baro, BMP581_INT_STATUS) != 0x10); // Wait for POR complete while(!(BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_RDY)); // Check device status NVM ready - while((BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_ERR)); // Check device status NVM ready + while((BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_ERR)); // Check device status NVM err volatile uint8_t counter = 0; + + BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS); // Disable deep sleep - for (uint32_t i = 0; i < 0xFFFFFF; i++) {counter++;} // Wait for at least t_standby - BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_PWR_CONTINUOUS); // Set continuous sample + for (uint32_t i = 0; i < 0x1FFFF; i++) {counter++;} // Wait for at least t_standby + BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS | BMP581_ODR_CFG_PWR_CONTINUOUS); // Set continuous sample uint8_t OSRCFG = BMP581_readRegister(baro, BMP581_OSR_CFG); - BMP581_writeRegister(baro, BMP581_OSR_CFG, (BMP581_OSR_CFG_RESERVED & OSRCFG) | BMP581_OSR_CFG_PRESS_EN); + BMP581_writeRegister(baro, BMP581_OSR_CFG, (BMP581_OSR_CFG_RESERVED & OSRCFG) | BMP581_OSR_CFG_PRESS_EN | BMP581_OSR_CFG_OSR_P_16); // Set ground pressure reading on init - for (uint32_t i = 0; i < 0xFFFFFF; i++) {counter++;} // Wait for at least t_reconf - baro->readPress(baro, &baro->groundPress); // Read current pressure + for (uint32_t i = 0; i < 0x1FFFF; i++) {counter++;} // Wait for at least t_reconf + baro->readPress(baro, &baro->groundPress); // Read current pressure DeviceHandle_t handle; strcpy(handle.name, name); @@ -168,8 +170,8 @@ void BMP581_processRawPress(BMP581 *baro, uint8_t *bytes, float *out) { void BMP581_readRawPress(BMP581 *baro, uint8_t *out) { uint8_t tmp[BMP581_DATA_SIZE]; BMP581_readRegisters(baro, BMP581_PRESSURE_XLSB, BMP581_DATA_SIZE, tmp); - out[0] = tmp[2]; // temp high - out[1] = tmp[1]; // temp low + out[0] = tmp[2]; // temp high + out[1] = tmp[1]; // temp low out[2] = tmp[0]; // temp mid } From 70a5bc02984c59bd935a7269361c5f984ab0d05f Mon Sep 17 00:00:00 2001 From: Matt Ricci Date: Wed, 22 Jan 2025 01:17:05 +1100 Subject: [PATCH 2/6] Renamed subdirectories in Src/ and Inc/ for consistency in naming convention. From this point forward all files and directories in the Src/ and Inc/ trees must be named in full lowercase. --- Australis-Avionics/Core/Inc/{CAN => can}/can.h | 0 Australis-Avionics/Core/Inc/{RTOS => rtos}/FreeRTOSConfig.h | 0 Australis-Avionics/Core/Inc/{RTOS => rtos}/groups.h | 0 Australis-Avionics/Core/Inc/{RTOS => rtos}/handles.h | 0 Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/comms/loraComm.h | 0 .../Core/Inc/{RTOS => rtos}/tasks/comms/payloadComm.h | 0 Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/comms/usbComm.h | 0 .../Core/Inc/{RTOS => rtos}/tasks/data/flashWrite.h | 0 .../Core/Inc/{RTOS => rtos}/tasks/data/gpsAcquisition.h | 0 .../Core/Inc/{RTOS => rtos}/tasks/data/hDataAcquisition.h | 0 .../Core/Inc/{RTOS => rtos}/tasks/data/lDataAcquisition.h | 0 Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/stateUpdate.h | 0 Australis-Avionics/Core/Inc/{UART => uart}/GPS/gps.h | 0 Australis-Avionics/Core/Inc/{UART => uart}/USB/shell.h | 0 Australis-Avionics/Core/Inc/{UART => uart}/uart.h | 0 Australis-Avionics/Core/Src/{CAN => can}/can.c | 0 Australis-Avionics/Core/Src/{RTOS => rtos}/freertos.c | 0 Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/comms/loraComm.c | 0 .../Core/Src/{RTOS => rtos}/tasks/comms/payloadComm.c | 0 Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/comms/usbComm.c | 0 .../Core/Src/{RTOS => rtos}/tasks/data/flashWrite.c | 0 .../Core/Src/{RTOS => rtos}/tasks/data/gpsAcquisition.c | 0 .../Core/Src/{RTOS => rtos}/tasks/data/hDataAcquisition.c | 0 .../Core/Src/{RTOS => rtos}/tasks/data/lDataAcquisition.c | 0 Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/stateUpdate.c | 0 Australis-Avionics/Core/Src/{UART => uart}/GPS/gps.c | 0 Australis-Avionics/Core/Src/{UART => uart}/USB/shell.c | 0 Australis-Avionics/Core/Src/{UART => uart}/uart.c | 0 28 files changed, 0 insertions(+), 0 deletions(-) rename Australis-Avionics/Core/Inc/{CAN => can}/can.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/FreeRTOSConfig.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/groups.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/handles.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/comms/loraComm.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/comms/payloadComm.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/comms/usbComm.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/data/flashWrite.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/data/gpsAcquisition.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/data/hDataAcquisition.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/data/lDataAcquisition.h (100%) rename Australis-Avionics/Core/Inc/{RTOS => rtos}/tasks/stateUpdate.h (100%) rename Australis-Avionics/Core/Inc/{UART => uart}/GPS/gps.h (100%) rename Australis-Avionics/Core/Inc/{UART => uart}/USB/shell.h (100%) rename Australis-Avionics/Core/Inc/{UART => uart}/uart.h (100%) rename Australis-Avionics/Core/Src/{CAN => can}/can.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/freertos.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/comms/loraComm.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/comms/payloadComm.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/comms/usbComm.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/data/flashWrite.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/data/gpsAcquisition.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/data/hDataAcquisition.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/data/lDataAcquisition.c (100%) rename Australis-Avionics/Core/Src/{RTOS => rtos}/tasks/stateUpdate.c (100%) rename Australis-Avionics/Core/Src/{UART => uart}/GPS/gps.c (100%) rename Australis-Avionics/Core/Src/{UART => uart}/USB/shell.c (100%) rename Australis-Avionics/Core/Src/{UART => uart}/uart.c (100%) diff --git a/Australis-Avionics/Core/Inc/CAN/can.h b/Australis-Avionics/Core/Inc/can/can.h similarity index 100% rename from Australis-Avionics/Core/Inc/CAN/can.h rename to Australis-Avionics/Core/Inc/can/can.h diff --git a/Australis-Avionics/Core/Inc/RTOS/FreeRTOSConfig.h b/Australis-Avionics/Core/Inc/rtos/FreeRTOSConfig.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/FreeRTOSConfig.h rename to Australis-Avionics/Core/Inc/rtos/FreeRTOSConfig.h diff --git a/Australis-Avionics/Core/Inc/RTOS/groups.h b/Australis-Avionics/Core/Inc/rtos/groups.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/groups.h rename to Australis-Avionics/Core/Inc/rtos/groups.h diff --git a/Australis-Avionics/Core/Inc/RTOS/handles.h b/Australis-Avionics/Core/Inc/rtos/handles.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/handles.h rename to Australis-Avionics/Core/Inc/rtos/handles.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/comms/loraComm.h b/Australis-Avionics/Core/Inc/rtos/tasks/comms/loraComm.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/comms/loraComm.h rename to Australis-Avionics/Core/Inc/rtos/tasks/comms/loraComm.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/comms/payloadComm.h b/Australis-Avionics/Core/Inc/rtos/tasks/comms/payloadComm.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/comms/payloadComm.h rename to Australis-Avionics/Core/Inc/rtos/tasks/comms/payloadComm.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/comms/usbComm.h b/Australis-Avionics/Core/Inc/rtos/tasks/comms/usbComm.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/comms/usbComm.h rename to Australis-Avionics/Core/Inc/rtos/tasks/comms/usbComm.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/data/flashWrite.h b/Australis-Avionics/Core/Inc/rtos/tasks/data/flashWrite.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/data/flashWrite.h rename to Australis-Avionics/Core/Inc/rtos/tasks/data/flashWrite.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/data/gpsAcquisition.h b/Australis-Avionics/Core/Inc/rtos/tasks/data/gpsAcquisition.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/data/gpsAcquisition.h rename to Australis-Avionics/Core/Inc/rtos/tasks/data/gpsAcquisition.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/data/hDataAcquisition.h b/Australis-Avionics/Core/Inc/rtos/tasks/data/hDataAcquisition.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/data/hDataAcquisition.h rename to Australis-Avionics/Core/Inc/rtos/tasks/data/hDataAcquisition.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/data/lDataAcquisition.h b/Australis-Avionics/Core/Inc/rtos/tasks/data/lDataAcquisition.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/data/lDataAcquisition.h rename to Australis-Avionics/Core/Inc/rtos/tasks/data/lDataAcquisition.h diff --git a/Australis-Avionics/Core/Inc/RTOS/tasks/stateUpdate.h b/Australis-Avionics/Core/Inc/rtos/tasks/stateUpdate.h similarity index 100% rename from Australis-Avionics/Core/Inc/RTOS/tasks/stateUpdate.h rename to Australis-Avionics/Core/Inc/rtos/tasks/stateUpdate.h diff --git a/Australis-Avionics/Core/Inc/UART/GPS/gps.h b/Australis-Avionics/Core/Inc/uart/GPS/gps.h similarity index 100% rename from Australis-Avionics/Core/Inc/UART/GPS/gps.h rename to Australis-Avionics/Core/Inc/uart/GPS/gps.h diff --git a/Australis-Avionics/Core/Inc/UART/USB/shell.h b/Australis-Avionics/Core/Inc/uart/USB/shell.h similarity index 100% rename from Australis-Avionics/Core/Inc/UART/USB/shell.h rename to Australis-Avionics/Core/Inc/uart/USB/shell.h diff --git a/Australis-Avionics/Core/Inc/UART/uart.h b/Australis-Avionics/Core/Inc/uart/uart.h similarity index 100% rename from Australis-Avionics/Core/Inc/UART/uart.h rename to Australis-Avionics/Core/Inc/uart/uart.h diff --git a/Australis-Avionics/Core/Src/CAN/can.c b/Australis-Avionics/Core/Src/can/can.c similarity index 100% rename from Australis-Avionics/Core/Src/CAN/can.c rename to Australis-Avionics/Core/Src/can/can.c diff --git a/Australis-Avionics/Core/Src/RTOS/freertos.c b/Australis-Avionics/Core/Src/rtos/freertos.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/freertos.c rename to Australis-Avionics/Core/Src/rtos/freertos.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/comms/loraComm.c b/Australis-Avionics/Core/Src/rtos/tasks/comms/loraComm.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/comms/loraComm.c rename to Australis-Avionics/Core/Src/rtos/tasks/comms/loraComm.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/comms/payloadComm.c b/Australis-Avionics/Core/Src/rtos/tasks/comms/payloadComm.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/comms/payloadComm.c rename to Australis-Avionics/Core/Src/rtos/tasks/comms/payloadComm.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/comms/usbComm.c b/Australis-Avionics/Core/Src/rtos/tasks/comms/usbComm.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/comms/usbComm.c rename to Australis-Avionics/Core/Src/rtos/tasks/comms/usbComm.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/data/flashWrite.c b/Australis-Avionics/Core/Src/rtos/tasks/data/flashWrite.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/data/flashWrite.c rename to Australis-Avionics/Core/Src/rtos/tasks/data/flashWrite.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/data/gpsAcquisition.c b/Australis-Avionics/Core/Src/rtos/tasks/data/gpsAcquisition.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/data/gpsAcquisition.c rename to Australis-Avionics/Core/Src/rtos/tasks/data/gpsAcquisition.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/data/hDataAcquisition.c b/Australis-Avionics/Core/Src/rtos/tasks/data/hDataAcquisition.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/data/hDataAcquisition.c rename to Australis-Avionics/Core/Src/rtos/tasks/data/hDataAcquisition.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/data/lDataAcquisition.c b/Australis-Avionics/Core/Src/rtos/tasks/data/lDataAcquisition.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/data/lDataAcquisition.c rename to Australis-Avionics/Core/Src/rtos/tasks/data/lDataAcquisition.c diff --git a/Australis-Avionics/Core/Src/RTOS/tasks/stateUpdate.c b/Australis-Avionics/Core/Src/rtos/tasks/stateUpdate.c similarity index 100% rename from Australis-Avionics/Core/Src/RTOS/tasks/stateUpdate.c rename to Australis-Avionics/Core/Src/rtos/tasks/stateUpdate.c diff --git a/Australis-Avionics/Core/Src/UART/GPS/gps.c b/Australis-Avionics/Core/Src/uart/GPS/gps.c similarity index 100% rename from Australis-Avionics/Core/Src/UART/GPS/gps.c rename to Australis-Avionics/Core/Src/uart/GPS/gps.c diff --git a/Australis-Avionics/Core/Src/UART/USB/shell.c b/Australis-Avionics/Core/Src/uart/USB/shell.c similarity index 100% rename from Australis-Avionics/Core/Src/UART/USB/shell.c rename to Australis-Avionics/Core/Src/uart/USB/shell.c diff --git a/Australis-Avionics/Core/Src/UART/uart.c b/Australis-Avionics/Core/Src/uart/uart.c similarity index 100% rename from Australis-Avionics/Core/Src/UART/uart.c rename to Australis-Avionics/Core/Src/uart/uart.c From ab3410318393c2e450fe2dd041840949a7f44f6b Mon Sep 17 00:00:00 2001 From: Matt Ricci Date: Wed, 22 Jan 2025 01:22:52 +1100 Subject: [PATCH 3/6] Update paths in Doxyfile --- Doxyfile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Doxyfile b/Doxyfile index 9a13cf4..4efa6c5 100755 --- a/Doxyfile +++ b/Doxyfile @@ -181,16 +181,16 @@ FILE_PATTERNS = *.c \ *.qsf \ *.ice RECURSIVE = YES -EXCLUDE = AuroraV-Avionics/Core/Inc/FreeRTOSConfig.h \ - AuroraV-Avionics/Core/Inc/stm32f4xx_hal_conf.h \ - AuroraV-Avionics/Core/Inc/stm32f4xx_it.h \ - AuroraV-Avionics/Data \ - AuroraV-Avionics/Drivers \ - AuroraV-Avionics/Lib \ - AuroraV-Avionics/MDK-ARM \ - AuroraV-Avionics/Middlewares \ - AuroraV-Avionics/Core/Src/freertos.c \ - AuroraV-Avionics/Core/Src/system_stm32f4xx.c \ +EXCLUDE = Australis-Avionics/Core/Inc/FreeRTOSConfig.h \ + Australis-Avionics/Core/Inc/stm32f4xx_hal_conf.h \ + Australis-Avionics/Core/Inc/stm32f4xx_it.h \ + Australis-Avionics/Data \ + Australis-Avionics/Drivers \ + Australis-Avionics/Lib \ + Australis-Avionics/MDK-ARM \ + Australis-Avionics/Middlewares \ + Australis-Avionics/Core/Src/freertos.c \ + Australis-Avionics/Core/Src/system_stm32f4xx.c \ documentation/doxygen-awesome-css EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = From 874e2dc17f29e5524bf5fd29d9fe35e83ac41d9b Mon Sep 17 00:00:00 2001 From: Matthew Ricci <49254178+s3785111@users.noreply.github.com> Date: Wed, 22 Jan 2025 01:36:08 +1100 Subject: [PATCH 4/6] Fix published directory path in GitHub Pages deploy action --- .github/workflows/doxygen-gh-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/doxygen-gh-pages.yml b/.github/workflows/doxygen-gh-pages.yml index 2dc1364..ce8db1a 100755 --- a/.github/workflows/doxygen-gh-pages.yml +++ b/.github/workflows/doxygen-gh-pages.yml @@ -31,4 +31,4 @@ jobs: uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./documentation + publish_dir: ./documentation/docs From e41b8b86baa9609a68d63c33303f637f3a9b5e7d Mon Sep 17 00:00:00 2001 From: Matt Ricci Date: Wed, 22 Jan 2025 01:48:43 +1100 Subject: [PATCH 5/6] Update doxygen-awesome stylesheet to allow matching of logo colour with theme --- Doxyfile | 5 +- documentation/docs/css/doxygen-awesome.css | 2690 ++++++++++++++++++++ 2 files changed, 2692 insertions(+), 3 deletions(-) create mode 100755 documentation/docs/css/doxygen-awesome.css diff --git a/Doxyfile b/Doxyfile index 4efa6c5..48388a0 100755 --- a/Doxyfile +++ b/Doxyfile @@ -235,9 +235,8 @@ HTML_FILE_EXTENSION = .html HTML_HEADER = documentation/docs/html/header.html HTML_FOOTER = HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = documentation/doxygen-awesome-css/doxygen-awesome.css -HTML_EXTRA_FILES = documentation/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js \ - documentation/AuroraV-Avionics-firmware +HTML_EXTRA_STYLESHEET = documentation/docs/css/doxygen-awesome.css +HTML_EXTRA_FILES = documentation/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js HTML_COLORSTYLE = LIGHT HTML_COLORSTYLE_HUE = 164 HTML_COLORSTYLE_SAT = 106 diff --git a/documentation/docs/css/doxygen-awesome.css b/documentation/docs/css/doxygen-awesome.css new file mode 100755 index 0000000..ca356d5 --- /dev/null +++ b/documentation/docs/css/doxygen-awesome.css @@ -0,0 +1,2690 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + .logo { + filter: invert(0); + } + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #faf3d8; + --warning-color-dark: #f3a600; + --warning-color-darker: #5f4204; + --note-color: #e4f3ff; + --note-color-dark: #1879C4; + --note-color-darker: #274a5c; + --todo-color: #e4dafd; + --todo-color-dark: #5b2bdd; + --todo-color-darker: #2a0d72; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #f8d1cc; + --bug-color-dark: #b61825; + --bug-color-darker: #75070f; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #ebebeb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsible table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); + + --animation-duration: .12s +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + + html:not(.light-mode) { + color-scheme: dark; + + .logo { + filter: invert(1); + } + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + .logo { + filter: invert(1); + } + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition, div.toc li, div.toc h3 { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: 1em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; + background: none; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; + margin-right: 1px; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-tree .item > a:focus { + outline: none; +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); + background: none; +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe, + html:not(.light-mode) div.contents .dotgraph iframe { + filter: brightness(89%) hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname, .paramname em { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +.dotgraph { + max-width: 100%; + overflow-x: scroll; +} + +.dotgraph .caption { + position: sticky; + left: 0; +} + +/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ +.interactive_dotgraph .dotgraph iframe { + max-width: 100%; +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: var(--page-background-color); + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform var(--animation-duration) ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .textblock > .tabbed > ul > li > div.fragment, + .textblock > .tabbed > ul > li > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment > .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); + background-color: var(--fragment-linenumber-background) !important; +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.markdownTable, table.doxtable, table.fieldtable { + padding: 1px; +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: block; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: table; + width: 100%; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform var(--animation-duration) ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 var(--separator-color), + -100px 0 var(--separator-color), + 500px 0 var(--separator-color), + -500px 0 var(--separator-color), + 900px 0 var(--separator-color), + -900px 0 var(--separator-color), + 1400px 0 var(--separator-color), + -1400px 0 var(--separator-color), + 1900px 0 var(--separator-color), + -1900px 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar, +.contents .dotgraph::-webkit-scrollbar, +.contents .tabs-overview-container::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb, +.contents .dotgraph::-webkit-scrollbar-thumb, +.contents .tabs-overview-container::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb, +.contents .dotgraph:hover::-webkit-scrollbar-thumb, +.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track, +.contents .dotgraph::-webkit-scrollbar-track, +.contents .tabs-overview-container::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform var(--animation-duration) ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + +/* + Optional tab feature +*/ + +.tabbed > ul { + padding-inline-start: 0px; + margin: 0; + padding: var(--spacing-small) 0; +} + +.tabbed > ul > li { + display: none; +} + +.tabbed > ul > li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +@media screen and (max-width: 767px) { + .tabs-overview-container { + margin: 0 calc(0px - var(--spacing-large)); + } + .tabs-overview { + padding: 0 var(--spacing-large) + } +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: calc(var(--spacing-large) / 2) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; + + -webkit-tap-highlight-color: transparent; +} + +.tabs-overview button.tab-button .tab-title::before { + display: block; + content: attr(title); + font-weight: 600; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + font-weight: normal; + padding: calc(var(--spacing-large) / 2) var(--spacing-large); + border-radius: var(--border-radius-medium); + transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active .tab-title { + font-weight: 600; +} + +.tabs-overview button.tab-button::after { + content: ''; + display: block; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 0; + width: 0%; + margin: 0 auto; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); + transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button.active::after { + width: 100%; + box-sizing: border-box; + height: 3px; +} + + +/* + Navigation Buttons +*/ + +.section_buttons:not(:empty) { + margin-top: calc(var(--spacing-large) * 3); +} + +.section_buttons table.markdownTable { + display: block; + width: 100%; +} + +.section_buttons table.markdownTable tbody { + display: table !important; + width: 100%; + box-shadow: none; + border-spacing: 10px; +} + +.section_buttons table.markdownTable td { + padding: 0; +} + +.section_buttons table.markdownTable th { + display: none; +} + +.section_buttons table.markdownTable tr.markdownTableHead { + border: none; +} + +.section_buttons tr th, .section_buttons tr td { + background: none; + border: none; + padding: var(--spacing-large) 0 var(--spacing-small); +} + +.section_buttons a { + display: inline-block; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + color: var(--page-secondary-foreground-color) !important; + text-decoration: none; + transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out; +} + +.section_buttons a:hover { + color: var(--page-foreground-color) !important; + background-color: var(--odd-color); +} + +.section_buttons tr td.markdownTableBodyLeft a { + padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2); +} + +.section_buttons tr td.markdownTableBodyRight a { + padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); +} + +.section_buttons tr td.markdownTableBodyLeft a::before, +.section_buttons tr td.markdownTableBodyRight a::after { + color: var(--page-secondary-foreground-color) !important; + display: inline-block; + transition: color .08s ease-in-out, transform .09s ease-in-out; +} + +.section_buttons tr td.markdownTableBodyLeft a::before { + content: '〈'; + padding-right: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyRight a::after { + content: '〉'; + padding-left: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyLeft a:hover::before { + color: var(--page-foreground-color) !important; + transform: translateX(-3px); +} + +.section_buttons tr td.markdownTableBodyRight a:hover::after { + color: var(--page-foreground-color) !important; + transform: translateX(3px); +} + +@media screen and (max-width: 450px) { + .section_buttons a { + width: 100%; + box-sizing: border-box; + } + + .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a { + border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium); + border-right: none; + } + + .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a { + border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0; + } +} From 9494aff5f2e0c166fd5c0f7ce6ffad09c7b6cb44 Mon Sep 17 00:00:00 2001 From: Matt Ricci Date: Wed, 22 Jan 2025 02:00:07 +1100 Subject: [PATCH 6/6] Small adjustments to documentation generated by Doxygen --- Doxyfile | 2 +- README.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Doxyfile b/Doxyfile index 48388a0..1e60e4d 100755 --- a/Doxyfile +++ b/Doxyfile @@ -4,7 +4,7 @@ # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = Australis Avionics Firmware +PROJECT_NAME = Australis Firmware Reference PROJECT_NUMBER = PROJECT_BRIEF = PROJECT_LOGO = ./img/logo.svg diff --git a/README.md b/README.md index 39897de..b5e8ebc 100755 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + + # Australis Avionics Firmware ![](./img/banner.png)