Subversion Repositories HomeAutomation

Rev

Rev 2137 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 2137 Rev 2228
1
#!/usr/bin/python
1
#!/usr/bin/python
2
 
2
 
3
# Written by Mattias Runge 2008-05-13
3
# Written by Mattias Runge 2008-05-13
4
 
4
 
5
import os
5
import os
6
import sys
6
import sys
7
import getopt
7
import getopt
8
 
8
 
9
moddir = sys.path[0] + "/../../EmbeddedSoftware/AVR/module"
9
moddir = sys.path[0] + "/../../EmbeddedSoftware/AVR/module"
10
localmoddir = os.getcwd() + "/modules"
10
localmoddir = os.getcwd() + "/modules"
11
 
11
 
12
def getModules():
12
def getModules():
13
	modules = []
13
	modules = []
14
	for fileName in os.listdir(moddir):
14
	for fileName in os.listdir(moddir):
15
		if fileName[0] != '.' and fileName != "template":
15
		if fileName[0] != '.' and fileName != "template":
16
			modules.append(fileName)
16
			modules.append(fileName)
17
 
17
 
18
	return sorted(modules, key=str.lower)
18
	return sorted(modules, key=str.lower)
19
 
19
 
20
 
20
 
21
def getLocalModules():
21
def getLocalModules():
22
	modules = []
22
	modules = []
23
	for fileName in os.listdir(localmoddir):
23
	for fileName in os.listdir(localmoddir):
24
		if fileName[0] != '.':
24
		if fileName[0] != '.':
25
			modules.append(fileName)
25
			modules.append(fileName)
26
 
26
 
27
	return sorted(modules, key=str.lower)
27
	return sorted(modules, key=str.lower)
28
 
28
 
29
 
29
 
30
def parseModuleIdFromFile(moduleName, fileName):
30
def parseModuleIdFromFile(moduleName, fileName):
31
	config_inc = open(fileName, 'r') 
31
	config_inc = open(fileName, 'r') 
32
	config_inc_lines = config_inc.readlines()
32
	config_inc_lines = config_inc.readlines()
33
	config_inc.close()
33
	config_inc.close()
34
	takenIds = []
34
	takenIds = []
35
	for line in config_inc_lines:
35
	for line in config_inc_lines:
36
		line = line.strip("\n").strip(" ")
36
		line = line.strip("\n").strip(" ")
37
		
37
		
38
		if line.find(moduleName + "_ID") != -1:
38
		if line.find(moduleName + "_ID") != -1:
39
			parts = line.split("=")
39
			parts = line.split("=")
40
			if parts[1].strip(" ") != -1 and parts[1].strip(" ") != "<ID>":
40
			if parts[1].strip(" ") != -1 and parts[1].strip(" ") != "<ID>":
41
				takenIds.append(int(parts[1].strip(" "), 16))
41
				takenIds.append(int(parts[1].strip(" "), 16))
42
				print "Found id: "+parts[1].strip(" ")+" in file: "+fileName+" for module: "+moduleName
42
				print "Found id: "+parts[1].strip(" ")+" in file: "+fileName+" for module: "+moduleName
43
	
43
	
44
	return takenIds
44
	return takenIds
45
 
45
 
46
 
46
 
47
def getModuleIdsFromFile(moduleName):
47
def getModuleIdsFromFile(moduleName):
48
	takenIds = []
48
	takenIds = []
49
	for applicationName in os.listdir("../"):	
49
	for applicationName in os.listdir("../"):	
50
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
50
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
51
			takenIds += parseModuleIdFromFile(moduleName, "../" + applicationName + "/config.inc")
51
			takenIds += parseModuleIdFromFile(moduleName, "../" + applicationName + "/config.inc")
52
	return takenIds
52
	return takenIds
53
	
53
	
54
def parseAllModuleIdFromFile(fileName, foundModules):
54
def parseAllModuleIdFromFile(fileName, foundModules):
55
	index = 0
55
	index = 0
56
	modules = getModules()
56
	modules = getModules()
57
	config_inc = open(fileName, 'r') 
57
	config_inc = open(fileName, 'r') 
58
	config_inc_lines = config_inc.readlines()
58
	config_inc_lines = config_inc.readlines()
59
	config_inc.close()
59
	config_inc.close()
60
	parts = fileName.split("/")
60
	parts = fileName.split("/")
61
	node = parts[1]
61
	node = parts[1]
62
	for line in config_inc_lines:
62
	for line in config_inc_lines:
63
		line = line.strip("\n").strip(" ")
63
		line = line.strip("\n").strip(" ")
64
		
64
		
65
		if line.find("_ID") != -1:
65
		if line.find("_ID") != -1:
66
			parts = line.split("=")
66
			parts = line.split("=")
67
			if (parts[0][:-3] in modules):
67
			if (parts[0][:-3] in modules):
68
				if parts[1].strip(" ") != -1 and parts[1].strip(" ") != "<ID>":
68
				if parts[1].strip(" ") != -1 and parts[1].strip(" ") != "<ID>":
