Paul Paterson / ppCANOpen

Dependents:   ppCANOpen_Example DISCO-F746NG_rtos_test

Revision:
5:22a337cdc0e3
Parent:
4:2034b04c86d2
--- a/drivers/mbed-Nucleo-F091RC/canopen_api.cpp	Sat Jan 09 17:15:29 2016 +0000
+++ b/drivers/mbed-Nucleo-F091RC/canopen_api.cpp	Sat Feb 13 20:22:59 2016 +0000
@@ -28,44 +28,78 @@
 
 #include "canopen_api.h"
 #include "canopen_config.h"
-#include "CanOpenHandle.h"
 
-#include "mbed.h"
-
-#include "CanOpenHandle.h"
 #include "CanOpenMessage.h"
 
-int CanOpenApiInit (CanOpenHandle *hCanOpen)
+#include "mbed.h" 
+#include "CAN.h"  /* use with CANNucleo library */
+
+#include "stdio.h"
+
+
+void *pServiceObject = 0;
+
+/* Can declarations ---------------------------------------------------------*/
+CAN * can; //(CANOPEN_PIN_RX, CANOPEN_PIN_TX);
+ServiceProviderRxInterruptCallback  serviceRxCallback = 0; 
+void CanReadInterruptCallback (void) {
+    if (serviceRxCallback && pServiceObject) {
+        serviceRxCallback(pServiceObject);   
+    }
+}
+
+/* Ticker declarations ---------------------------------------------------------*/
+Ticker updateTicker;
+ServiceProviderTickCallback serviceTickCallback = 0;
+void UpdateTickerCallback(void) {
+    if (serviceTickCallback && pServiceObject) {
+        serviceTickCallback(pServiceObject);   
+    }   
+}
+
+int CanOpenApiInit  (void *object, ServiceProviderRxInterruptCallback rxCallback, ServiceProviderTickCallback tickCallback)
 {
     printf ("----------- CANOPEN API: API INIT\r\n");
     
-    /** CAN instance to do all of the communication
-      *
-      * @note For some reason, I cannot use "static CAN can".  It will compile,
-      * but code get's stuck during initialization, and will not even enter
-      * main(). Works great like this though! Only one ServiceProvider, though,
-      * so mem leaks should not be an issue if we don't delete it???
-      */
+    /* CAN instance to do all of the communication
+     *
+     * For some reason, I cannot use "static CAN can".  It will compile,
+     * but code get's stuck during initialization, and will not even enter
+     * main(). Works great like this though! Only one ServiceProvider, though,
+     * so mem leaks should not be an issue if we don't delete it???
+     */
     //static CAN can(CANOPEN_PIN_RX, CANOPEN_PIN_TX);
-    CAN * can = new CAN(CANOPEN_PIN_RX, CANOPEN_PIN_TX);
+    //can = new CAN(CANOPEN_PIN_RX, CANOPEN_PIN_TX); 
+    can = new CAN(CANOPEN_PIN_RX, CANOPEN_PIN_TX);
+    //can.reset();
     
-    hCanOpen->can = can;
+    /* init the callback system ---------------------------------------------*/
+    pServiceObject = object;
+    
+    serviceRxCallback = rxCallback;
+    serviceTickCallback = tickCallback;
+    
+    can->attach(CanReadInterruptCallback);
+    updateTicker.attach(UpdateTickerCallback, .0005);
     
     return 1;
 }
 
-int CanOpenApiRead (CanOpenHandle *hCanOpen, CanOpenMessage *canOpenMsg)
+int CanOpenApiRead (CanOpenMessage *canOpenMsg)
 {
     int result = 0;
     
-    printf("api: can_read: Anything to read?\r\n");
+    /* CAUTON ********************************
+     * Could be used in interrupt!!!
+     * ***************************************
+     */
+    //printf("canopen_api: CanOpenApiRead()\r\n");
     
-    /*
-    if (hCanOpen->can) {
+    if (can) {
         
         CANMessage canMsg;
         
-        result = hCanOpen->can->read (canMsg);
+        result = can->read (canMsg);
         if (result) {
             canOpenMsg->id          = canMsg.id;
             canOpenMsg->dataCount   = canMsg.len, 
@@ -82,42 +116,53 @@
             canOpenMsg->data[5] = canMsg.data[5];
             canOpenMsg->data[6] = canMsg.data[6];
             canOpenMsg->data[7] = canMsg.data[7];
+            
+            // DEBUG
+            //printf("   ID:      %d\r\n", (int)canOpenMsg->id);
+            //printf("   Count:   %d\r\n", (int)canOpenMsg->dataCount);
+            //printf("   Type:    %d\r\n", (int)canOpenMsg->type);
+            //printf("   Format:  %d\r\n", (int)canOpenMsg->format);
+            //printf("   Data[0]: %d\r\n", (int)canOpenMsg->data[0]);
         }
         
     }
-    */
     return result;
 }
 
-int CanOpenApiWrite (CanOpenHandle *hCanOpen, CanOpenMessage *canOpenMsg)
+int CanOpenApiWrite (CanOpenMessage *canOpenMsg)
 {
     int result = 0;
     
-    if (hCanOpen->can) {    
+    CANMessage canMsg;
+    canMsg.id       = canOpenMsg->id;
+    canMsg.len      = canOpenMsg->dataCount, 
+    canMsg.type     = canOpenMsg->type   == CANOPEN_TYPE_DATA       ? CANData     : CANRemote;
+    canMsg.format   = canOpenMsg->format == CANOPEN_FORMAT_STANDARD ? CANStandard : CANExtended;
     
-        CANMessage canMsg;
-        canMsg.id       = canOpenMsg->id;
-        canMsg.len      = canOpenMsg->dataCount, 
-        canMsg.type     = canOpenMsg->type   == CANOPEN_TYPE_DATA       ? CANData     : CANRemote;
-        canMsg.format   = canOpenMsg->format == CANOPEN_FORMAT_STANDARD ? CANStandard : CANExtended;
-        
-        // NOTE: memcpy is freezing execution
-        //memcpy(canMsg.data, canOpenMsg->data, canOpenMsg->dataCount); 
-        canMsg.data[0] = canOpenMsg->data[0];
-        canMsg.data[1] = canOpenMsg->data[1];
-        canMsg.data[2] = canOpenMsg->data[2];
-        canMsg.data[3] = canOpenMsg->data[3];
-        canMsg.data[4] = canOpenMsg->data[4];
-        canMsg.data[5] = canOpenMsg->data[5];
-        canMsg.data[6] = canOpenMsg->data[6];
-        canMsg.data[7] = canOpenMsg->data[7];
-                        
-        result = hCanOpen->can->write (canMsg);
-    }
+    // NOTE: memcpy is freezing execution
+    //memcpy(canMsg.data, canOpenMsg->data, canOpenMsg->dataCount); 
+    canMsg.data[0] = canOpenMsg->data[0];
+    canMsg.data[1] = canOpenMsg->data[1];
+    canMsg.data[2] = canOpenMsg->data[2];
+    canMsg.data[3] = canOpenMsg->data[3];
+    canMsg.data[4] = canOpenMsg->data[4];
+    canMsg.data[5] = canOpenMsg->data[5];
+    canMsg.data[6] = canOpenMsg->data[6];
+    canMsg.data[7] = canOpenMsg->data[7];
+                    
+    result = can->write (canMsg);
+    
     
     return result;
 }
 
+static int timeSyncOffset = 0;
+
+uint32_t CanOpenApiGetHardwareTime (void)
+{
+    return HAL_GetTick();
+}
+
 
 
 
@@ -127,4 +172,3 @@
 
 
 
-