Subversion Repositories HomeAutomation

Rev

Rev 836 | Rev 847 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

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