Practical Robotics Modular Robot Library

Dependents:   ModularRobot

led.cpp

Committer:
jah128
Date:
2016-11-26
Revision:
1:a6728adaf7e7
Parent:
0:8a2dd255c508
Child:
3:8762f6b2ea8d

File content as of revision 1:a6728adaf7e7:

#include "robot.h"

// The LED driver is quite powerful in terms of how it can be used (LEDs can be grouped, have individual and group PWM control, can be blinked etc).
//
// To keep things relatively simple, in this version of the code, we will not use the groups or blinking functions, and will have all LEDs enabled.
//
// Their state is controlled solely by each LEDs PWM control - which is a 1 byte value between 0 (fully off) and 255 (fully on)

char red_led_states [8];
char green_led_states [8];

void Led::set_green_led (char led, char brightness)
{
    if(led < 8) {
        green_led_states [led] = brightness;
        char data[2];
        data[0] = 3 + led + led;
        data[1] = brightness;
        if(i2c_lock==0){
        i2c_lock = 1;
        primary_i2c.write(LED_ADDRESS,data,2);
        }i2c_lock = 0;
    }
}

void Led::set_red_led (char led, char brightness)
{
    
    if(led < 8) {
        red_led_states [led] = brightness;
        char data[2];
        data[0] = 2 + led + led;
        data[1] = brightness;
        if(i2c_lock==0){
        i2c_lock = 1;
        primary_i2c.write(LED_ADDRESS,data,2);  
        }i2c_lock = 0;
    }
}

int Led::reset_led_driver()
{
    // The TLC59116 has a software reset option over i2c:
    // The bytes A5h, 5Ah are sent to special address D6h
    char data[2];
    data[0] = 0xA5;
    data[1] = 0x5A;
    return primary_i2c.write(0xD6,data,2);
}

int Led::init_led_driver()
{
    // This code enables the LED outputs so all LEDs are on, and are set to work on individual PWM control
    //
    // First we write 0x80 to the Mode 1 register (0x00) to enable the oscillator and register auto-increment
    char data[2];
    data[0]=0x00;
    data[1]=0x80;
    int okay = primary_i2c.write(LED_ADDRESS,data,2,false);
    if(okay == 0) {
        // Now we turn all the LEDs the enable on PWM control
        data[0]=0x14;
        data[1]=0xAA;
        primary_i2c.write(LED_ADDRESS,data,2,false);
        data[0]=0x15;
        data[1]=0xAA;
        primary_i2c.write(LED_ADDRESS,data,2,false);
        data[0]=0x16;
        data[1]=0xAA;
        primary_i2c.write(LED_ADDRESS,data,2,false);
        data[0]=0x17;
        data[1]=0xAA;
        primary_i2c.write(LED_ADDRESS,data,2,false);
    }
    return okay;
}

int led_ticker_sub_state = 0;
char led_ticker_state = 0;
char increment = 1;
Ticker led_ticker;

void Led::start_test()
{
    led_ticker.attach(this,&Led::test_ticker_routine,0.02);
}

void Led::test_ticker_routine()
{
    led_ticker_sub_state += increment;
    increment += 1;
    if(led_ticker_sub_state > 250) {
        led_ticker_sub_state = 0;
             led_ticker_state ++;
        increment = 1;
        if (led_ticker_state == 24) led_ticker_state = 0;
    }
        char working_led = led_ticker_state % 8;

    if(led_ticker_state < 8 || led_ticker_state > 15) set_green_led(working_led, led_ticker_sub_state );
    else set_green_led(working_led, 0);
    if(led_ticker_state > 7) set_red_led(working_led, led_ticker_sub_state );
    else set_red_led(working_led, 0);
    if(led_ticker_sub_state == 0) {
   
    }
}