69
					if (foundModules == 0):
69
					if (foundModules == 0):
70
						print "\tModule: "+parts[0][:-3]+"\t"+parts[1].strip(" ")
70
						print "\tModule: "+parts[0][:-3]+"\t"+parts[1].strip(" ")
71
					else:
71
					else:
72
						foundModules.append(parts[0][:-3]+"$"+node+"$"+parts[1].strip(" ")) 
72
						foundModules.append(parts[0][:-3]+"$"+node+"$"+parts[1].strip(" ")) 
73
					      
73
					      
74
	return foundModules
74
	return foundModules
75
 
75
 
76
def parseHwIdFromFile(fileName):
76
def parseHwIdFromFile(fileName):
77
	index = 0
77
	index = 0
78
	config_inc = open(fileName, 'r') 
78
	config_inc = open(fileName, 'r') 
79
	config_inc_lines = config_inc.readlines()
79
	config_inc_lines = config_inc.readlines()
80
	config_inc.close()
80
	config_inc.close()
81
	parts = fileName.split("/")
81
	parts = fileName.split("/")
82
	node = parts[1]
82
	node = parts[1]
83
	for line in config_inc_lines:
83
	for line in config_inc_lines:
84
		line = line.strip("\n").strip(" ")
84
		line = line.strip("\n").strip(" ")
85
		
85
		
86
		if line.find("NODE_HW_ID=") == 0:
86
		if line.find("NODE_HW_ID=") == 0:
87
			parts = line.split("=")
87
			parts = line.split("=")
88
			return parts[1]
88
			return parts[1]
89
	return ""
89
	return ""
90
	
90
	
91
def getAllModuleIdsFromFile():
91
def getAllModuleIdsFromFile():
92
	foundModules = []
92
	foundModules = []
93
	for applicationName in os.listdir("../"):	
93
	for applicationName in os.listdir("../"):	
94
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
94
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
95
			parseAllModuleIdFromFile("../" + applicationName + "/config.inc", foundModules)
95
			parseAllModuleIdFromFile("../" + applicationName + "/config.inc", foundModules)
96
			
96
			
97
	foundModulesSorted = sorted(foundModules, key=str.lower)
97
	foundModulesSorted = sorted(foundModules, key=str.lower)
98
	lastModule = ""
98
	lastModule = ""
99
	for x in foundModulesSorted:
99
	for x in foundModulesSorted:
100
		splitted = x.split("$")
100
		splitted = x.split("$")
101
		if (lastModule != splitted[0]):
101
		if (lastModule != splitted[0]):
102
			lastModule = splitted[0]
102
			lastModule = splitted[0]
103
			print lastModule
103
			print lastModule
104
		print "%20s :" % splitted[1],
104
		print "%20s :" % splitted[1],
105
		print splitted[2]
105
		print splitted[2]
106
	
106
	
107
def getAllNodesFromFile():
107
def getAllNodesFromFile():
108
	files = sorted(os.listdir("../"), key=str.lower)
108
	files = sorted(os.listdir("../"), key=str.lower)
109
	for applicationName in files:	
109
	for applicationName in files:	
110
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
110
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
111
			if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/bios.inc"):
111
			if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/bios.inc"):
112
				hwid = parseHwIdFromFile("../" + applicationName + "/bios.inc")
112
				hwid = parseHwIdFromFile("../" + applicationName + "/bios.inc")
113
			print "Found node: "+applicationName+ "\n With hwId: "+hwid
113
			print "Found node: "+applicationName+ "\n With hwId: "+hwid
114
			parseAllModuleIdFromFile("../" + applicationName + "/config.inc", 0)
114
			parseAllModuleIdFromFile("../" + applicationName + "/config.inc", 0)
115
 
115
 
116
def getFreeModuleId(takenIds):
116
def getFreeModuleId(takenIds):
117
	if len(takenIds) == 0:
117
	if len(takenIds) == 0:
118
		return 1
118
		return 1
119
	takenIds.sort()
119
	takenIds.sort()
120
	lastId = 0
120
	lastId = 0
121
 
121
 
122
	for takenId in takenIds:
122
	for takenId in takenIds:
123
		if ((takenId != lastId+1) & (takenId != lastId)):
123
		if ((takenId != lastId+1) & (takenId != lastId)):
124
			return lastId+1
124
			return lastId+1
125
		lastId = takenId
125
		lastId = takenId
126
 
126
 
127
	return lastId+1
127
	return lastId+1
128
	
128
	
129
 
129
 
130
def compileMainFile():
130
def compileMainFile():
131
	print "Compiling new main.c..."
131
	print "Compiling new main.c..."
132
	main_c_template = open('src/main.c.template', 'r') 
132
	main_c_template = open('src/main.c.template', 'r') 
133
	main_c_template_lines = main_c_template.readlines()
133
	main_c_template_lines = main_c_template.readlines()
134
	main_c_template.close()
134
	main_c_template.close()
135
	
135
	
