ECE 4180 Lab 1

Dependencies:   MCP23S17 ShiftBrite mbed-rtos mbed

main.cpp

Committer:
aswild
Date:
2014-01-30
Revision:
1:0d16f1e4f642
Parent:
0:d5e1eec2689a

File content as of revision 1:0d16f1e4f642:

/*
 * Allen Wild
 * Joseph Guinta
 *
 * ECE 4180 Lab 1
 */

#include "mbed.h"
#include "rtos.h"
#include "MCP23S17.h"
#include "ShiftBrite.h"

#define PB0_PIN p20
#define LED_PIN p29
#define PWM_PIN p21
#define EX_CS_PIN p18

void updateSBColor(void const *args);

DigitalIn pb1(PB0_PIN);
DigitalOut led(LED_PIN);
PwmOut pwm(PWM_PIN);

SPI ex_spi(p11, p12, p13);
MCP23S17 ex(ex_spi, EX_CS_PIN, 0x40);

// flags set when reading/writing the SPI extender,
// helpful for knowing what's happening in the logic analyzer
DigitalOut ex_read(p24);
DigitalOut ex_write(p23);

ShiftBrite sb(p5, p6, p7, p8);
const int sbcolors[] = {0xff0000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0xff00ff};
int sbci = 0;

// brightness of PWM output
float bright = 0.0f;
bool pb1p = false;

int main()
{
    // set extender as inputs, configure internal pullups
    ex.direction(PORT_A, 0xFF);
    ex.configurePullUps(PORT_A, 0x90);
    // port B as outputs (for LED)
    ex.direction(PORT_B, 0x00);
    
    ex_read = 0;
    ex_write = 0;

    sb.writeInit(32, 0, 0);
    sb.fadeColor(0, 0xff0000, 0.5);
    
    // set PWM to 100Hz
    pwm.period_ms(10);

    // oh no, I'm multithreading this
    // god help us all...
    Thread sbThread(updateSBColor);

    while (true)
    {
        // read button and turn on LED if pressed
        pb1p = !pb1;
        led = pb1p;
        if (pb1p)
            sbThread.signal_set(0x1);
        while (!pb1);

        // use pushbuttons on extender to control PWM brightness
        // invert because active-low switches
        ex_read = 1;
        char edata = ~(ex.read(PORT_A));
        ex_read = 0;

        // if either button pressed, turn on ex LED
        if (edata & 0x90)
        {
            ex_write = 1; // note: debugging signal only
            ex.write(PORT_B, 1);
            ex_write = 0;
        }
        else
        {
            ex_write = 1;
            ex.write(PORT_B, 0);
            ex_write = 0;
        }

        // if button 1 and below max brightness, increment by 1%
        if ((edata&0x80) && bright < 1.0)
            bright += 0.01;
        // likewise for button 2 to decrement
        if ((edata&0x10) && bright > 0)
            bright -= 0.01;
        pwm = bright;

        Thread::wait(10);
    }
}

// SB color fading happens in a different thread
void updateSBColor(void const *args)
{
    while (true)
    {
        //Thread::wait(100);
        Thread::signal_wait(0x1);
        sb.fadeColor(sbcolors[(sbci != 0) ? sbci-1 : 5], sbcolors[sbci], 0.5);
        if (++sbci > 5)
            sbci = 0;
    }
}