ok

Dependencies:   PinDetect TextLCD mbed

main.cpp

Committer:
reiniermarcel
Date:
2015-11-30
Revision:
0:2132d7ad612f

File content as of revision 0:2132d7ad612f:

/*

                                   mbed LPC1768
                               ___________________
                            1 |GND    |    |  VOUT|40
                            2 |VIN    |    |    VU|39
                            3 |VB     |____|   IF-|38
                            4 |nR              IF+|37
            SPI NRF24L01+   5 |MOSI        ETH RD-|36
            SPI NRF24L01+   6 |MISO        ETH RD+|35
            SPI NRF24L01+   7 |SCK         ETH TD-|34
      SPI (CSN) NRF24L01+   8 |            ETH TD+|33
      SPI (CE)  NRF24L01+   9 |TX/SDA       USB D-|32
      SPI (IRQ) NRF24L01+   10|RX/SCL       USB D+|31
                            11|MOSI        (CAN)RD|30   CAN bus
                            12|MISO        (CAN)TD|29   CAN bus
                            13|TX/SCK       SDA/TX|28   I2C 16x2 Display
                            14|RX           SCL/RX|27   I2C 16x2 Display
     Left indicator input   15|AI           PWMOUT|26
    Right indicator input   16|AI           PWMOUT|25
         Headlights input   17|AI           PWMOUT|24   Dashboard left indicator output
              Brake input   18|AI/AOUT      PWMOUT|23   Dashboard right indicator output
                            19|AI           PWMOUT|22   Dashboard headlights output
                            20|AI           PWMOUT|21   Dashboard warning output
                               -------------------
                           
*/

#define DEBUG       1           //1 = debugging via USB serial port, 0 = debugging off

#include "mbed.h"
#include "PinDetect.h"
#include "TextLCD.h"

//pinouts
PinDetect  PIN_LEFT_IN          (p15);
PinDetect  PIN_RIGHT_IN         (p16);
PinDetect  PIN_HEADLIGHTS_IN    (p17);
PinDetect  PIN_BRAKE_IN         (p18);
DigitalOut PIN_WARNING_OUT      (p21);
DigitalOut PIN_HEADLIGHTS_OUT   (p22);
DigitalOut PIN_RIGHT_OUT        (p23);
DigitalOut PIN_LEFT_OUT         (p24);
DigitalOut LED_1                (LED1);     //onboard
DigitalOut LED_2                (LED2);     //onboard
DigitalOut LED_3                (LED3);     //onboard
DigitalOut LED_4                (LED4);     //onboard

//Setup serial pins for debugging
Serial pc(USBTX, USBRX);

//Setup I2C pins for 16x2 display
I2C i2c_lcd(p28,p27);            //SDA, SCL
TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2);                  // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type

//Setup CAN busses 1 en 2
CAN CAN1(p9, p10);
CAN CAN2(p30, p29);
char CANcounter = 'a';
Ticker CANticker;

//Setup tickers for blinking the indicator and warning lights on the dashboard
Ticker ticker_left;
Ticker ticker_right;
Ticker ticker_warning;

void CANsend()           //Sends a message from CAN1
{
    pc.printf("send()\n");
    CANMessage CANmsgTX(CANMessage(887, &CANcounter, 1));
    if(CAN1.write(CANmsgTX))
    {
        CANcounter++;
        pc.printf("MESSAGE SENT: %d, %d\n", CANcounter, CANmsgTX.data[0]);
        LED_1 = !LED_1;
    } 
    else
    {
        pc.printf("Failed to send the message\n");
    }
}

void toggle_left() { PIN_LEFT_OUT = !PIN_LEFT_OUT; }
void toggle_right() { PIN_RIGHT_OUT = !PIN_RIGHT_OUT; }
void toggle_warning() { PIN_WARNING_OUT = !PIN_WARNING_OUT; }

void start_left()

{
    PIN_LEFT_OUT = 1;
    ticker_left.attach(&toggle_left, 0.5);
    //SEND CAN TO LEFT_FRONT_MODULE AND BACK_MODULE
    if(DEBUG) pc.printf("Left on\n");
}

