Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: ppCANOpen_Example DISCO-F746NG_rtos_test
Diff: drivers/mbed-Nucleo-F091RC/canopen_api.cpp
- Revision:
- 5:22a337cdc0e3
- Parent:
- 4:2034b04c86d2
diff -r 2034b04c86d2 -r 22a337cdc0e3 drivers/mbed-Nucleo-F091RC/canopen_api.cpp
--- 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 @@
-