crashtest-r0ket/firmware/flame/flame.c

93 lines
2.9 KiB
C

#include "flame/flame.h"
#include "basic/basic.h"
#include "core/i2c/i2c.h"
uint8_t flamesClaimed = FLAME_TYPE_NONE;
uint8_t flameBrigthnessRGB = 0;
uint8_t flameBrigthnessM0n0 = 0;
uint8_t rgb[3];
uint32_t flameSetI2C(uint8_t addr, uint8_t cr, uint8_t value) {
I2CMasterBuffer[0] = addr;
I2CMasterBuffer[1] = cr;
I2CMasterBuffer[2] = value;
I2CWriteLength = 3;
I2CReadLength = 0;
return i2cEngine();
}
uint8_t flameDetect() {
i2cInit(I2CMASTER); // Init I2C
uint8_t found = FLAME_TYPE_NONE;
if (flameSetI2C(FLAME_RGB_I2C_WRITE, FLAME_RGB_I2C_CR_MODE1, 0x00) == I2CSTATE_ACK) {
found |= FLAME_TYPE_RGB;
}
if (flameSetI2C(FLAME_M0N0_I2C_WRITE, FLAME_M0N0_I2C_CR_LS0, FLAME_M0N0_I2C_LS0_OFF << FLAME_M0N0_I2C_LS0_LED0) == I2CSTATE_ACK) {
found |= FLAME_TYPE_M0N0;
}
return found;
}
void flameInit(uint8_t type) {
if (type & FLAME_TYPE_M0N0) {
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_LS0, FLAME_M0N0_I2C_LS0_OFF << FLAME_M0N0_I2C_LS0_LED0); // set led0 off
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_LS0, FLAME_M0N0_I2C_LS0_OFF << FLAME_M0N0_I2C_LS0_LED1); // set led1 off
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_LS0, FLAME_M0N0_I2C_LS0_OFF << FLAME_M0N0_I2C_LS0_LED2); // set led2 off
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_LS0, FLAME_M0N0_I2C_LS0_OFF << FLAME_M0N0_I2C_LS0_LED3); // set led3 off
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_PSC0, 0x00); // set prescaler
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_PWM0, 0x00); // set pwm
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_LS0, FLAME_M0N0_I2C_LS0_PWM0 << FLAME_M0N0_I2C_LS0_LED0); // set led0 to pwm
}
if (type & FLAME_TYPE_RGB) {
// enable individual PWN and group PWN for LED0, LED3 and LED2 and disable LED1
flameSetI2Crgb(FLAME_RGB_I2C_CR_LEDOUT, FLAME_RGB_I2C_LED0_GRP | FLAME_RGB_I2C_LED1_OFF | FLAME_RGB_I2C_LED2_GRP | FLAME_RGB_I2C_LED3_GRP);
flameSetI2Crgb(FLAME_RGB_I2C_CR_GRPPWM, 0x00); // overall dimming
}
}
void _setFlamePWMrgb() {
flameSetI2Crgb(FLAME_RGB_I2C_CR_GRPPWM, flameBrigthnessRGB);
}
void _setFlamePWMm0n0() {
flameSetI2Cm0n0(FLAME_M0N0_I2C_CR_PWM0, flameBrigthnessM0n0);
}
void flameSetBrightness(uint8_t type, uint8_t bright) {
if (type & FLAME_TYPE_M0N0) {
flameBrigthnessM0n0 = bright;
push_queue(&_setFlamePWMm0n0);
}
if (type & FLAME_TYPE_RGB) {
flameBrigthnessRGB = bright;
push_queue(&_setFlamePWMrgb);
}
}
void _setFlameColor() {
flameSetI2Crgb(FLAME_RGB_I2C_CR_PWM0, rgb[0]);
flameSetI2Crgb(FLAME_RGB_I2C_CR_PWM3, rgb[1]);
flameSetI2Crgb(FLAME_RGB_I2C_CR_PWM2, rgb[2]);
}
void flameSetColor(uint8_t type, uint8_t red, uint8_t green, uint8_t blue) {
if (type & FLAME_TYPE_RGB) {
rgb[0] = red;
rgb[1] = green;
rgb[2] = blue;
push_queue(&_setFlameColor);
}
}
void flameClaim(uint8_t type) {
flamesClaimed |= type;
}
void flameFree(uint8_t type) {
flamesClaimed &= ~type;
}