void stop_left()
{
    ticker_left.detach();
    PIN_LEFT_OUT = 0;
    //SEND CAN TO LEFT_FRONT_MODULE AND BACK_MODULE
    if(DEBUG) pc.printf("Left off\n");
}

void start_right()
{
    PIN_RIGHT_OUT = 1;
    ticker_right.attach(&toggle_right, 0.5);
    //SEND CAN TO RIGHT_FRONT_MODULE AND BACK_MODULE
    if(DEBUG) pc.printf("Right on\n");
}

void stop_right()
{
    ticker_right.detach();
    PIN_RIGHT_OUT = 0;
    //SEND CAN TO RIGHT_FRONT_MODULE AND BACK_MODULE
    if(DEBUG) pc.printf("Right off\n");
}

void start_headlights()
{
    PIN_HEADLIGHTS_OUT = 1;
    //SEND CAN TO LEFT_FRONT_MODULE AND RIGHT_FRONT_MODULE
    if(DEBUG) pc.printf("Headlights on\n");
}

void stop_headlights()
{
    PIN_HEADLIGHTS_OUT = 0;
    //SEND CAN TO LEFT_FRONT_MODULE AND RIGHT_FRONT_MODULE
    if(DEBUG) pc.printf("Headlights off\n");
}

void start_brake()
{
    PIN_WARNING_OUT = 1;
    ticker_warning.attach(&toggle_warning, 0.2);
    //SEND CAN TO BACK_MODULE
    if(DEBUG) pc.printf("Brake start\n");
}

void stop_brake()
{
    ticker_warning.detach();
    PIN_WARNING_OUT = 0;
    //SEND CAN TO BACK_MODULE
    if(DEBUG) pc.printf("Brake stop\n");
}

int main()
{
        if(DEBUG) pc.baud(230400);      //default 9600, but we want it to be as fast as possible
        if(DEBUG) pc.printf("BRW Urban Features Controller\n\n");
        if(DEBUG) pc.printf("Setting up...\n");

    //setup PinDetect; input interrupts with built-in debounce (important!)
    PIN_LEFT_IN.attach_asserted             (&start_left);              //press
    PIN_LEFT_IN.attach_deasserted           (&stop_left);               //release
    PIN_LEFT_IN.setSampleFrequency          ();                         //defaults to 20ms.
    PIN_RIGHT_IN.attach_asserted            (&start_right);
    PIN_RIGHT_IN.attach_deasserted          (&stop_right);
    PIN_RIGHT_IN.setSampleFrequency         ();
    PIN_HEADLIGHTS_IN.attach_asserted       (&start_headlights);
    PIN_HEADLIGHTS_IN.attach_deasserted     (&stop_headlights);
    PIN_HEADLIGHTS_IN.setSampleFrequency    ();
    PIN_BRAKE_IN.attach_asserted            (&start_brake);
    PIN_BRAKE_IN.attach_deasserted          (&stop_brake);
    PIN_BRAKE_IN.setSampleFrequency         ();
        if(DEBUG) pc.printf("Pin interrupts set\n");
    
    //setup 16x2 display
    lcd.setCursor(TextLCD::CurOff_BlkOff);      //cursor off, blinking off
    lcd.cls();                                  //clear screen
        if(DEBUG) pc.printf("Display initialized\n");
    
    //setup CAN bus
    CAN1.frequency(615000);
    CAN2.frequency(615000);
    CANticker.attach(&CANsend, 1);        //Calls the function CANsend() every second
    CANMessage CANmsgRX;
    
        if(DEBUG) pc.printf("Setup complete.\n\n");
    
    pc.printf("main()\n");
    
    while(1) {                     //Constantly check for a Rx'ed message on CAN2, and notify if there is one
        //pc.printf("loop()\n");
        //pc.printf("RXed MSG:%d\n", can2.read(msg1));
        if(CAN2.read(CANmsgRX)) {
            char ch = CANmsgRX.data[0];
            lcd.locate(0,0);
            lcd.printf("Message received: ");
            lcd.putc(ch);
            LED_2 = !LED_2;
            wait(0.5);
            lcd.cls();
        } 
    }
}