mirror of https://github.com/ArduPilot/ardupilot
128 lines
3.2 KiB
C++
128 lines
3.2 KiB
C++
#include <AP_HAL/AP_HAL_Boards.h>
|
|
|
|
/*
|
|
|
|
./Tools/autotest/sim_vehicle.py -v ArduCopter --gdb --debug --rgbled
|
|
|
|
param set NTF_LED_TYPES 8198 # enable ToshibaLED and LP5562
|
|
reboot
|
|
|
|
param set NTF_LED_OVERRIDE 1
|
|
led 255 0 0 # red
|
|
led 0 255 0 # green
|
|
led 0 0 255 # blue
|
|
|
|
*/
|
|
|
|
|
|
#ifndef AP_SIM_LP5562_ENABLED
|
|
#define AP_SIM_LP5562_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL)
|
|
#endif
|
|
|
|
#if AP_SIM_LP5562_ENABLED
|
|
|
|
#include "SIM_I2CDevice.h"
|
|
#include "SIM_RGBLED.h"
|
|
|
|
namespace SITL {
|
|
|
|
class LP5562DevReg : public I2CRegEnum {
|
|
public:
|
|
static constexpr uint8_t ENABLE = 0x00;
|
|
static constexpr uint8_t OP_MODE = 0x01;
|
|
|
|
static constexpr uint8_t B_PWM = 0x02;
|
|
static constexpr uint8_t G_PWM = 0x03;
|
|
static constexpr uint8_t R_PWM = 0x04;
|
|
|
|
static constexpr uint8_t B_CURRENT = 0x05;
|
|
static constexpr uint8_t G_CURRENT = 0x06;
|
|
static constexpr uint8_t R_CURRENT = 0x07;
|
|
|
|
static constexpr uint8_t CONFIG = 0x08;
|
|
|
|
static constexpr uint8_t ENG1_PC = 0x09;
|
|
static constexpr uint8_t ENG2_PC = 0x0A;
|
|
static constexpr uint8_t ENG3_PC = 0x0B;
|
|
|
|
static constexpr uint8_t STATUS = 0x0C;
|
|
|
|
static constexpr uint8_t RESET = 0x0D;
|
|
|
|
static constexpr uint8_t W_PWM = 0x0E;
|
|
static constexpr uint8_t W_CURRENT = 0x0F;
|
|
|
|
static constexpr uint8_t LED_MAP = 0x70;
|
|
|
|
static constexpr uint8_t PROG_MEM_ENG1_01H = 0x10;
|
|
static constexpr uint8_t PROG_MEM_ENG1_01L = 0x11;
|
|
static constexpr uint8_t PROG_MEM_ENG1_02H = 0x12;
|
|
static constexpr uint8_t PROG_MEM_ENG1_02L = 0x13;
|
|
// .
|
|
// .
|
|
static constexpr uint8_t PROG_MEM_ENG1_16H = 0x2E;
|
|
static constexpr uint8_t PROG_MEM_ENG1_16L = 0x2F;
|
|
|
|
static constexpr uint8_t PROG_MEM_ENG2_01H = 0x30;
|
|
static constexpr uint8_t PROG_MEM_ENG2_01L = 0x31;
|
|
static constexpr uint8_t PROG_MEM_ENG2_02H = 0x32;
|
|
static constexpr uint8_t PROG_MEM_ENG2_02L = 0x43;
|
|
// .
|
|
// .
|
|
static constexpr uint8_t PROG_MEM_ENG2_16H = 0x4E;
|
|
static constexpr uint8_t PROG_MEM_ENG2_16L = 0x4F;
|
|
|
|
static constexpr uint8_t PROG_MEM_ENG3_01H = 0x50;
|
|
static constexpr uint8_t PROG_MEM_ENG3_01L = 0x51;
|
|
static constexpr uint8_t PROG_MEM_ENG3_02H = 0x52;
|
|
static constexpr uint8_t PROG_MEM_ENG3_02L = 0x53;
|
|
// .
|
|
// .
|
|
static constexpr uint8_t PROG_MEM_ENG3_16H = 0x6E;
|
|
static constexpr uint8_t PROG_MEM_ENG3_16L = 0x6F;
|
|
};
|
|
|
|
class LP5562 : public I2CDevice, protected I2CRegisters_8Bit
|
|
{
|
|
public:
|
|
|
|
void init() override;
|
|
|
|
void update(const class Aircraft &aircraft) override;
|
|
|
|
int rdwr(I2C::i2c_rdwr_ioctl_data *&data) override {
|
|
return I2CRegisters_8Bit::rdwr(data);
|
|
}
|
|
|
|
private:
|
|
|
|
// nested class to hold calculations for a single channel:
|
|
class LEDChannel {
|
|
public:
|
|
LEDChannel(uint8_t &_direct_pwm_value) :
|
|
direct_pwm_value{_direct_pwm_value}
|
|
{ }
|
|
|
|
void update();
|
|
|
|
// returns a value 0-255 for LED brightness:
|
|
uint8_t current_value() const { return direct_pwm_value; }
|
|
|
|
private:
|
|
uint8_t &direct_pwm_value;
|
|
};
|
|
|
|
// these could come in as rgb or bgr?
|
|
LEDChannel *b;
|
|
LEDChannel *g;
|
|
LEDChannel *r;
|
|
|
|
void reset_registers();
|
|
|
|
SIM_RGBLED rgbled{"LP5562"};
|
|
};
|
|
|
|
} // namespace SITL
|
|
|
|
#endif // AP_SIM_LP5562_ENABLED
|