136
	modules = getLocalModules()
136
	modules = getLocalModules()
137
	
137
	
138
	main_c = open('src/main.c', 'w') 
138
	main_c = open('src/main.c', 'w') 
139
	
139
	
140
	for main_c_template_line in main_c_template_lines:
140
	for main_c_template_line in main_c_template_lines:
141
		pos_include = main_c_template_line.find('%INCLUDE')
141
		pos_include = main_c_template_line.find('%INCLUDE')
142
		pos_init = main_c_template_line.find('%INIT')
142
		pos_init = main_c_template_line.find('%INIT')
143
		pos_process = main_c_template_line.find('%PROCESS')
143
		pos_process = main_c_template_line.find('%PROCESS')
144
		pos_list = main_c_template_line.find('%LIST')
144
		pos_list = main_c_template_line.find('%LIST')
145
		pos_handlemsg = main_c_template_line.find('%HANDLEMSG')
145
		pos_handlemsg = main_c_template_line.find('%HANDLEMSG')
146
		
146
		
147
		if pos_include != -1:
147
		if pos_include != -1:
148
			for moduleName in modules:
148
			for moduleName in modules:
149
				main_c.write(main_c_template_line[:pos_include] + "#include \"../modules/" + moduleName + "/" + moduleName + ".h\"\n")
149
				main_c.write(main_c_template_line[:pos_include] + "#include \"../modules/" + moduleName + "/" + moduleName + ".h\"\n")
150
		elif pos_init != -1:
150
		elif pos_init != -1:
151
			for moduleName in modules:
151
			for moduleName in modules:
152
				main_c.write(main_c_template_line[:pos_init] + moduleName + "_Init();\n")
152
				main_c.write(main_c_template_line[:pos_init] + moduleName + "_Init();\n")
153
		elif pos_process != -1:
153
		elif pos_process != -1:
154
			for moduleName in modules:
154
			for moduleName in modules:
155
				main_c.write(main_c_template_line[:pos_process] + moduleName + "_Process();\n")
155
				main_c.write(main_c_template_line[:pos_process] + moduleName + "_Process();\n")
156
		elif pos_list != -1:
156
		elif pos_list != -1:
157
			count = 1
157
			count = 1
158
			for moduleName in modules:
158
			for moduleName in modules:
159
				main_c.write(main_c_template_line[:pos_list] + moduleName + "_List(" + str(count) + ");\n")
159
				main_c.write(main_c_template_line[:pos_list] + moduleName + "_List(" + str(count) + ");\n")
160
				count += 1
160
				count += 1
161
		elif pos_handlemsg != -1:
161
		elif pos_handlemsg != -1:
162
			for moduleName in modules:
162
			for moduleName in modules:
163
				main_c.write(main_c_template_line[:pos_handlemsg] + moduleName + "_HandleMessage(&rxMsg);\n")
163
				main_c.write(main_c_template_line[:pos_handlemsg] + moduleName + "_HandleMessage(&rxMsg);\n")
164
		else:
164
		else:
165
			main_c.write(main_c_template_line)
165
			main_c.write(main_c_template_line)
166
 
166
 
167
	main_c.close()
167
	main_c.close()
168
	
168
	
169
	print "Creation of main.c complete"
169
	print "Creation of main.c complete"
170
 
170
 
171
def readConfigSection(fileName, sectionName):
171
def readConfigSection(fileName, sectionName):
172
	fileInstance = open(fileName, 'r')
172
	fileInstance = open(fileName, 'r')
173
	lines = fileInstance.readlines()
173
	lines = fileInstance.readlines()
174
	fileInstance.close()
174
	fileInstance.close()
175
	
175
	
176
	sectionLines = []
176
	sectionLines = []
177
	
177
	
178
	inSection = False
178
	inSection = False
179
	
179
	
180
	for line in lines:
180
	for line in lines:
181
		if not inSection:
181
		if not inSection:
182
			if line.find("## Section " + sectionName + " --") != -1:
182
			if line.find("## Section " + sectionName + " --") != -1:
183
				inSection = True
183
				inSection = True
184
				sectionLines.append(line.strip("\n"))
184
				sectionLines.append(line.strip("\n"))
185
		else:
185
		else:
186
			if line.find("## End section " + sectionName + " --") != -1:
186
			if line.find("## End section " + sectionName + " --") != -1:
187
				inSection = False
187
				inSection = False
188
				
188
				
189
			sectionLines.append(line.strip("\n"))
189
			sectionLines.append(line.strip("\n"))
190
			
190
			
191
	return sectionLines
191
	return sectionLines
192
	
192
	
193
 
193
 
194
def updateConfigFile():
194
def updateConfigFile():
195
	print "Updating config.inc..."
195
	print "Updating config.inc...\n"
196
	modules = getLocalModules()
196
	modules = getLocalModules()
197
	moduleSections = {}
197
	moduleSections = {}
198
	applicationSection = []
198
	applicationSection = []
199
	moduleName="none"
199
	moduleName="none"
