Examples
This example shows how to create a simple CAN device and connect it to a bus model.
exec ut700.temu
import MyCanDevice
# Create a can bus
create class=SimpleCANBus name=canbus0
create class=MyCANClass name=mycan0
can-connect bus=canbus0:CanBusIface dev=occan0:CanDevIface # From ut700
can-connect bus=canbus0:CanBusIface dev=mycan0:CanDevIface
The next example shows how to implement a simple CAN device
#include "temu-c/Bus/Can.h"
#include "temu-c/Bus/Objsys.h"
// This is a device / RTU model, it needs to know about its CAN bus
typedef struct MyCanDevice {
temu_Object Super;
temu_CanBusIfaceRef Bus;
} MyCanDevice;
void*
create(const char *Name, int Argc, const temu_CreateArg *Argv)
{
MyCanDevice *Dev = malloc(sizeof(MyCanDevice));
memset(Dev, 0, sizeof(MyCanDevice);
return Dev;
}
void
dispose(void *Obj)
{
MyCanDevice *Dev = (MyCanDevice*)Obj;
free(Dev);
}
// Implement the CAN Device interface
void
connected(void *Obj, temu_CanBusIfaceRef Bus)
{
MyCanDevice *Dev = (MyCanDevice*)Obj;
Dev->Bus = Bus;
temu_logInfo(Dev, "connected to CAN bus");
}
void
disconnected(void *Obj)
{
MyCanDevice *Dev = (MyCanDevice*)Obj;
Dev->Bus = {NULL, NULL};
// NOTE: This should also stop any pending events related to
// message transmissions
temu_logInfo(Dev, "disconnected from CAN bus");
}
void
receive(void *Dev, temu_CanFrame *Frame)
{
temu_logInfo(Dev, "received CAN message with msg id %u",
temu_canGetIdent(Frame));
}
temu_CanDevIface CanIface = {
connected,
disconnected,
receive,
};
TEMU_PLUGIN_INIT
{
temu_Class *cls = temu_registerClass("MyCANClass", create, dispose);
temu_addProperty(cls, "CANBus", teTY_IfaceRef, 1);
temu_addInterface(cls, "CanDevIface", "CanDevIface", &CanIface);
}