#!/usr/bin/env python3 """Add manufacturer-specific objects (0x2000-0x2003) to CANopenNode example OD.""" import os, re os.chdir("/root/workspace/canopen_lab/CANopenLinux/CANopenNode/example") # ─── Modify OD.h ─── with open("OD.h") as f: od_h = f.read() # 1. Add members to OD_PERSIST_COMM_t after x1019 od_h = od_h.replace( "} x1019_synchronousCounterOverflowValue;", "} x1019_synchronousCounterOverflowValue;\n" " uint32_t x2000_MfrData1;\n" " uint32_t x2001_MfrData2;\n" " uint32_t x2002_MfrData3;\n" " uint32_t x2003_MfrData4;" ) # 2. Add OD_ENTRY macros after the last 0x1A03 entry od_h = od_h.replace( "#define OD_ENTRY_H1A03_TPDOMappingParameter &OD->list[32]", "#define OD_ENTRY_H1A03_TPDOMappingParameter &OD->list[32]\n" "#define OD_ENTRY_H2000_MfrData1 &OD->list[33]\n" "#define OD_ENTRY_H2001_MfrData2 &OD->list[34]\n" "#define OD_ENTRY_H2002_MfrData3 &OD->list[35]\n" "#define OD_ENTRY_H2003_MfrData4 &OD->list[36]" ) with open("OD.h", "w") as f: f.write(od_h) print("[OK] OD.h updated") # ─── Modify OD.c ─── with open("OD.c") as f: od_c = f.read() # 1. Add initialization in OD_PERSIST_COMM after x1019 od_c = od_c.replace( ".x1019_synchronousCounterOverflowValue = 0x00,", ".x1019_synchronousCounterOverflowValue = 0x00,\n" " .x2000_MfrData1 = 0x00000000,\n" " .x2001_MfrData2 = 0x00000000,\n" " .x2002_MfrData3 = 0x00000000,\n" " .x2003_MfrData4 = 0x00000000," ) # 2. Add sub-object declarations for 0x2000-0x2003 # Find the last sub-object entry and add after it last_obj_marker = " .o_1A03_TPDOMappingParameter = {" # After the closing of o_1A03_TPDOMappingParameter, add new objects marker = " }\n};\n\n\n/*******************************************************************************\n Object dictionary\n*******************************************************************************/" # Find this marker to add the new variable objects before it od_c = od_c.replace( "};\n\n\n/*******************************************************************************\n Object dictionary\n*******************************************************************************/\nstatic OD_ATTR_OD OD_entry_t ODList[] = {", "};\n\n\n/* ────────────────────────────────────────────────────────────\n * Manufacturer-specific objects (0x2000-0x2003)\n * Added for PDO/SYNC/CiA402 lab experiments\n * ──────────────────────────────────────────────────────────── */\n\n" "static const OD_obj_var_t od_2000_MfrData1 = {\n" " 1,\n" " {\n" " {\n" " .dataOrig = &OD_PERSIST_COMM.x2000_MfrData1,\n" " .subIndex = 0,\n" " .attribute = ODA_SDO_RW | ODA_TRPDO | ODA_MB,\n" " .dataLength = 4\n" " }\n" " }\n" "};\n\n" "static const OD_obj_var_t od_2001_MfrData2 = {\n" " 1,\n" " {\n" " {\n" " .dataOrig = &OD_PERSIST_COMM.x2001_MfrData2,\n" " .subIndex = 0,\n" " .attribute = ODA_SDO_RW | ODA_TRPDO | ODA_MB,\n" " .dataLength = 4\n" " }\n" " }\n" "};\n\n" "static const OD_obj_var_t od_2002_MfrData3 = {\n" " 1,\n" " {\n" " {\n" " .dataOrig = &OD_PERSIST_COMM.x2002_MfrData3,\n" " .subIndex = 0,\n" " .attribute = ODA_SDO_RW | ODA_TRPDO | ODA_MB,\n" " .dataLength = 4\n" " }\n" " }\n" "};\n\n" "static const OD_obj_var_t od_2003_MfrData4 = {\n" " 1,\n" " {\n" " {\n" " .dataOrig = &OD_PERSIST_COMM.x2003_MfrData4,\n" " .subIndex = 0,\n" " .attribute = ODA_SDO_RW | ODA_TRPDO | ODA_MB,\n" " .dataLength = 4\n" " }\n" " }\n" "};\n\n\n" "/*******************************************************************************\n" " Object dictionary\n" " ******************************************************************************/\n" "static OD_ATTR_OD OD_entry_t ODList[] = {" ) # 3. Add entries to ODList before the {0x0000...} terminator od_c = od_c.replace( " {0x1A03, 0x09, ODT_REC, &ODObjs.o_1A03_TPDOMappingParameter, NULL},\n {0x0000, 0x00, 0, NULL, NULL}", " {0x1A03, 0x09, ODT_REC, &ODObjs.o_1A03_TPDOMappingParameter, NULL},\n" " {0x2000, 0x01, ODT_VAR, &od_2000_MfrData1, NULL},\n" " {0x2001, 0x01, ODT_VAR, &od_2001_MfrData2, NULL},\n" " {0x2002, 0x01, ODT_VAR, &od_2002_MfrData3, NULL},\n" " {0x2003, 0x01, ODT_VAR, &od_2003_MfrData4, NULL},\n" " {0x0000, 0x00, 0, NULL, NULL}" ) with open("OD.c", "w") as f: f.write(od_c) print("[OK] OD.c updated") print("[DONE] Manufacturer objects 0x2000-0x2003 added")