Subversion Repositories HomeAutomation

Rev

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

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