# HG changeset patch # User etisserant # Date 1190646462 -7200 # Node ID eaffcd0a2f037c413fc33e078575bd0340df9d54 # Parent c31c556015564a492410570f15f4e6630b062528 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop diff -r c31c55601556 -r eaffcd0a2f03 plugins/canfestival/canfestival.py --- a/plugins/canfestival/canfestival.py Mon Sep 24 17:06:36 2007 +0200 +++ b/plugins/canfestival/canfestival.py Mon Sep 24 17:07:42 2007 +0200 @@ -22,6 +22,8 @@ + + @@ -81,11 +83,12 @@ Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix ) # Create a new copy of the model with DCF loaded with PDO mappings for desired location master = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs()) + master.SetNodeName("OD_%s"%prefix) res = gen_cfile.GenerateFile(Gen_OD_path, master) if res : raise Exception, res - return [(Gen_OD_path,canfestival_config.getCFLAGS(CanFestivalPath))],"" + return [(Gen_OD_path,canfestival_config.getCFLAGS(CanFestivalPath))],"",False class RootClass: XSD = """ @@ -101,6 +104,35 @@ PlugChildsTypes = [("CanOpenNode",_NodeListPlug)] def PlugGenerate_C(self, buildpath, locations, logger): - return [],canfestival_config.getLDFLAGS(CanFestivalPath) + + format_dict = {"locstr" : "_".join(map(str,self.GetCurrentLocation())), + "candriver" : self.CanFestivalInstance.getCAN_Driver(), + "nodes_includes" : "", + "board_decls" : "", + "nodes_init" : "", + "nodes_open" : "", + "nodes_close" : ""} + for child in self.IECSortedChilds(): + childlocstr = "_".join(map(str,child.GetCurrentLocation())) + nodename = "OD_%s" % childlocstr + + format_dict["nodes_includes"] += '#include "%s.h"\n'%(nodename) + format_dict["board_decls"] += 'BOARD_DECL(%s, "%s", "%s")\n'%( + nodename, + child.CanFestivalNode.getCAN_Device(), + child.CanFestivalNode.getCAN_Baudrate()) + format_dict["nodes_init"] += 'NODE_INIT(%s, %s)\n'%( + nodename, + child.CanFestivalNode.getNodeId()) + format_dict["nodes_open"] += 'NODE_OPEN(%s)\n'%(nodename) + format_dict["nodes_close"] += 'NODE_CLOSE(%s)\n'%(nodename) + filename = os.path.join(os.path.split(__file__)[0],"cf_runtime.c") + cf_main = open(filename).read() % format_dict + cf_main_path = os.path.join(buildpath, "CF_%(locstr)s.c"%format_dict) + f = open(cf_main_path,'w') + f.write(cf_main) + f.close() + + return [(cf_main_path, canfestival_config.getCFLAGS(CanFestivalPath))],canfestival_config.getLDFLAGS(CanFestivalPath), True diff -r c31c55601556 -r eaffcd0a2f03 plugins/canfestival/cf_runtime.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/canfestival/cf_runtime.c Mon Sep 24 17:07:42 2007 +0200 @@ -0,0 +1,75 @@ + +#include "canfestival.h" + +%(nodes_includes)s + +#define BOARD_DECL(nodename, busname, baudrate)\ + s_BOARD nodename##Board = {busname, baudrate}; + +%(board_decls)s + +static int init_level=0; + +#define NODE_INIT(nodename, nodeid) \ + /* Defining the node Id */\ + setNodeId(&nodename##_Data, nodeid);\ + /* init */\ + setState(&nodename##_Data, Initialisation); + +void InitNodes(CO_Data* d, UNS32 id) +{ + %(nodes_init)s +} + +#define NODE_CLOSE(nodename) \ + if(init_level--)\ + {\ + EnterMutex();\ + setState(&nodename##_Data, Stopped);\ + LeaveMutex();\ + canClose(&nodename##_Data);\ + } + +void __cleanup_%(locstr)s() +{ + %(nodes_close)s + + // Stop timer thread + StopTimerLoop(); + +} + +#define NODE_OPEN(nodename)\ + if(!canOpen(&nodename##Board,&nodename##_Data)){\ + printf("Cannot open " #nodename " Board (%%s,%%s)\n",nodename##Board.busname, nodename##Board.baudrate);\ + __cleanup_%(locstr)s();\ + return -1;\ + }\ + init_level++; + +/*************************** INIT *****************************************/ +int __init_%(locstr)s(int argc,char **argv) +{ + + %(nodes_open)s + +#ifndef NOT_USE_DYNAMIC_LOADING + LoadCanDriver("libcanfestival_can_%(candriver)s.so"); +#endif + // Start timer thread + StartTimerLoop(&InitNodes); + return 0; +} + +void __retrive_%(locstr)s() +{ + /*TODO: Send Sync */ + EnterMutex(); +} + +void __publish_%(locstr)s() +{ + /*TODO: Call SendPDOEvent */ + LeaveMutex(); +} +