200
	if not os.path.exists("config.inc"):
200
	if not os.path.exists("config.inc"):
201
		applicationSection = readConfigSection("src/config.inc.template", "application")
201
		applicationSection = readConfigSection("src/config.inc.template", "application")
202
		
202
		
203
		for moduleName in modules:
203
		for moduleName in modules:
204
			moduleSections[moduleName] = readConfigSection(localmoddir + "/" + moduleName + "/config.inc.template", moduleName)
204
			moduleSections[moduleName] = readConfigSection(localmoddir + "/" + moduleName + "/config.inc.template", moduleName)
205
	else:
205
	else:
206
		applicationSection = readConfigSection("config.inc", "application")
206
		applicationSection = readConfigSection("config.inc", "application")
207
		
207
		print "\tModules used:"
208
		for moduleName in modules:
208
		for moduleName in modules:
209
			moduleSections[moduleName] = readConfigSection("config.inc", moduleName)
209
			moduleSections[moduleName] = readConfigSection("config.inc", moduleName)
210
			
210
			print "\t\t"+moduleName
211
			if len(moduleSections[moduleName]) <= 1:
211
			if len(moduleSections[moduleName]) <= 1:
212
				moduleSections[moduleName] = readConfigSection(localmoddir + "/" + moduleName + "/config.inc.template", moduleName)
212
				moduleSections[moduleName] = readConfigSection(localmoddir + "/" + moduleName + "/config.inc.template", moduleName)
213
	
213
	
214
	timers = 0
214
	timers = 0
215
	pcints = 0
215
	pcints = 0
216
	
-
 
217
	moduleIds = getModuleIdsFromFile(moduleName)
-
 
218
	
216
	print ""
219
	for moduleName, moduleSection in moduleSections.iteritems():
217
	for moduleName, moduleSection in moduleSections.iteritems():
220
		c = 0
218
		c = 0
221
		for line in moduleSection:
219
		for line in moduleSection:
222
			if len(line) > 0:
220
			if len(line) > 0:
223
				if line[0] != '#':
221
				if line[0] != '#':
224
					if line.find("<ID>") != -1:
222
					if line.find("<ID>") != -1:
-
 
223
						moduleIds = getModuleIdsFromFile(moduleName)
225
						new_ID = getFreeModuleId(moduleIds)
224
						new_ID = getFreeModuleId(moduleIds)
226
						print "\nNew module id set to: "+hex(new_ID)+"\n"
225
						print "\nNew module id set to: "+hex(new_ID)+"\n"
227
						moduleIds.append(new_ID)
226
						moduleIds.append(new_ID)
228
						line = line.replace("<ID>", hex(new_ID))
227
						line = line.replace("<ID>", hex(new_ID))
229
					elif line.find("<TIMER>") != -1:
228
					elif line.find("<TIMER>") != -1:
230
						line = line[:line.find("=")+1] + hex(timers) + " /* <TIMER> -- DO NOT REMOVE THIS COMMENT -- */"
229
						line = line[:line.find("=")+1] + hex(timers) + " /* <TIMER> -- DO NOT REMOVE THIS COMMENT -- */"
231
						timers += 1
230
						timers += 1
232
					elif line.find("<PCINT>") != -1:
231
					elif line.find("<PCINT>") != -1:
233
						line = line[:line.find("=")+1] + hex(pcints) + " /* <PCINT> -- DO NOT REMOVE THIS COMMENT -- */"
232
						line = line[:line.find("=")+1] + hex(pcints) + " /* <PCINT> -- DO NOT REMOVE THIS COMMENT -- */"
234
						pcints += 1
233
						pcints += 1
235
	
234
	
236
			moduleSection[c] = line;
235
			moduleSection[c] = line;
237
			c += 1
236
			c += 1
238
	
237
	
239
	c = 0
238
	c = 0
240
	for line in applicationSection:
239
	for line in applicationSection:
241
		if len(line) > 0:
240
		if len(line) > 0:
242
			if line[0] != '#':
241
			if line[0] != '#':
243
				if line.find("<TIMER>") != -1:
242
				if line.find("<TIMER>") != -1:
244
					line = line[:line.find("=")+1] + hex(timers) + " /* <TIMER> -- DO NOT REMOVE THIS COMMENT -- */"
243
					line = line[:line.find("=")+1] + hex(timers) + " /* <TIMER> -- DO NOT REMOVE THIS COMMENT -- */"
245
					timers += 1
244
					timers += 1
246
				elif line.find("TIMER_NUM_TIMERS=") != -1:
245
				elif line.find("TIMER_NUM_TIMERS=") != -1:
247
					line = "TIMER_NUM_TIMERS=" + hex(timers)
246
					line = "TIMER_NUM_TIMERS=" + hex(timers)
248
				elif line.find("NUMBER_OF_MODULES=") != -1:
247
				elif line.find("NUMBER_OF_MODULES=") != -1:
249
					line = "NUMBER_OF_MODULES=" + hex(len(modules))
