Subversion Repositories HomeAutomation

Rev

Rev 979 | Rev 1106 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
979 linlun 1
#!/usr/bin/python
825 migan 2
 
819 migan 3
# Written by Mattias Runge 2008-05-13
4
 
5
import os
6
import sys
7
import getopt
8
 
852 migan 9
moddir = sys.path[0] + "/../../EmbeddedSoftware/AVR/module"
10
localmoddir = os.getcwd() + "/modules"
819 migan 11
 
12
def getModules():
13
	modules = []
14
	for fileName in os.listdir(moddir):
887 migan 15
		if fileName[0] != '.' and fileName != "template":
819 migan 16
			modules.append(fileName)
17
 
18
	return modules
19
 
20
 
21
def getLocalModules():
22
	modules = []
23
	for fileName in os.listdir(localmoddir):
24
		if fileName[0] != '.':
25
			modules.append(fileName)
26
 
27
	return modules
28
 
29
 
30
def parseModuleIdFromFile(moduleName, fileName):
31
	config_inc = open(fileName, 'r') 
32
	config_inc_lines = config_inc.readlines()
33
	config_inc.close()
34
 
35
	for line in config_inc_lines:
36
		line = line.strip("\n").strip(" ")
827 migan 37
 
819 migan 38
		if line.find(moduleName + "_ID") != -1:
39
			parts = line.split("=")
40
			return parts[1].strip(" ")
41
 
42
	return -1;
43
 
44
 
45
def getFreeModuleId(moduleName):
46
	takenIds = []
827 migan 47
 
819 migan 48
	for applicationName in os.listdir("../"):
827 migan 49
 
819 migan 50
		if applicationName[0] != '.' and os.path.exists("../" + applicationName + "/config.inc"):
51
			takenId = parseModuleIdFromFile(moduleName, "../" + applicationName + "/config.inc")
52
			if takenId != -1 and takenId != "<ID>":
53
				takenIds.append(int(takenId, 16))
54
 
55
	if len(takenIds) == 0:
56
		return "0x01"
57
 
58
	takenIds.sort()
59
 
60
	lastId = 0
61
 
62
	for takenId in takenIds:
63
		if takenId != lastId+1:
64
			return hex(lastId+1)
827 migan 65
		lastId = takenId
819 migan 66
 
67
	return hex(lastId+1)
68
 
69
 
70
def compileMainFile():
71
	print "Compiling new main.c..."
72
	main_c_template = open('src/main.c.template', 'r') 
73
	main_c_template_lines = main_c_template.readlines()
74
	main_c_template.close()
75
 
76
	modules = getLocalModules()
77
 
78
	main_c = open('src/main.c', 'w') 
79
 
80
	for main_c_template_line in main_c_template_lines:
81
		pos_include = main_c_template_line.find('%INCLUDE')
82
		pos_init = main_c_template_line.find('%INIT')
83
		pos_process = main_c_template_line.find('%PROCESS')
84
		pos_list = main_c_template_line.find('%LIST')
85
		pos_handlemsg = main_c_template_line.find('%HANDLEMSG')
86
 
87
		if pos_include != -1:
88
			for moduleName in modules:
822 migan 89
				main_c.write(main_c_template_line[:pos_include] + "#include \"../modules/" + moduleName + "/" + moduleName + ".h\"\n")
819 migan 90
		elif pos_init != -1:
91
			for moduleName in modules:
839 migan 92
				main_c.write(main_c_template_line[:pos_init] + moduleName + "_Init();\n")
819 migan 93
		elif pos_process != -1:
94
			for moduleName in modules:
839 migan 95
				main_c.write(main_c_template_line[:pos_process] + moduleName + "_Process();\n")
819 migan 96
		elif pos_list != -1:
97
			count = 1
98
			for moduleName in modules:
839 migan 99
				main_c.write(main_c_template_line[:pos_list] + moduleName + "_List(" + str(count) + ");\n")
819 migan 100
				count += 1
101
		elif pos_handlemsg != -1:
102
			for moduleName in modules:
839 migan 103
				main_c.write(main_c_template_line[:pos_handlemsg] + moduleName + "_HandleMessage(&rxMsg);\n")
819 migan 104
		else:
105
			main_c.write(main_c_template_line)
106
 
107
	main_c.close()
108
 
109
	print "Creation of main.c complete"
110
 
111
def readConfigSection(fileName, sectionName):
112
	fileInstance = open(fileName, 'r')
113
	lines = fileInstance.readlines()
114
	fileInstance.close()
115
 
116
	sectionLines = []
117
 
118
	inSection = False
119
 
120
	for line in lines:
121
		if not inSection:
122
			if line.find("## Section " + sectionName) != -1:
123
				inSection = True
124
				sectionLines.append(line.strip("\n"))
125
		else:
126
			if line.find("## End section " + sectionName) != -1:
127
				inSection = False
128
 
