Subversion Repositories HomeAutomation

Rev

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