comit to publish

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

Revision:
21:f3a7ffd48020
Parent:
20:eb1a8042605e
--- a/main.cpp	Tue Aug 16 21:13:47 2016 +0000
+++ b/main.cpp	Mon Nov 28 23:15:14 2016 +0000
@@ -1,10 +1,10 @@
 /*
  * An example showing how to use the CANnucleo library:
  *
- * Two affordable (less than $3 on ebay) STM32F103C8T6 boards (20kB SRAM, 64kB Flash), 
- * (see [https://developer.mbed.org/users/hudakz/code/STM32F103C8T6_Hello/] for more details) 
- * are connected to the same CAN bus via transceivers (MCP2551 or TJA1040, or etc.). 
- * CAN transceivers are not part of NUCLEO boards, therefore must be added by you. 
+ * Two affordable (less than $3 on ebay) STM32F103C8T6 boards (20kB SRAM, 64kB Flash),
+ * (see [https://developer.mbed.org/users/hudakz/code/STM32F103C8T6_Hello/] for more details)
+ * are connected to the same CAN bus via transceivers (MCP2551 or TJA1040, or etc.).
+ * 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/CANnucleo_Hello/>
@@ -13,37 +13,28 @@
  *
  * The same code is used for both NUCLEO boards, but:
  *      For board #1 compile the example without any change.
- *      For board #2 comment out line 23 before compiling 
+ *      For board #2 comment out line 23 before compiling
  *
  * Once the binaries have been downloaded to the boards reset board #1.
  *
- */ 
+ */
 
-//#define TARGET_STM32F103C8T6  1     // uncomment this line when using STM32F103C8T6 boards!                                    
-#define BOARD1                1     // comment out this line when compiling for board #2
+//#define TARGET_STM32F103C8T6  1     // uncomment this line when using STM32F103C8T6 boards!
+//#define BOARD1                1     // comment out this line when compiling for board #2
+
 
-#if defined(TARGET_STM32F103C8T6)
-    #define LED_PIN PC_13
-    const int OFF = 1;
-    const int ON  = 0;
-#else
-    #define LED_PIN LED1
-    const int OFF = 0;
-    const int ON  = 1;
-#endif
+#define start_charge_msg "\x22\x80\x24\x01"
+#define stop_charge_msg "\x22\x80\x24\x02"
+#define charger_startup_msg "\x0\xB\x0\x0\x0\x0\x0\xB"    // charger writes this during startup
+#define change_charger_can_bitrate_1Mbs "\x22\xDA\x20\x01\x04"
 
-#if defined(BOARD1)
-    const unsigned int RX_ID = 0x100;
-    const unsigned int TX_ID = 0x101;
-#else
-    const unsigned int RX_ID = 0x101;
-    const unsigned int TX_ID = 0x100;
-#endif
+const unsigned int RX_ID = 0x100;
+const unsigned int TX_ID = 0x101;
 
 #include "CANnucleo.h"
 #include "mbed.h"
 
-/* 
+/*
  * To avaoid name collision with the CAN and CANMessage classes built into the mbed library
  * the CANnucleo's CAN and CANMessage classes have been moved into the CANnucleo namespace.
  * Remember to qualify them with the CANnucleo namespace.
@@ -51,77 +42,136 @@
 CANnucleo::CAN          can(PA_11, PA_12);  // CAN Rx pin name, CAN Tx pin name
 CANnucleo::CANMessage   rxMsg;
 CANnucleo::CANMessage   txMsg;
-DigitalOut              led(LED_PIN);
-int                     ledState;
+CANnucleo::CANMessage   throttle_txMsg;
+
+
+DigitalOut              led(PA_5);
+DigitalOut              controller_key_switch(PA_6); // SS_Rel
+
 Timer                   timer;
 int                     counter = 0;
 volatile bool           msgAvailable = false;
+volatile bool           to_send = false;
 
 /**
  * @brief   'CAN receive-complete' interrup handler.
  * @note    Called on arrival of new CAN message.
  *          Keep it as short as possible.
- * @param   
- * @retval  
+ * @param
+ * @retval
  */