129
			sectionLines.append(line.strip("\n"))
130
 
131
	return sectionLines
132
 
133
 
134
def updateConfigFile():
135
	print "Updating config.inc..."
136
 
137
	modules = getLocalModules()
138
	moduleSections = {}
139
	applicationSection = []
140
 
141
	if not os.path.exists("config.inc"):
142
		applicationSection = readConfigSection("src/config.inc.template", "application")
143
 
144
		for moduleName in modules:
145
			moduleSections[moduleName] = readConfigSection(localmoddir + "/" + moduleName + "/config.inc.template", moduleName)
146
	else:
147
		applicationSection = readConfigSection("config.inc", "application")
148
 
149
		for moduleName in modules:
150
			moduleSections[moduleName] = readConfigSection("config.inc", moduleName)
151
 
152
			if len(moduleSections[moduleName]) <= 1:
153
				moduleSections[moduleName] = readConfigSection(localmoddir + "/" + moduleName + "/config.inc.template", moduleName)
154
 
155
	timers = 0
156
 
157
	for moduleName, moduleSection in moduleSections.iteritems():
158
		c = 0
159
		for line in moduleSection:
160
			if line.find("<ID>") != -1:
161
				line = line.replace("<ID>", getFreeModuleId(moduleName))
162
			elif line.find("<TIMER>") != -1:
163
				line = line[:line.find("=")+1] + hex(timers) + " /* <TIMER> -- DO NOT REMOVE THIS COMMENT -- */"
164
				timers += 1
165
 
166
			moduleSection[c] = line;
167
			c += 1
168
 
169
	c = 0
170
	for line in applicationSection:
171
		if line.find("<TIMER>") != -1:
172
			line = line[:line.find("=")+1] + hex(timers) + " /* <TIMER> -- DO NOT REMOVE THIS COMMENT -- */"
173
			timers += 1
828 migan 174
		elif line.find("TIMER_NUM_TIMERS=") != -1:
175
			line = "TIMER_NUM_TIMERS=" + hex(timers)
176
		elif line.find("NUMBER_OF_MODULES=") != -1:
177
			line = "NUMBER_OF_MODULES=" + hex(len(modules))
819 migan 178
 
179
		applicationSection[c] = line;
180
		c += 1
181
 
182
	config_inc = open('config.inc', 'w')
183
 
184
	for line in applicationSection:
185
		config_inc.write(line + "\n")
186
 
187
	for moduleName, moduleSection in moduleSections.iteritems():
188
		for line in moduleSection:
189
			config_inc.write(line + "\n")
190
 
191
	config_inc.close()
192
 
193
	print "Update of config.inc complete"
194
 
195
 
196
def compileSourcesFile():
197
	print "Compiling sources.inc..."
198
 
199
	uniqueSet = []
200
 
201
	sources_list_template = open('src/sources.list.template', 'r')
202
	sources_list_template_lines = sources_list_template.readlines()
203
	sources_list_template.close()
204
 
205
	for sources_list_template_line in sources_list_template_lines:
847 migan 206
		line = sources_list_template_line.strip("\n").strip(" ")
207
		if len(line) > 0:
208
			if line[0] != '#':
209
				uniqueSet.append(line)
819 migan 210
 
211
	modules = getLocalModules()
212
 
213
	for moduleName in modules:
214
		sources_list = open(localmoddir + "/" + moduleName + "/sources.list", 'r')
215
		sources_list_lines = sources_list.readlines()
216
		sources_list.close()
217
 
218
		for sources_list_line in sources_list_lines:
847 migan 219
			line = sources_list_line.strip("\n").strip(" ")
220
			if len(line) > 0:
221
				if line[0] != '#':
222
					uniqueSet.append(line)
223
 
819 migan 224
 
225
	sourcesString = "SOURCES = "
226
 
227
	#FIXME: Make uniqueSet actually unique
228
 
229
	for line in uniqueSet:
230
		sourcesString += line + " "
231
 
232
	sources_inc = open('sources.inc', 'w')
233
	sources_inc.write(sourcesString.strip(" ") + "\n")
234
	sources_inc.close()
235
 
236
	print "Creation of sources.inc complete"
237
 
238
 
239
def regenerateModules():
240
	print "Regenerating modules..."
836 migan 241
	print ""
819 migan 242
	compileSourcesFile()
836 migan 243
	print ""
819 migan 244
	compileMainFile()
836 migan 245
	print ""
819 migan 246
	updateConfigFile()
836 migan 247
	print ""
819 migan 248
	print "Regenerating modules complete"
836 migan 249
	print ""
819 migan 250
 
251
 
252
def addModule(moduleName):
253
	print "Trying to add module " + moduleName
254
 
255
	try:
852 migan 256
		os.symlink(moddir + "/" + moduleName, localmoddir + "/" + moduleName)
820 migan 257
		print "Added module successfully"
819 migan 258
	except OSError, (errno, strerror):
