TLMoto

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

Revision:
10:66da8731bdb6
Parent:
7:2dce8ed51091
Child:
11:07d927da1a94
--- a/main.cpp	Wed Dec 23 10:38:02 2015 +0000
+++ b/main.cpp	Fri Mar 11 12:19:22 2016 +0000
@@ -7,14 +7,13 @@
  * CAN transceivers are not part of NUCLEO boards, therefore must be added by you. 
  * Remember also that CAN bus (even a short one) must be terminated with 120 Ohm resitors at both ends.
  *
- * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/>
+ * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CANnucleo_Hello/>
  *
- * NOTE: If you'd like to use the official NUCLEO-F103RB boards
- *       comment out the line #define TARGET_STM32F103C8T6  1
+ * NOTE: If you'd like to use the official NUCLEO boards comment out line 25
  *
  * The same code is used for both NUCLEO boards, but:
  *      For board #1 compile the example without any change.
- *      For board #2 comment out the line #define BOARD1 1 before compiling 
+ *      For board #2 comment out line 26 before compiling 
  *
  * Once the binaries have been downloaded to the boards reset board #1.
  *
@@ -23,31 +22,34 @@
 #include "mbed.h"
 #include "CAN.h"
 
-#define BOARD1    1                 // comment out this line when compiling for board #2
+#define TARGET_STM32F103C8T6  1     // comment out this line when using official NUCLEO boards!                                    
+#define BOARD1                1     // comment out this line when compiling for board #2
 
-#if defined(BOARD1)
-    #define RX_ID   0x100
-    #define TX_ID   0x101
+#if defined(TARGET_STM32F103C8T6) 
+    #define   LED_PIN   PC_13 
+    const int OFF = 1;
+    const int ON  = 0;
 #else
-    #define RX_ID   0x101
-    #define TX_ID   0x100
+    #define   LED_PIN   LED1
+    const int OFF = 0;
+    const int ON  = 1;
 #endif
 
-// See wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/>
-//#define TARGET_STM32F103C8T6  1     // comment out this line if you'd like to use the official NUCLEO-F103RB boards
-                                    
-#if defined(TARGET_STM32F103C8T6)  
-    DigitalOut  led(PC_13);
+#if defined(BOARD1)
+    const unsigned int RX_ID = 0x100;
+    const unsigned int TX_ID = 0x101;
 #else
-    DigitalOut  led(LED1);
+    const unsigned int RX_ID = 0x101;
+    const unsigned int TX_ID = 0x100;
 #endif
 
-int             ledReceived;
-Timer           timer;
-CAN             can(PA_11, PA_12);  // CAN Rx pin name, CAN Tx pin name, Automatic recovery from bus-off state enabled by default
-CANMessage      rxMsg;
-CANMessage      txMsg;
-int             counter = 0;
+DigitalOut  led(LED_PIN);
+int         ledState;
+Timer       timer;
+CAN         can(PA_11, PA_12);  // CAN Rx pin name, CAN Tx pin name
+CANMessage  rxMsg;
+CANMessage  txMsg;
+int         counter = 0;
 volatile bool   msgAvailable = false;
 
 /**
@@ -72,37 +74,27 @@
     can.attach(&onMsgReceived, CAN::RxIrq);     // attach 'CAN receive-complete' interrupt handler
     
 #if defined(BOARD1)
-    #if defined(TARGET_STM32F103C8T6)
-        led = 0;    // turn LED on
-    #else
-        led = 1;    // turn LED on
-    #endif
-    timer.start();
+    led = ON;       // turn LED on
+    timer.start();  // start timer
 #else
-    #if defined(TARGET_STM32F103C8T6)
-        led = 1;    // turn LED off
-    #else
-        led = 0;    // turn LED off
-    #endif
+    led = OFF;      // turn LED off
 #endif
 
     while(1) {
         if(timer.read() >= 1.0) {               // check for timeout
             timer.stop();                       // stop timer
-            timer.reset();                      // reset timer (to avaoid repeated send)
+            timer.reset();                      // reset timer
             counter++;                          // increment counter
+            ledState = led.read();              // get led state
             txMsg.clear();                      // clear Tx message storage
             txMsg.id = TX_ID;                   // set ID
-            txMsg << counter;                   // append first data item (make sure that CAN message total data lenght <= 8 bytes!)
-            txMsg << led.read();                // append second data item (make sure that CAN message total data lenght <= 8 bytes!)
-            can.write(txMsg);                   // transmit message
-            printf("CAN message sent\r\n");
-            
-            #if defined(TARGET_STM32F103C8T6)
-                led = 1;                        // turn LED off
-            #else
-                led = 0;                        // turn LED off
-            #endif
+            txMsg << counter;                   // append first data item
+            txMsg << ledState;                  // append second data item (total data lenght must be <= 8 bytes!)
+            led = OFF;                          // turn LED off
+            if(can.write(txMsg))                // transmit message
+                printf("CAN message sent\r\n"); 
+            else
+                printf("Transmission error\r\n");
         }
         if(msgAvailable) {
             msgAvailable = false;               // reset flag for next use
@@ -115,13 +107,14 @@
             printf("  Data   =");            
             for(int i = 0; i < rxMsg.len; i++)
                 printf(" %x", rxMsg.data[i]);
-            printf("\r\n");            
-            if(rxMsg.id == RX_ID) {             // if ID matches
+            printf("\r\n");
+            // Filtering performed by software:           
+            if(rxMsg.id == RX_ID) {             // See comments in CAN.cpp for filtering performed by hadware
                 rxMsg >> counter;               // extract first data item
-                rxMsg >> ledReceived;           // extract second data item
-                led = ledReceived;              // set LED
+                rxMsg >> ledState;              // extract second data item
                 printf("counter = %d\r\n", counter);
-                timer.start();
+                led = ledState;                 // set LED
+                timer.start();                  // transmission lag
             }
         }
     }