Subversion Repositories HomeAutomation

Rev

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

Rev 828 Rev 836
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'
9
moddir = '../../module' # FIXME: This is ugly
10
localmoddir = 'modules'
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
	compileSourcesFile()
237
	compileSourcesFile()
-
 
238
	print ""
237
	compileMainFile()
239
	compileMainFile()
-
 
240
	print ""
238
	updateConfigFile()
241
	updateConfigFile()
-
 
242
	print ""
239
	print "Regenerating modules complete"
243
	print "Regenerating modules complete"
-
 
244
	print ""
240
 
245
 
241
 
246
 
242
def addModule(moduleName):
247
def addModule(moduleName):
243
	print "Trying to add module " + moduleName
248
	print "Trying to add module " + moduleName
244
	
249
	
245
	try:
250
	try:
246
		os.symlink("../" + moddir + "/" + moduleName, localmoddir + "/" + moduleName)
251
		os.symlink("../" + moddir + "/" + moduleName, localmoddir + "/" + moduleName)
247
		print "Added module successfully"
252
		print "Added module successfully"
248
	except OSError, (errno, strerror):
253
	except OSError, (errno, strerror):
249
		if errno == 17:
254
		if errno == 17:
250
			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"
251
		else:
256
		else:
252
			raise
257
			raise
253
	
258
	
254
	print ""
259
	print ""
255
	
260
	
256
	regenerateModules()
261
	regenerateModules()
257
 
262
 
258
 
263
 
259
def delModule(moduleName):
264
def delModule(moduleName):
260
	print "Trying to remove module " + moduleName
265
	print "Trying to remove module " + moduleName
261
	
266
	
262
	try:
267
	try:
263
		os.unlink(localmoddir + "/" + moduleName)
268
		os.unlink(localmoddir + "/" + moduleName)
264
		print "Removed module successfully"
269
		print "Removed module successfully"
265
	except OSError, (errno, strerror):
270
	except OSError, (errno, strerror):
266
		if errno == 2:
271
		if errno == 2:
267
			print "No such " + moduleName + " present in the modules directory, not unlinking"
272
			print "No such " + moduleName + " present in the modules directory, not unlinking"
268
		else:
273
		else:
269
			raise
274
			raise
270
	
275
	
271
	print ""
276
	print ""
272
	
277
	
273
	regenerateModules()
278
	regenerateModules()
274
 
279
 
275
 
280
 
276
def usage():
281
def usage():
-
 
282
	print "Syntax: ./ModuleManager [options]"
277
	print "Options:"
283
	print "Options:"
-
 
284
	print "  --help               Print this help"
278
	print "\t--regenare\t\tRegenarate modules and files"
285
	print "  --regenerate         Regenarate modules and files"
279
	print "\t--list\t\t\tList avalible modules"
286
	print "  --list               List avalible and installed modules"
280
	print "\t--help\t\t\tPrint this help"
287
	print "  --add=<module name>  Adds a module to the application"
281
	print "\t--add=&lt;module name>\tAdds a module to the application"
288
	print "  --del=&lt;module name>  Removes a module from the application"
282
	print ""
289
	print ""
283
 
290
 
284
 
291
 
285
def main():
292
def main():
286
	try:
293
	try:
287
		opts, args = getopt.getopt(sys.argv[1:], "hlrd", ["help", "list", "regenerate", "add=", "del="])
294
		opts, args = getopt.getopt(sys.argv[1:], "hlr", ["help", "list", "regenerate", "add=", "del="])
288
	except getopt.GetoptError, err:
295
	except getopt.GetoptError, err:
289
		# print help information and exit:
296
		# print help information and exit:
290
		print str(err) # will print something like "option -a not recognized"
297
		print str(err) # will print something like "option -a not recognized"
291
		usage()
298
		usage()
292
		sys.exit(2)
299
		sys.exit(2)
293
	
300
	
294
	if len(sys.argv) == 1:
301
	if len(sys.argv) == 1:
295
		usage()
302
		usage()
296
		sys.exit()
303
		sys.exit()
297
	
304
	
298
	for o, a in opts:
305
	for o, a in opts:
299
		if o in ("-l", "--list"):
306
		if o in ("-l", "--list"):
300
			print getModules()
307
			modules = getModules()
-
 
308
			
-
 
309
			print "Available modules"
-
 
310
			print "================="
-
 
311
			for module in modules:
-
 
312
				print module
-
 
313
				
-
 
314
			print ""
-
 
315
			
-
 
316
			modules = getLocalModules()
-
 
317
			
-
 
318
			print "Modules used in this application"
-
 
319
			print "================================"
-
 
320
			for module in modules:
-
 
321
				print module
301
			
322
			
302
		elif o in ("-h", "--help"):
323
		elif o in ("-h", "--help"):
303
			usage()
324
			usage()
304
			sys.exit()
325
			sys.exit()
305
			
326
			
306
		elif o in ("-r", "--regenerate"):
327
		elif o in ("-r", "--regenerate"):
307
			regenerateModules()
328
			regenerateModules()
308
			
329
			
309
		elif o in ("--add"):
330
		elif o in ("--add"):
310
			if len(a) == 0:
331
			if len(a) == 0:
311
				print "No modulename specified"
332
				print "No modulename specified"
312
				usage()
333
				usage()
313
				sys.exit()
334
				sys.exit()
314
			
335
			
315
			if a not in getModules():
336
			if a not in getModules():
316
				print a + " is not a recognized module name"
337
				print a + " is not a recognized module name"
317
				sys.exit()
338
				sys.exit()
318
				
339
				
319
			addModule(a)
340
			addModule(a)
320
			
341
			
321
		elif o in ("--del"):
342
		elif o in ("--del"):
322
			if len(a) == 0:
343
			if len(a) == 0:
323
				print "No modulename specified"
344
				print "No modulename specified"
324
				usage()
345
				usage()
325
				sys.exit()
346
				sys.exit()
326
			
347
			
327
			if a not in getModules():
348
			if a not in getModules():
328
				print a + " is not a recognized module name"
349
				print a + " is not a recognized module name"
329
				sys.exit()
350
				sys.exit()
330
				
351
				
331
			delModule(a)
352
			delModule(a)
332
			
353
			
333
		else:
354
		else:
334
			assert False, "unhandled option"
355
			assert False, "unhandled option"
335
 
356
 
336
 
357
 
337
if __name__ == "__main__":
358
if __name__ == "__main__":
338
	main()
359
	main()
339
 
360