www.freertos.org

Dependents:   mbed_freeRTOS_send

Fork of FreeRTOS by Rohit Grover

main.cpp

Committer:
ser1516
Date:
2016-05-18
Revision:
1:6db425da9b9e

File content as of revision 1:6db425da9b9e:

#include "mbed.h"


#include "C12832.h"
#include "LPC17xx.h"
#include "AnalogIn.h"
#include "FreeRTOS.h"
#include "task.h"
#include "LM75B.h"
#include "semphr.h"
#include "MMA7660.h"

#define LED1_GPIO  18
#define LED2_GPIO  20
#define LED3_GPIO  21
#define LED4_GPIO  23

#define LED_GPIO   LED1_GPIO


// LED Config
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

// CAN Config
CAN can(p9, p10);
char temp = 0;
typedef union can_union {
    float fl;
    char bytes[4];
} data2send;

// Accelerometer
MMA7660 MMA(p28, p27);
DigitalOut connectionLed(LED1);
//PwmOut Zaxis_p(LED2);
//PwmOut Zaxis_n(LED3);

// Temperature sensor config
LM75B tmp(p28,p27);

//LCD configs
C12832 lcd(p5, p7, p6, p8, p11);

// File System Config
//MSCFileSystem fs("fs");

// Potenciometer Config
AnalogIn pot1(p19);
float pot = 0;

// Queue
xQueueHandle MyQueue;

typedef enum {
    INT,
    FLOAT,
    CHAR
} DATA_TYPE;

typedef struct queueData {
    DATA_TYPE type;
    void* pointer;
    int id;
} queueData;


// Semaphores
xSemaphoreHandle xMutexLCD;
xSemaphoreHandle xMutexI2C;

void init_hardware()
{
    /* set system tick for 1ms interrupt */
    SystemCoreClockUpdate();
}

void blink_led1_task(void *pvParameters)
{
    while(1) {
        led1 = !led1;
        vTaskDelay(1000/portTICK_RATE_MS);
    }
}

/*
void blink_led2_task(void *pvParameters)
{
    while(1) {
        led2 = !led2;
        vTaskDelay(500/portTICK_RATE_MS);
    }
}
*/

void can_send(void *pvParameters)
{
    int err;
    data2send data;
    queueData msg;
    for(;;) {
        xQueueReceive(MyQueue,&msg,portMAX_DELAY);
        //ATENÇÃO:Na leitura dos sensores apenas enviar os dados quando houver uma variação significativa, e.g. a temp variar 1ºC

        if(msg.type==FLOAT || msg.type==INT) {
            data.fl=*(float *)msg.pointer;
            can.write(CANMessage(msg.id, &data.bytes[0], 5));
        } else if(msg.type==CHAR)
            can.write(CANMessage(msg.id, (char *)msg.pointer, 2));
        if(!err) {
            led4=1;//error led
            xSemaphoreTake(xMutexLCD,portMAX_DELAY);
            lcd.locate(1,1);    // row 1, col 1
            lcd.printf("Message sent: ERROR");
            xSemaphoreGive(xMutexLCD);
        }
        led2 = !led2;
        /* if(can.write(CANMessage(1337, &data.bytes[0], 5))) {
             xSemaphoreTake(xMutexLCD,portMAX_DELAY);
                 lcd.locate(1,1);    // row 1, col 1
                 lcd.printf("Message sent: %f\n", data.fl);
             xSemaphoreGive(xMutexLCD);
             led2 = !led2;
         } */
    }

}

/*
void can_recv(void *pvParameters){
    CANMessage msg;
    //lcd.cls();
    for(;;){
        if(can2.read(msg)) {
            xSemaphoreTake(xMutexLCD,portMAX_DELAY);
            lcd.locate(1,10);    // row 10, col 1
            lcd.printf("Message received: %d\n", msg.data[0]);
            xSemaphoreGive(xMutexLCD);
            led2 = !led2;
        }

        vTaskDelay(200/portTICK_RATE_MS);
    }

}
*/

void acc_read (void *pvParameters)
{
    float acc[3];
    queueData msg_acc;
    int aux[3];
    //if (MMA.testConnection())
    //    led3 = !led3;

    while(1) {

        xSemaphoreTake(xMutexI2C,portMAX_DELAY);
        MMA.readData(acc);
        xSemaphoreGive(xMutexI2C);

        aux[0]=acc[0];
        aux[1]=acc[1];
        aux[2]=acc[2];
        msg_acc.type=INT;
        msg_acc.id=1337;
        msg_acc.pointer=(void *)&aux[0];

        xQueueSend(MyQueue,&msg_acc,10);
        /*xSemaphoreTake(xMutexLCD,portMAX_DELAY);
            lcd.locate(1,18);    // row 18, col 1
            lcd.printf("X-Y-Z: %2.2f %2.2f %2.2f", acc[0], acc[1], acc[2]);
        xSemaphoreGive(xMutexLCD);*/
    }

}

void readPot(void *pvParameters)
{
    queueData msg_pot;
    float *aux;
    while(1) {
        msg_pot.type=FLOAT;
        msg_pot.id=1337;
        *aux=pot1.read()*10;
        msg_pot.pointer=(void *)aux;
        xQueueSend(MyQueue,&msg_pot,10);
        vTaskDelay(10/portTICK_RATE_MS);
    }
}


int main(void)
{
    xTaskHandle blink_led1_task_handle = NULL;
    xTaskHandle can_send_handle = NULL;
    xTaskHandle can_recv_handle = NULL;
    xTaskHandle acc_recv_handle = NULL;
    xTaskHandle readPot_handle = NULL;

    xMutexLCD = xSemaphoreCreateMutex();
    xMutexI2C = xSemaphoreCreateMutex();
    MyQueue = xQueueCreate( 20, sizeof(queueData) );
    if(MyQueue == NULL) led4=1;//error code


    can.frequency(1000000);

    int task_error;

    /* initialize hardware */
    init_hardware();

    // create task to heartbeat LED
    task_error = xTaskCreate(blink_led1_task, "heartbeat", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &blink_led1_task_handle);
    if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
        led4=1;
    }

    // create task to send through CAN
    task_error = xTaskCreate(can_send, "CAN Send", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, &can_send_handle);
    if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
        led4=1;
    }

    //create task to receive through CAN
    //xTaskCreate(can_recv, "CAN Recv", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, &can_recv_handle);

    //create task to read accelerometer
    task_error = xTaskCreate(acc_read, "ACC Read", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &acc_recv_handle);
    if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
        led4=1;
    }

    //create task to write value of pot to usb
    task_error = xTaskCreate(readPot, "Read Pot", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &readPot_handle);
    if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
        led4=1;
    }



    /* Start the scheduler. */
    vTaskStartScheduler();

    /* should never reach here! */
    for(;;);
}