Line data Source code
1 : #include "SIM_config.h" 2 : 3 : #if AP_SIM_IS31FL3195_ENABLED 4 : 5 : #include "SIM_IS31FL3195.h" 6 : 7 : using namespace SITL; 8 : 9 : #include <stdio.h> 10 : 11 2094 : void IS31FL3195::init() 12 : { 13 2094 : add_register("PRODUCT_ID", IS31FL3195DevReg::PRODUCT_ID, I2CRegisters::RegMode::RDONLY); 14 2094 : add_register("SHUTDOWN_CONTROL", IS31FL3195DevReg::SHUTDOWN_CONTROL, I2CRegisters::RegMode::RDWR); 15 : 16 2094 : add_register("P1_STATE", IS31FL3195DevReg::P1_STATE, I2CRegisters::RegMode::RDONLY); 17 2094 : add_register("P2_STATE", IS31FL3195DevReg::P2_STATE, I2CRegisters::RegMode::RDWR); 18 2094 : add_register("P3_STATE", IS31FL3195DevReg::P3_STATE, I2CRegisters::RegMode::RDWR); 19 2094 : add_register("P4_STATE", IS31FL3195DevReg::P4_STATE, I2CRegisters::RegMode::RDWR); 20 2094 : add_register("COLOUR_UPDATE", IS31FL3195DevReg::COLOUR_UPDATE, I2CRegisters::RegMode::WRONLY); 21 : 22 2094 : add_register("OUT1", IS31FL3195DevReg::OUT1, I2CRegisters::RegMode::WRONLY); 23 2094 : add_register("OUT2", IS31FL3195DevReg::OUT2, I2CRegisters::RegMode::WRONLY); 24 2094 : add_register("OUT3", IS31FL3195DevReg::OUT3, I2CRegisters::RegMode::WRONLY); 25 2094 : add_register("OUT4", IS31FL3195DevReg::OUT4, I2CRegisters::RegMode::WRONLY); 26 : 27 2094 : add_register("RESET_REGISTER", IS31FL3195DevReg::RESET_REGISTER, I2CRegisters::RegMode::WRONLY); 28 : 29 : // set_register(IS31FL3195DevReg::GENERAL_PURPOSE, 0b00000000); 30 : 31 2094 : reset_registers(); 32 : 33 2094 : rgbled.init(); 34 2094 : } 35 : 36 1460084 : void IS31FL3195::rdwr_store_register_value(uint8_t reg, uint8_t value) 37 : { 38 1460084 : if (reg == IS31FL3195DevReg::COLOUR_UPDATE && value == 0xc5) { 39 363974 : colour_update_register_poked = true; 40 : } 41 1460084 : I2CRegisters_8Bit::rdwr_store_register_value(reg, value); 42 1460084 : } 43 : 44 1464272 : int IS31FL3195::rdwr(I2C::i2c_rdwr_ioctl_data *&data) { 45 1464272 : return I2CRegisters_8Bit::rdwr(data); 46 : } 47 : 48 2094 : void IS31FL3195::set_product_id(uint8_t product_id) 49 : { 50 2094 : set_register(IS31FL3195DevReg::PRODUCT_ID, uint8_t(product_id << 1U)); 51 2094 : } 52 : 53 : 54 4103 : void IS31FL3195::reset_registers() 55 : { 56 : // see page 11 of datasheet for reset states 57 4103 : set_register(IS31FL3195DevReg::SHUTDOWN_CONTROL, (uint8_t)0b11110000); 58 : 59 4103 : set_register(IS31FL3195DevReg::P1_STATE, (uint8_t)0); 60 4103 : set_register(IS31FL3195DevReg::P2_STATE, (uint8_t)0); 61 4103 : set_register(IS31FL3195DevReg::P3_STATE, (uint8_t)0); 62 4103 : set_register(IS31FL3195DevReg::P4_STATE, (uint8_t)0); 63 : 64 4103 : set_register(IS31FL3195DevReg::OUT1, (uint8_t)0); 65 4103 : set_register(IS31FL3195DevReg::OUT2, (uint8_t)0); 66 4103 : set_register(IS31FL3195DevReg::OUT3, (uint8_t)0); 67 4103 : set_register(IS31FL3195DevReg::OUT4, (uint8_t)0); 68 : 69 4103 : set_register(IS31FL3195DevReg::RESET_REGISTER, (uint8_t)0); 70 4103 : } 71 : 72 178759942 : void IS31FL3195::update(const class Aircraft &aircraft) 73 : { 74 178759942 : if (get_register(IS31FL3195DevReg::RESET_REGISTER) == 0xC5) { 75 2009 : reset_registers(); 76 : } 77 178759942 : if (get_register(IS31FL3195DevReg::SHUTDOWN_CONTROL) == 0xf0) { 78 : // in shutdown 79 206108 : return; 80 : } 81 : 82 178553834 : if (!colour_update_register_poked) { 83 178232333 : return; 84 : } 85 321501 : colour_update_register_poked = false; 86 : 87 321501 : const uint8_t red = get_register(IS31FL3195DevReg::OUT1); 88 321501 : const uint8_t green = get_register(IS31FL3195DevReg::OUT2); 89 321501 : const uint8_t blue = get_register(IS31FL3195DevReg::OUT3); 90 : 91 321501 : rgbled.set_colours(red, green, blue); 92 : } 93 : 94 : #endif