259
		if errno == 17:
260
			print "A link, file or directory named " + moduleName + " is already present in the modules directory, not linking"
261
		else:
262
			raise
263
 
264
	print ""
265
 
266
	regenerateModules()
267
 
268
 
824 migan 269
def delModule(moduleName):
270
	print "Trying to remove module " + moduleName
271
 
272
	try:
273
		os.unlink(localmoddir + "/" + moduleName)
274
		print "Removed module successfully"
275
	except OSError, (errno, strerror):
276
		if errno == 2:
277
			print "No such " + moduleName + " present in the modules directory, not unlinking"
278
		else:
279
			raise
280
 
281
	print ""
282
 
283
	regenerateModules()
284
 
852 migan 285
def createFile(moduleName, templateFileName, moduleFileName):
286
	print "Creating " + moduleName + "/" + templateFileName + "..."
287
	template_file = open(moddir + "/template/" + templateFileName, 'r')
288
	lines = template_file.readlines()
289
	template_file.close()
824 migan 290
 
852 migan 291
	module_file = open(moddir + "/" + moduleName + "/" + moduleFileName, 'w')
292
 
293
	for line in lines:
294
		line = line.replace("<template>", moduleName)
295
		line = line.replace("<TEMPLATE>", moduleName.upper())
296
 
297
		module_file.write(line)
298
 
299
	module_file.close()
300
 
301
def newModule(moduleName):
302
	print "Creating " + moddir + "/" + moduleName + " directory..."
303
	os.mkdir(moddir + "/" + moduleName + "/")
304
 
305
	createFile(moduleName, "config.inc.template", "config.inc.template")
306
	createFile(moduleName, "sources.list", "sources.list")
307
	createFile(moduleName, "template.h", moduleName + ".h")
308
	createFile(moduleName, "template.c", moduleName + ".c")
309
 
819 migan 310
def usage():
836 migan 311
	print "Syntax: ./ModuleManager [options]"
819 migan 312
	print "Options:"
836 migan 313
	print "  --help               Print this help"
314
	print "  --regenerate         Regenarate modules and files"
315
	print "  --list               List avalible and installed modules"
316
	print "  --add=<module name>  Adds a module to the application"
317
	print "  --del=<module name>  Removes a module from the application"
852 migan 318
	print "  --new=<module name>  Creates a new module from the module template"
819 migan 319
	print ""
320
 
321
 
322
def main():
323
	try:
885 migan 324
		opts, args = getopt.getopt(sys.argv[1:], "hlrc", ["help", "list", "regenerate", "add=", "del=", "new="])
819 migan 325
	except getopt.GetoptError, err:
326
		# print help information and exit:
327
		print str(err) # will print something like "option -a not recognized"
328
		usage()
329
		sys.exit(2)
825 migan 330
 
331
	if len(sys.argv) == 1:
332
		usage()
333
		sys.exit()
334
 
819 migan 335
	for o, a in opts:
885 migan 336
		if o in ("-c"):
836 migan 337
			modules = getModules()
824 migan 338
 
885 migan 339
			for module in modules:
340
				print module
341
 
342
		elif o in ("-l", "--list"):
343
			modules = getModules()
344
 
836 migan 345
			print "Available modules"
346
			print "================="
347
			for module in modules:
348
				print module
349
 
885 migan 350
 
351
			if os.path.exists(localmoddir):
352
				print ""
836 migan 353
 
885 migan 354
				modules = getLocalModules()
836 migan 355
 
885 migan 356
				print "Modules used in this application"
357
				print "================================"
358
				for module in modules:
359
					print module
360
 
819 migan 361
		elif o in ("-h", "--help"):
362
			usage()
363
			sys.exit()
824 migan 364
 
819 migan 365
		elif o in ("-r", "--regenerate"):
366
			regenerateModules()
824 migan 367
 
819 migan 368
		elif o in ("--add"):
369
			if len(a) == 0:
370
				print "No modulename specified"
371
				usage()
372
				sys.exit()
373
 
374
			if a not in getModules():
375
				print a + " is not a recognized module name"
376
				sys.exit()
377
 
378
			addModule(a)
824 migan 379
 
380
		elif o in ("--del"):
381
			if len(a) == 0:
382
				print "No modulename specified"
383
				usage()
384
				sys.exit()
385
 
386
			if a not in getModules():
387
				print a + " is not a recognized module name"
388
				sys.exit()
389
 
390
			delModule(a)
391
 
852 migan 392
		elif o in ("--new"):
393
			if len(a) == 0:
394
				print "No modulename specified"
395
				usage()
396
				sys.exit()
397
 
398
			if a in getModules():
399
				print a + " already exists"
400
				sys.exit()
401
 
402
			newModule(a)
403
 
819 migan 404
		else:
405
			assert False, "unhandled option"
406
 
407
 
408
if __name__ == "__main__":
409
	main()
410