CAN library containing a CAN controller object handling a FIFO, and CAN peripherals attached to it.

Revision:
0:ebe6f5e97160
Child:
1:b69d05604535
diff -r 000000000000 -r ebe6f5e97160 ControllerCAN.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ControllerCAN.cpp	Sat Feb 06 14:10:54 2016 +0000
@@ -0,0 +1,117 @@
+#include "mbed.h"
+#include "ControllerCAN.h"
+
+ControllerCAN::ControllerCAN() : can(p30, p29) {
+    can.frequency(250000);              // Baud rate : kbits/s
+    can.attach(this, &ControllerCAN::can_ISR_Reader);        // Fonction d'interruption CAN
+    FIFO_ecriture = 0;
+    FIFO_lecture = 0;
+    FIFO_occupation = 0;
+    FIFO_max_occupation = 0;
+}
+
+ControllerCAN::~ControllerCAN(){
+}
+
+void ControllerCAN::attach(PeripherialCAN* peripherial){
+    peripherials.push_back(peripherial);
+}
+
+long ControllerCAN::writeData(long Id, const char *data, char len){
+    CANMessage msg(Id, data, len);
+    return (can.write(msg));
+}
+
+long ControllerCAN::writeRemote(long Id){
+    CANMessage msg(Id);
+    return (can.write(msg));
+}
+
+char ControllerCAN::FIFOread(void){
+    FIFO_occupation=FIFO_ecriture-FIFO_lecture;
+    if(FIFO_occupation<0)
+        FIFO_occupation=FIFO_occupation+SIZE_FIFO;  
+    if(FIFO_max_occupation<FIFO_occupation)
+        FIFO_max_occupation=FIFO_occupation;
+    if(FIFO_occupation>SIZE_FIFO)
+        {}//while(!can.write(CANMessage(LCD_OVERFLOW,CANStandard)));
+    if(FIFO_occupation!=0)
+    {
+        /*if(can_MsgRx[FIFO_lecture].id == Id)
+        {                    
+            //data = can_MsgRx[FIFO_lecture].data;
+            msg = can_MsgRx[FIFO_lecture];
+            FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
+            return 1;
+        }
+        return 0;*/
+        char res = 0;
+        for (int i = 0; i < peripherials.size(); i++){
+            vector<unsigned short*> IdsRead = peripherials[i]->getIdsRead();
+            for (int j = 0; j < IdsRead.size() ; j++){
+                if (can_MsgRx[FIFO_lecture].id == *(IdsRead[j])){
+                    peripherials[i]->update(*(IdsRead[j]), can_MsgRx[FIFO_lecture]);
+                    res = 1;
+                    break;
+                }
+            }
+            if(res) break;
+        }
+        FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
+        return 1;
+    }
+    return -1;
+}
+
+/*void ControllerCAN::FIFO_remove_msg(void){
+    FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
+}*/
+
+void ControllerCAN::can_ISR_Reader(void){
+    if (can.read(can_MsgRx[FIFO_ecriture]))
+    {
+      // FIFO gestion
+       FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
+    }
+}
+
+/**void ControllerCAN::CAN_automate_reception(void){
+  
+    static signed char FIFO_lecture=0,FIFO_occupation=0,FIFO_max_occupation=0;
+    FIFO_occupation=FIFO_ecriture-FIFO_lecture;
+    if(FIFO_occupation<0)
+        FIFO_occupation=FIFO_occupation+SIZE_FIFO;  
+    if(FIFO_max_occupation<FIFO_occupation)
+        FIFO_max_occupation=FIFO_occupation;
+    if(FIFO_occupation>SIZE_FIFO)
+        //while(!can.write(CANMessage(LCD_OVERFLOW,CANStandard)));
+    if(FIFO_occupation!=0)
+    {
+        switch(can_MsgRx[FIFO_lecture].id)
+        {                    
+            case MOT_G_DAT_1 :
+                MOT_G_vit=(short)(can_MsgRx[FIFO_lecture].data[1]*256)+can_MsgRx[FIFO_lecture].data[0];
+                MOT_G_i=(short)(can_MsgRx[FIFO_lecture].data[3]*256)+can_MsgRx[FIFO_lecture].data[2];
+                MOT_G_pos=( short)(can_MsgRx[FIFO_lecture].data[5]*256)+can_MsgRx[FIFO_lecture].data[4];
+                break;
+            case MOT_G_DAT_2 : 
+                MOT_G_voltage=(unsigned short)(can_MsgRx[FIFO_lecture].data[3]*256)+can_MsgRx[FIFO_lecture].data[2];
+                MOT_G_temp1=( short)(can_MsgRx[FIFO_lecture].data[5]*256)+can_MsgRx[FIFO_lecture].data[4];
+                MOT_G_temp2=( short)(can_MsgRx[FIFO_lecture].data[7]*256)+can_MsgRx[FIFO_lecture].data[6];
+                break;
+            case MOT_D_DAT_1 :
+                MOT_D_vit=(short)(can_MsgRx[FIFO_lecture].data[1]*256)+can_MsgRx[FIFO_lecture].data[0];
+                MOT_D_i=(short)(can_MsgRx[FIFO_lecture].data[3]*256)+can_MsgRx[FIFO_lecture].data[2];
+                MOT_D_pos=( short)(can_MsgRx[FIFO_lecture].data[5]*256)+can_MsgRx[FIFO_lecture].data[4];
+                break;
+            case MOT_D_DAT_2 : 
+                MOT_D_voltage=(unsigned short)(can_MsgRx[FIFO_lecture].data[3]*256)+can_MsgRx[FIFO_lecture].data[2];
+                MOT_D_temp1=( short)(can_MsgRx[FIFO_lecture].data[5]*256)+can_MsgRx[FIFO_lecture].data[4];
+                MOT_D_temp2=( short)(can_MsgRx[FIFO_lecture].data[7]*256)+can_MsgRx[FIFO_lecture].data[6];
+                break;
+            default:
+                break;              
+        }
+    FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
+    }
+}**/
\ No newline at end of file