Thomas Lew / Mbed 2 deprecated FreeFlyerROS

Dependencies:   mbed ros_lib_kinetic

Committer:
thomasjlew
Date:
Tue Mar 02 22:49:24 2021 +0000
Revision:
7:794bd40830c1
Parent:
1:40bdbe1a93b7
Embedded code for RSS 2021 Safe Active Learning submission - increased control frequency / reduced PWM duty cycle.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Knillinux 1:40bdbe1a93b7 1
Knillinux 1:40bdbe1a93b7 2 #include "PCA9634.h"
Knillinux 1:40bdbe1a93b7 3
Knillinux 1:40bdbe1a93b7 4 PCA9634::PCA9634(I2C *i2c, DigitalOut *inv_out_en, int addr)
Knillinux 1:40bdbe1a93b7 5 : i2c_(i2c), inv_out_en_(inv_out_en), addr_(addr) {
Knillinux 1:40bdbe1a93b7 6 *inv_out_en_ = 0;
Knillinux 1:40bdbe1a93b7 7
Knillinux 1:40bdbe1a93b7 8 // Set Mode 1: Auto-increment on, oscillator on, do not respond to all-call
Knillinux 1:40bdbe1a93b7 9 writeReg(PCA9634_REG_MODE1, 0x80);
Knillinux 1:40bdbe1a93b7 10 // Set Mode 2: Don't invert logic, outputs change on ACK, LED outputs configured
Knillinux 1:40bdbe1a93b7 11 // in open-drain structure
Knillinux 1:40bdbe1a93b7 12 writeReg(PCA9634_REG_MODE2, 0x09);
Knillinux 1:40bdbe1a93b7 13 dimLEDs();
Knillinux 1:40bdbe1a93b7 14 // Set all LED driver output states to PWM
Knillinux 1:40bdbe1a93b7 15 led_out_state_[0] = PCA9634_ALL_LED_TO_PWM;
Knillinux 1:40bdbe1a93b7 16 led_out_state_[1] = PCA9634_ALL_LED_TO_PWM;
Knillinux 1:40bdbe1a93b7 17
Knillinux 1:40bdbe1a93b7 18 commandLEDOutState();
Knillinux 1:40bdbe1a93b7 19 }
Knillinux 1:40bdbe1a93b7 20
Knillinux 1:40bdbe1a93b7 21 void PCA9634::dimLEDs() {
Knillinux 1:40bdbe1a93b7 22 for (char reg = PCA_LED0; reg <= PCA_LED7; reg++)
Knillinux 1:40bdbe1a93b7 23 writeReg(reg, 0);
Knillinux 1:40bdbe1a93b7 24 }
Knillinux 1:40bdbe1a93b7 25
Knillinux 1:40bdbe1a93b7 26 void PCA9634::disableLED(ledID led) {
Knillinux 1:40bdbe1a93b7 27 // Set correct registers to 00
Knillinux 1:40bdbe1a93b7 28 if (led < LED4) {
Knillinux 1:40bdbe1a93b7 29 led_out_state_[0] &= ~(1UL << (2*(led-2)));
Knillinux 1:40bdbe1a93b7 30 led_out_state_[0] &= ~(1UL << (2*(led-2)+1));
Knillinux 1:40bdbe1a93b7 31 } else {
Knillinux 1:40bdbe1a93b7 32 led_out_state_[1] &= ~(1UL << (2*(led-6)));
Knillinux 1:40bdbe1a93b7 33 led_out_state_[1] &= ~(1UL << (2*(led-6)+1));
Knillinux 1:40bdbe1a93b7 34 }
Knillinux 1:40bdbe1a93b7 35 commandLEDOutState();
Knillinux 1:40bdbe1a93b7 36 }
Knillinux 1:40bdbe1a93b7 37
Knillinux 1:40bdbe1a93b7 38 void PCA9634::enableLED(ledID led) {
Knillinux 1:40bdbe1a93b7 39 // Set correct registers to 01
Knillinux 1:40bdbe1a93b7 40 if (led < LED4) {
Knillinux 1:40bdbe1a93b7 41 led_out_state_[0] |= (1UL << (2*(led-2)));
Knillinux 1:40bdbe1a93b7 42 led_out_state_[0] &= ~(1UL << (2*(led-2)+1));
Knillinux 1:40bdbe1a93b7 43 } else {
Knillinux 1:40bdbe1a93b7 44 led_out_state_[1] |= (1UL << (2*(led-6)));
Knillinux 1:40bdbe1a93b7 45 led_out_state_[1] &= ~(1UL << (2*(led-6)+1));
Knillinux 1:40bdbe1a93b7 46 }
Knillinux 1:40bdbe1a93b7 47 commandLEDOutState();
Knillinux 1:40bdbe1a93b7 48 }
Knillinux 1:40bdbe1a93b7 49
Knillinux 1:40bdbe1a93b7 50 void PCA9634::commandLEDOutState() {
Knillinux 1:40bdbe1a93b7 51 writeReg(PCA9634_REG_LEDOUT0, led_out_state_[0]);
Knillinux 1:40bdbe1a93b7 52 writeReg(PCA9634_REG_LEDOUT1, led_out_state_[1]);
Knillinux 1:40bdbe1a93b7 53 }
Knillinux 1:40bdbe1a93b7 54
Knillinux 1:40bdbe1a93b7 55 void PCA9634::commandLEDBrightness(ledID led, int brightness) {
Knillinux 1:40bdbe1a93b7 56 writeReg(led, (char) brightness);
Knillinux 1:40bdbe1a93b7 57 }
Knillinux 1:40bdbe1a93b7 58
Knillinux 1:40bdbe1a93b7 59 int PCA9634::writeReg(char reg, char value) {
Knillinux 1:40bdbe1a93b7 60 char cmd[2];
Knillinux 1:40bdbe1a93b7 61 cmd[0] = reg;
Knillinux 1:40bdbe1a93b7 62 cmd[1] = value;
Knillinux 1:40bdbe1a93b7 63 return i2c_->write(addr_, cmd, 2);
Knillinux 1:40bdbe1a93b7 64 }