--- a/etherlab/etherlab.py Wed Mar 06 18:37:23 2013 +0100
+++ b/etherlab/etherlab.py Wed Mar 06 18:38:17 2013 +0100
@@ -698,11 +698,12 @@
slave.setStartupCommand(command_infos)
- def RemoveStartupCommand(self, slave_pos, command_idx):
+ def RemoveStartupCommand(self, slave_pos, command_idx, buffer=True): slave = self.GetSlave(slave_pos)
slave.removeStartupCommand(command_idx)
def SetProcessVariables(self, variables):
@@ -1020,6 +1021,9 @@
self.Buffer.CurrentSaved()
+ def GetProcessVariableName(self, location, var_type): + return "__M%s_%s" % (self.GetSizeOfType(var_type), "_".join(map(str, location))) def _Generate_C(self, buildpath, locations):
current_location = self.GetCurrentLocation()
# define a unique name for the generated C file
@@ -1031,6 +1035,32 @@
LocationCFilesAndCFLAGS, LDFLAGS, extra_files = ConfigTreeNode._Generate_C(self, buildpath, locations)
+ for variable in self.ProcessVariables.getvariable(): + read_from = variable.getReadFrom() + write_to = variable.getWriteTo() + if read_from is not None: + pos = read_from.getPosition() + index = read_from.getIndex() + subindex = read_from.getSubIndex() + location = current_location + (pos, index, subindex) + var_type = self.GetSlaveVariableDataType(pos, index, subindex) + name = self.FileGenerator.DeclareVariable( + pos, index, subindex, var_type, "I", + self.GetProcessVariableName(location, var_type)) + if write_to is not None: + pos = write_to.getPosition() + index = write_to.getIndex() + subindex = write_to.getSubIndex() + location = current_location + (pos, index, subindex) + var_type = self.GetSlaveVariableDataType(pos, index, subindex) + name = self.GetProcessVariableName(location, var_type) + self.FileGenerator.DeclareVariable( + pos, index, subindex, var_type, "Q", self.FileGenerator.GenerateCFile(Gen_Ethercatfile_path, location_str, self.BaseParams.getIEC_Channel())
LocationCFilesAndCFLAGS.append(
@@ -1072,7 +1102,7 @@
for location in locations:
loc = location["LOC"][len(current_location):]
- if slave_pos in slaves and len(loc) == 3:
+ if slave_pos in slaves and len(loc) == 3 and location["DIR"] != "M": self.FileGenerator.DeclareVariable(
slave_pos, loc[1], loc[2], location["IEC_TYPE"], location["DIR"], location["NAME"])
@@ -1180,6 +1210,10 @@
str_completion["located_variables_declaration"].extend(
["IEC_%(var_type)s %(real_var)s;" % entry_infos,
"IEC_%(var_type)s *%(var_name)s = &%(real_var)s;" % entry_infos])
+ for declaration in entry_infos.get("extra_declarations", []): + entry_infos["extra_decl"] = declaration + str_completion["located_variables_declaration"].append( + "IEC_%(var_type)s *%(extra_decl)s = &%(real_var)s;" % entry_infos) str_completion["used_pdo_entry_offset_variables_declaration"].append(
"unsigned int slave%(slave)d_%(index).4x_%(subindex).2x;" % entry_infos)
@@ -1245,9 +1279,18 @@
entry_infos = slave_variables.get((index, subindex), None)
slave_variables[(index, subindex)] = {
- "infos": (iec_type, dir, name),
+ "infos": (iec_type, dir, name, []), - elif entry_infos["infos"] != (iec_type, dir, name):
+ elif entry_infos["infos"][:2] == (iec_type, dir): + if name != entry_infos["infos"][2]: + entry_infos["infos"][3].append(name) + return entry_infos["infos"][2] + raise ValueError, _("Output variables can't be defined with different locations (%s and %s)") % (entry_infos["infos"][2], name) + print entry_infos["infos"][:2], (iec_type, dir) raise ValueError, _("Definition conflict for location \"%s\"") % name
def GenerateCFile(self, filepath, location_str, master_number):
@@ -1457,7 +1500,7 @@
if entry_declaration is not None and not entry_declaration["mapped"]:
- entry_infos.update(dict(zip(["var_type", "dir", "var_name"], entry_declaration["infos"])))
+ entry_infos.update(dict(zip(["var_type", "dir", "var_name", "extra_declarations"], entry_declaration["infos"]))) entry_declaration["mapped"] = True
entry_type = entry.getDataType().getcontent()
@@ -1543,7 +1586,7 @@
entry_infos.update(type_infos)
- entry_infos.update(dict(zip(["var_type", "dir", "var_name", "real_var"], entry_declaration["infos"])))
+ entry_infos.update(dict(zip(["var_type", "dir", "var_name", "extra_declarations"], entry_declaration["infos"]))) entry_declaration["mapped"] = True
if entry_infos["var_type"] != entry["Type"]:
@@ -1589,6 +1632,7 @@
pdo["entries"].append(" {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
if entry_infos["bitlen"] < alignment:
+ print (alignment, entry_infos["bitlen"]) pdo["entries"].append(" {0x0000, 0x00, %d}, /* None */" % (alignment - entry_infos["bitlen"]))
pdo["entries_number"] += 1
@@ -2013,7 +2057,7 @@
- self.Alignments[tuple(map(int, row[:3]))] = row[3]
+ self.Alignments[tuple(map(int, row[:3]))] = int(row[3])