248
					line = "NUMBER_OF_MODULES=" + hex(len(modules))
250
				elif line.find("<PCINT>") != -1:
249
				elif line.find("<PCINT>") != -1:
251
					line = line[:line.find("=")+1] + hex(pcints) + " /* <PCINT> -- DO NOT REMOVE THIS COMMENT -- */"
250
					line = line[:line.find("=")+1] + hex(pcints) + " /* <PCINT> -- DO NOT REMOVE THIS COMMENT -- */"
252
					pcints += 1
251
					pcints += 1
253
				elif line.find("PCINT_NUM_PCINTS=") != -1:
252
				elif line.find("PCINT_NUM_PCINTS=") != -1:
254
					line = "PCINT_NUM_PCINTS=" + hex(pcints)
253
					line = "PCINT_NUM_PCINTS=" + hex(pcints)
255
		applicationSection[c] = line;
254
		applicationSection[c] = line;
256
		c += 1
255
		c += 1
257
		
256
		
258
	config_inc = open('config.inc', 'w')
257
	config_inc = open('config.inc', 'w')
259
	
258
	
260
	for line in applicationSection:
259
	for line in applicationSection:
261
		config_inc.write(line + "\n")
260
		config_inc.write(line + "\n")
262
		
261
		
263
	for moduleName, moduleSection in moduleSections.iteritems():
262
	for moduleName, moduleSection in moduleSections.iteritems():
264
		for line in moduleSection:
263
		for line in moduleSection:
265
			config_inc.write(line + "\n")
264
			config_inc.write(line + "\n")
266
		
265
		
267
	config_inc.close()
266
	config_inc.close()
268
	
267
	
269
	print "Update of config.inc complete"
268
	print "Update of config.inc complete"
270
 
269
 
271
 
270
 
272
def compileSourcesFile():
271
def compileSourcesFile():
273
	print "Compiling sources.inc..."
272
	print "Compiling sources.inc..."
274
	
273
	
275
	uniqueSet = []
274
	uniqueSet = []
276
	uniqueSet2 = []
275
	uniqueSet2 = []
277
	if os.path.isfile("src/libraries.list.template"):
276
	if os.path.isfile("src/libraries.list.template"):
278
		libraries_list_template = open('src/libraries.list.template', 'r')
277
		libraries_list_template = open('src/libraries.list.template', 'r')
279
		libraries_list_template_lines = libraries_list_template.readlines()
278
		libraries_list_template_lines = libraries_list_template.readlines()
280
		libraries_list_template.close()
279
		libraries_list_template.close()
281
	
280
	
282
	sources_list_template = open('src/sources.list.template', 'r')
281
	sources_list_template = open('src/sources.list.template', 'r')
283
	sources_list_template_lines = sources_list_template.readlines()
282
	sources_list_template_lines = sources_list_template.readlines()
284
	sources_list_template.close()
283
	sources_list_template.close()
285
	if os.path.isfile("src/libraries.list.template"):
284
	if os.path.isfile("src/libraries.list.template"):
286
		for libraries_list_template_line in libraries_list_template_lines:
285
		for libraries_list_template_line in libraries_list_template_lines:
287
			line =libraries_list_template_line.strip("\n").strip(" ")
286
			line =libraries_list_template_line.strip("\n").strip(" ")
288
			if len(line) > 0:
287
			if len(line) > 0:
289
				if line[0] != '#':
288
				if line[0] != '#':
290
					uniqueSet2.append(line)
289
					uniqueSet2.append(line)
291
	
290
	
292
	for sources_list_template_line in sources_list_template_lines:
291
	for sources_list_template_line in sources_list_template_lines:
293
		line = sources_list_template_line.strip("\n").strip(" ")
292
		line = sources_list_template_line.strip("\n").strip(" ")
294
		if len(line) > 0:
293
		if len(line) > 0:
295
			if line[0] != '#':
294
			if line[0] != '#':
296
				uniqueSet.append(line)
295
				uniqueSet.append(line)
297
		
296
		
298
	modules = getLocalModules()
297
	modules = getLocalModules()
299
	
298
	
300
	for moduleName in modules:
299
	for moduleName in modules:
301
		sources_list = open(localmoddir + "/" + moduleName + "/sources.list", 'r')
300
		sources_list = open(localmoddir + "/" + moduleName + "/sources.list", 'r')
302
		sources_list_lines = sources_list.readlines()
301
		sources_list_lines = sources_list.readlines()
303
		sources_list.close()
302
		sources_list.close()
304
	
303
	
305
		if os.path.isfile(localmoddir + "/" + moduleName + "/libraries.list"):
304
		if os.path.isfile(localmoddir + "/" + moduleName + "/libraries.list"):
306
			libraries_list = open(localmoddir + "/" + moduleName + "/libraries.list", 'r')
305
			libraries_list = open(localmoddir + "/" + moduleName + "/libraries.list", 'r')
307
			libraries_list_lines = libraries_list.readlines()
306
			libraries_list_lines = libraries_list.readlines()