-void onMsgReceived() {
+void onMsgReceived()
+{
     msgAvailable = true;
 }
 
 /**
  * @brief   Main
  * @note
- * @param 
+ * @param
  * @retval
  */
-int main() {
-    can.frequency(1000000);                     // set bit rate to 1Mbps
-    can.attach(&onMsgReceived);                 // attach 'CAN receive-complete' interrupt handler
-    
-#if defined(BOARD1)
-    led = ON;       // turn LED on
-    timer.start();  // start timer
-    printf("CANnucleo_Hello board #1\r\n");
-#else
-    led = OFF;      // turn LED off
-    printf("CANnucleo_Hello board #2\r\n");
-#endif
+bool to_charge = 0;
+bool charge = 0;
+void led_error()
+{
+
+    led = !led;
+    wait(0.1);
+    led=!led;
+    wait(0.1);
+    led = !led;
+    wait(0.1);
+    led = !led;
+    wait(0.1);
+    led = !led;
+
+}
+int build_message(unsigned char * badjoras, const char * command)
+{
+    char *src;
+    strcpy(src,command);
+    strncpy((char *) badjoras,src,sizeof(command)-1);
+    return (sizeof(command)-1);
+}
 
-    while(1) {
-        if(timer.read() >= 1.0) {               // check for timeout
-            timer.stop();                       // stop timer
-            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
-            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");
-        }
+void flip()
+{
+    to_send=1;                // append first data item
+    to_charge=1;
+    //controller_key_switch = !controller_key_switch;
+    led = !led;
+    charge = !charge;
+}
+
+bool controller = 0;//flag for turning on controller_key_switch
+Ticker flipper;
+void change_can_bitrate(){
+    to_send= 1;
+}
+InterruptIn button(PC_13);
+
+int main()
+
+{
+    can.frequency(125000);                     // set bit rate to 1Mbps
+    can.attach(&onMsgReceived);                 // attach 'CAN receive-complete' interrupt handler
+    flipper.attach(&change_can_bitrate, 5);           //heartbeat
+    button.rise(&flip);
+    led=0;
+    printf("badjoras\n");
+
+    while(true) {
+
         if(msgAvailable) {
             msgAvailable = false;               // reset flag for next use
-            can.read(rxMsg);                    // read message into Rx message storage
-            printf("CAN message received\r\n");
-            printf("  ID      = 0x%.3x\r\n", rxMsg.id);
-            printf("  Type    = %d\r\n", rxMsg.type);
-            printf("  Format  = %d\r\n", rxMsg.format);
-            printf("  Length  = %d\r\n", rxMsg.len);
-            printf("  Data    =");            
-            for(int i = 0; i < rxMsg.len; i++)
-                printf(" %.2x", rxMsg.data[i]);
-            printf("\r\n");
-            // Filtering performed by software:           
-            if(rxMsg.id == RX_ID) {             // See comments in CAN.cpp for filtering performed by hardware
-                rxMsg >> counter;               // extract first data item
-                rxMsg >> ledState;              // extract second data item
-                printf("  counter = %d\r\n", counter);
-                led = ON;                       // turn LED on
-                timer.start();                  // transmission lag
+            int len = can.read(rxMsg);
+            printf("Id: %x ", rxMsg.id);
+            for(int i = 0; i<len; i++) {
+                printf("%x,", rxMsg.data[i]);
+            }
+            printf("\n\r");
+            /*
+            rxMsg >> controller;
+                            led = controller;
+                            controller_key_switch = controller;*/
+            if(rxMsg.id == 0x28B) {
+                if (memcmp(rxMsg.data,charger_startup_msg,8)==0) {
+                    printf(" this is the message\n\r");
+                    txMsg.clear();                      // clear Tx message storage
+                    txMsg.id = 0x60B;
+                    build_message(txMsg.data,stop_charge_msg);
+                    txMsg.len = 4;
+                    to_send = 1;
+                }
+            }
+        }
+        if(to_send) {
+            to_send = 0;
+            if(to_charge) {
+                to_charge = 0;
+                if(charge) {
+                    txMsg.clear();                      // clear Tx message storage
+                    txMsg.id = 0x60B;
+                    build_message(txMsg.data,start_charge_msg);
+                    txMsg.len = 4;
+                } else {
+                    txMsg.clear();                      // clear Tx message storage
+                    txMsg.id = 0x60B;
+                    build_message(txMsg.data,stop_charge_msg);
+                    txMsg.len = 4;
+                }
+
+            } else {
+                txMsg.clear();
+                txMsg.id = 0x60B;
+                build_message(txMsg.data, change_charger_can_bitrate_1Mbs);
+                txMsg.len = 8;
+            }
+            if(!can.write(txMsg)) {
+                led_error();
+            } else {
+                printf("sent message: ID: %x DATA: %x %x %x %x %x %x %x %x\n\r",txMsg.id,txMsg.data[0],txMsg.data[1],txMsg.data[2],txMsg.data[3],txMsg.data[4],txMsg.data[5],txMsg.data[6],txMsg.data[7]);
             }
         }
     }