Subversion Repositories HomeAutomation

Rev

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

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