308
			libraries_list.close()
307
			libraries_list.close()
309
		
308
		
310
			for libraries_list_line in libraries_list_lines:
309
			for libraries_list_line in libraries_list_lines:
311
				line = libraries_list_line.strip("\n").strip(" ")
310
				line = libraries_list_line.strip("\n").strip(" ")
312
				if len(line) > 0:
311
				if len(line) > 0:
313
					if line[0] != '#':
312
					if line[0] != '#':
314
						uniqueSet2.append("../../../module/" + moduleName + line)
313
						uniqueSet2.append("../../../module/" + moduleName + line)
315
		for sources_list_line in sources_list_lines:
314
		for sources_list_line in sources_list_lines:
316
			line = sources_list_line.strip("\n").strip(" ")
315
			line = sources_list_line.strip("\n").strip(" ")
317
			if len(line) > 0:
316
			if len(line) > 0:
318
				if line[0] != '#':
317
				if line[0] != '#':
319
					uniqueSet.append(line)
318
					uniqueSet.append(line)
320
			
319
			
321
	
320
	
322
	sourcesString = "SOURCES = "
321
	sourcesString = "SOURCES = "
323
	
322
	
324
	#FIXME: Make uniqueSet actually unique
323
	#FIXME: Make uniqueSet actually unique
325
	
324
	
326
	for line in uniqueSet:
325
	for line in uniqueSet:
327
		sourcesString += line + " "
326
		sourcesString += line + " "
328
	sourcesString += "\n"
327
	sourcesString += "\n"
329
	sourcesString += "LDLIBS = "
328
	sourcesString += "LDLIBS = "
330
	for line in uniqueSet2:
329
	for line in uniqueSet2:
331
		sourcesString += line + " "
330
		sourcesString += line + " "
332
	sources_inc = open('sources.inc', 'w')
331
	sources_inc = open('sources.inc', 'w')
333
	sources_inc.write(sourcesString.strip(" ") + "\n")
332
	sources_inc.write(sourcesString.strip(" ") + "\n")
334
	sources_inc.close()
333
	sources_inc.close()
335
	
334
	
336
	print "Creation of sources.inc complete"
335
	print "Creation of sources.inc complete"
337
 
336
 
338
def regenerateModules():
337
def regenerateModules():
339
	print "Regenerating modules..."
338
	print "Regenerating modules..."
340
	print ""
339
	print ""
341
	compileSourcesFile()
340
	compileSourcesFile()
342
	print ""
341
	print ""
343
	compileMainFile()
342
	compileMainFile()
344
	print ""
343
	print ""
345
	updateConfigFile()
344
	updateConfigFile()
346
	print ""
345
	print ""
347
	print "Regenerating modules complete"
346
	print "Regenerating modules complete"
348
	print ""
347
	print ""
349
 
348
 
350
def listUsedModules():
349
def listUsedModules():
351
	print "Listing modules..."
350
	print "Listing modules..."
352
	print ""
351
	print ""
353
	getAllModuleIdsFromFile()
352
	getAllModuleIdsFromFile()
354
	print ""
353
	print ""
355
	print "Listing modules complete"
354
	print "Listing modules complete"
356
	print ""
355
	print ""
357
	
356
	
358
def listUsedNodes():
357
def listUsedNodes():
359
	print "Listing nodes..."
358
	print "Listing nodes..."
360
	print ""
359
	print ""
361
	getAllNodesFromFile()
360
	getAllNodesFromFile()
362
	print ""
361
	print ""
363
	print "Listing nodes complete"
362
	print "Listing nodes complete"
364
	print ""
363
	print ""
365
 
364
 
366
def addModule(moduleName):
365
def addModule(moduleName):
367
	print "Trying to add module " + moduleName
366
	print "Trying to add module " + moduleName
368
	
367
	
369
	try:
368
	try:
370
		# the following creates symlinks to <path to modulemanager>/../../EmbeddedSoftware/AVR/module
369
		# the following creates symlinks to <path to modulemanager>/../../EmbeddedSoftware/AVR/module
371
		# and <path to modulemanager> is an absolute path which makes the symlink similar to this:
370
		# and <path to modulemanager> is an absolute path which makes the symlink similar to this:
372
		# act_dimmer230 -> /home/arune/Documents/HomeAutomation/PcSoftware/scripts/../../EmbeddedSoftware/AVR/module/act_dimmer230
371
		# act_dimmer230 -> /home/arune/Documents/HomeAutomation/PcSoftware/scripts/../../EmbeddedSoftware/AVR/module/act_dimmer230
373
		#os.symlink(moddir + "/" + moduleName, localmoddir + "/" + moduleName)
372
		#os.symlink(moddir + "/" + moduleName, localmoddir + "/" + moduleName)
374
		# instead symlink to relative path instead
373
		# instead symlink to relative path instead
375
		os.symlink("../../../module/" + moduleName, localmoddir + "/" + moduleName)
374
		os.symlink("../../../module/" + moduleName, localmoddir + "/" + moduleName)
376
		print "Added module successfully"
375
		print "Added module successfully"
377
	except OSError, (errno, strerror):
376
	except OSError, (errno, strerror):
378
		if errno == 17:
377
		if errno == 17:
379
			print "A link, file or directory named " + moduleName + " is already present in the modules directory, not linking"
378
			print "A link, file or directory named " + moduleName + " is already present in the modules directory, not linking"
380
		else:
379
		else:
381
			raise
380
			raise
382
	
381
	
383
	print ""
382
	print ""
384
	
383
	
385
	regenerateModules()
384
	regenerateModules()
386
 
385
 
387
 
386
 
388
def delModule(moduleName):
387
def delModule(moduleName):
389
	print "Trying to remove module " + moduleName
388
	print "Trying to remove module " + moduleName
390
	
389
	
391
	try:
390
	try:
392
		os.unlink(localmoddir + "/" + moduleName)
391
		os.unlink(localmoddir + "/" + moduleName)
393
		print "Removed module successfully"
392
		print "Removed module successfully"
394
	except OSError, (errno, strerror):
393
	except OSError, (errno, strerror):
395
		if errno == 2:
394
		if errno == 2:
396
			print "No such " + moduleName + " present in the modules directory, not unlinking"
395
			print "No such " + moduleName + " present in the modules directory, not unlinking"
397
		else:
396
		else:
398
			raise
397
			raise
399
	
398
	
400
	print ""
399
	print ""
401
	
400
	
402
	regenerateModules()
401
	regenerateModules()
403
 
402
 
404
def createFile(moduleName, templateFileName, moduleFileName):
403
def createFile(moduleName, templateFileName, moduleFileName):
405
	print "Creating " + moduleName + "/" + templateFileName + "..."
404
	print "Creating " + moduleName + "/" + templateFileName + "..."
406
	template_file = open(moddir + "/template/" + templateFileName, 'r')
405
	template_file = open(moddir + "/template/" + templateFileName, 'r')
407
	lines = template_file.readlines()
406
	lines = template_file.readlines()
408
	template_file.close()
407
	template_file.close()
409
 
408
 
410
	module_file = open(moddir + "/" + moduleName + "/" + moduleFileName, 'w')
409
	module_file = open(moddir + "/" + moduleName + "/" + moduleFileName, 'w')
411
	
410
	
412
	for line in lines:
411
	for line in lines:
413
		line = line.replace("<template>", moduleName)
412
		line = line.replace("<template>", moduleName)
414
		line = line.replace("<TEMPLATE>", moduleName.upper())
413
		line = line.replace("<TEMPLATE>", moduleName.upper())
415
 
414
 
416
		module_file.write(line)
415
		module_file.write(line)
417
 
416
 
418
	module_file.close()
417
	module_file.close()
419
	
418
	
420
def newModule(moduleName):
419
def newModule(moduleName):
421
	print "Creating " + moddir + "/" + moduleName + " directory..."
420
	print "Creating " + moddir + "/" + moduleName + " directory..."
422
	os.mkdir(moddir + "/" + moduleName + "/")
421
	os.mkdir(moddir + "/" + moduleName + "/")
423
 
422
 
424
	createFile(moduleName, "config.inc.template", "config.inc.template")
423
	createFile(moduleName, "config.inc.template", "config.inc.template")
425
	createFile(moduleName, "sources.list", "sources.list")
424
	createFile(moduleName, "sources.list", "sources.list")
426
	createFile(moduleName, "template.h", moduleName + ".h")
425
	createFile(moduleName, "template.h", moduleName + ".h")
427
	createFile(moduleName, "template.c", moduleName + ".c")
426
	createFile(moduleName, "template.c", moduleName + ".c")
428
	createFile(moduleName, "template_eeprom.h", moduleName + "_eeprom.h")
427
	createFile(moduleName, "template_eeprom.h", moduleName + "_eeprom.h")
429
 
428
 
430
def usage():
429
def usage():
431
	print "Syntax: ./ModuleManager [options]"
430
	print "Syntax: ./ModuleManager [options]"
432
	print "Options:"
431
	print "Options:"
433
	print "  --help               Print this help"
432
	print "  --help               Print this help"
434
	print "  --regenerate         Regenarate modules and files"
433
	print "  --regenerate         Regenarate modules and files"
435
	print "  --list               List avalible and installed modules"
434
	print "  --list               List avalible and installed modules"
436
	print "  --add=<module name>  Adds a module to the application"
435
	print "  --add=<module name>  Adds a module to the application"
437
	print "  --del=<module name>  Removes a module from the application"
436
	print "  --del=<module name>  Removes a module from the application"
438
	print "  --new=<module name>  Creates a new module from the module template"
437
	print "  --new=<module name>  Creates a new module from the module template"
439
	print "  --modules            Lists all used modules in your personal folder"
438
	print "  --modules            Lists all used modules in your personal folder"
440
	print "  --nodes              Lists all nodes in your personal folder"
439
	print "  --nodes              Lists all nodes in your personal folder"
441
	print ""
440
	print ""
442
 
441
 
443
 
442
 
444
def main():
443
def main():
445
	try:
444
	try:
446
		opts, args = getopt.getopt(sys.argv[1:], "hlrcmn", ["help", "list", "modules", "nodes", "regenerate", "add=", "del=", "new="])
445
		opts, args = getopt.getopt(sys.argv[1:], "hlrcmn", ["help", "list", "modules", "nodes", "regenerate", "add=", "del=", "new="])
447
	except getopt.GetoptError, err:
446
	except getopt.GetoptError, err:
448
		# print help information and exit:
447
		# print help information and exit:
449
		print str(err) # will print something like "option -a not recognized"
448
		print str(err) # will print something like "option -a not recognized"
450
		usage()
449
		usage()
451
		sys.exit(2)
450
		sys.exit(2)
452
	
451
	
453
	if len(sys.argv) == 1:
452
	if len(sys.argv) == 1:
454
		usage()
453
		usage()
455
		sys.exit()
454
		sys.exit()
456
	
455
	
457
	for o, a in opts:
456
	for o, a in opts:
458
		if o in ("-c"):
457
		if o in ("-c"):
459
			modules = getModules()
458
			modules = getModules()
460
			
459
			
461
			for module in modules:
460
			for module in modules:
462
				print module
461
				print module
463
 
462
 
464
		elif o in ("-l", "--list"):
463
		elif o in ("-l", "--list"):
465
			modules = getModules()
464
			modules = getModules()
466
			print "Available modules"
465
			print "Available modules"
467
			print "================="
466
			print "================="
468
			for module in modules:
467
			for module in modules:
469
				print module
468
				print module
470
			
469
			
471
 
470
 
472
			if os.path.exists(localmoddir):
471
			if os.path.exists(localmoddir):
473
				print ""
472
				print ""
474
			
473
			
475
				modules = getLocalModules()
474
				modules = getLocalModules()
476
			
475
			
477
				print "Modules used in this application"
476
				print "Modules used in this application"
478
				print "================================"
477
				print "================================"
479
				for module in modules:
478
				for module in modules:
480
					print module
479
					print module
481
			
480
			
482
		elif o in ("-h", "--help"):
481
		elif o in ("-h", "--help"):
483
			usage()
482
			usage()
484
			sys.exit()
483
			sys.exit()
485
			
484
			
486
		elif o in ("-r", "--regenerate"):
485
		elif o in ("-r", "--regenerate"):
487
			regenerateModules()
486
			regenerateModules()
488
			
487
			
489
		elif o in ("-m", "--modules"):
488
		elif o in ("-m", "--modules"):
490
			listUsedModules()
489
			listUsedModules()
491
		
490
		
492
		elif o in ("-n", "--nodes"):
491
		elif o in ("-n", "--nodes"):
493
			listUsedNodes()
492
			listUsedNodes()
494
			
493
			
495
		elif o in ("--add"):
494
		elif o in ("--add"):
496
			if len(a) == 0:
495
			if len(a) == 0:
497
				print "No modulename specified"
496
				print "No modulename specified"
498
				usage()
497
				usage()
499
				sys.exit()
498
				sys.exit()
500
			
499
			
501
			if a not in getModules():
500
			if a not in getModules():
502
				print a + " is not a recognized module name"
501
				print a + " is not a recognized module name"
503
				sys.exit()
502
				sys.exit()
504
				
503
				
505
			addModule(a)
504
			addModule(a)
506
			
505
			
507
		elif o in ("--del"):
506
		elif o in ("--del"):
508
			if len(a) == 0:
507
			if len(a) == 0:
509
				print "No modulename specified"
508
				print "No modulename specified"
510
				usage()
509
				usage()
511
				sys.exit()
510
				sys.exit()
512
			
511
			
513
			if a not in getModules():
512
			if a not in getModules():
514
				print a + " is not a recognized module name"
513
				print a + " is not a recognized module name"
515
				sys.exit()
514
				sys.exit()
516
				
515
				
517
			delModule(a)
516
			delModule(a)
518
			
517
			
519
		elif o in ("--new"):
518
		elif o in ("--new"):
520
			if len(a) == 0:
519
			if len(a) == 0:
521
				print "No modulename specified"
520
				print "No modulename specified"
522
				usage()
521
				usage()
523
				sys.exit()
522
				sys.exit()
524
			
523
			
525
			if a in getModules():
524
			if a in getModules():
526
				print a + " already exists"
525
				print a + " already exists"
527
				sys.exit()
526
				sys.exit()
528
				
527
				
529
			newModule(a)
528
			newModule(a)
530
			
529
			
531
		else:
530
		else:
532
			assert False, "unhandled option"
531
			assert False, "unhandled option"
533
 
532
 
534
 
533
 
535
if __name__ == "__main__":
534
if __name__ == "__main__":
536
	main()
535
	main()
537
 
536