Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
945 runge 1
#!/usr/bin/perl
2
 
3
# Written by Mattias Runge 2008
4
 
5
use XML::Twig;
6
use Getopt::Long;
7
 
8
$binaryname = "makeCanId.pl";
9
if (@ARGV > 0)
10
{
11
	GetOptions(	"xmlfile=s" 	=> \$xmlfile,
12
			"cfile=s" 	=> \$cfile);
13
}
14
else
15
{
16
	$help = 1;
17
}
18
 
19
if ($help)
20
{
21
	print "Usage ./$binaryname [options]\n";
22
	print "Options:\n";
23
	print "  -x <xmlfile>			Choose xmlfile to parse\n";
24
	print "  -c <headerfile> 		Choose header file to write\n";
25
	print "  -h 				Shows this usage\n";
26
	print "\n";
947 runge 27
	print "example: ./$binaryname -x data.xml -c moduleid.h\n";
945 runge 28
 
29
	exit 0;
30
}
31
 
32
my $now = localtime time;
33
my $twig = XML::Twig->new();
34
 
35
$twig->parsefile($xmlfile);
36
 
37
my $root = $twig->root;
38
 
947 runge 39
open (MYFILE, '>' . $cfile);
945 runge 40
 
947 runge 41
print MYFILE "// Built on $now by $binaryname\n";
42
print MYFILE "// DO NOT CHANGE MANUALLY\n\n";
945 runge 43
 
965 runge 44
 
45
print MYFILE "#ifndef MODULEID_H_\n";
46
print MYFILE "#define MODULEID_H_\n\n";
47
 
945 runge 48
print MYFILE "//------------------ //\n";
49
print MYFILE "// Class definitions //\n";
50
print MYFILE "//------------------ //\n";
51
print MYFILE "\n";
52
 
53
foreach my $class ($root->first_child('classes')->children('class'))
54
{
950 runge 55
	my $className = $class->att('name');
945 runge 56
	$className =~ tr/a-z/A-Z/;
947 runge 57
	print MYFILE "#define CAN_MODULE_CLASS_$className " . $class->att('id') . "\n";
945 runge 58
}
59
 
60
print MYFILE "\n";
61
print MYFILE "//-------------------- //\n";
62
print MYFILE "// Command definitions //\n";
63
print MYFILE "//-------------------- //\n";
64
print MYFILE "\n";
65
 
66
foreach my $command ($root->first_child('commands')->children('command'))
67
{
950 runge 68
	my $commandName = $command->att('name');
945 runge 69
	$commandName =~ tr/a-z/A-Z/;
950 runge 70
	my $commandType = $command->att('type');
945 runge 71
	$commandType =~ tr/a-z/A-Z/;
950 runge 72
 
73
	if ($commandType eq "SPECIFIC")
74
	{
75
		$commandType = $command->att('module');
76
		$commandType =~ tr/a-z/A-Z/;
77
	}
78
 
947 runge 79
	print MYFILE "#define CAN_MODULE_CMD_" . $commandType . "_" . $commandName . " " . $command->att('id') . "\n";
945 runge 80
}
81
 
82
print MYFILE "\n";
1046 runge 83
print MYFILE "//------------------------------- //\n";
84
print MYFILE "// Command enum value definitions //\n";
85
print MYFILE "//------------------------------- //\n";
86
print MYFILE "\n";
87
 
88
foreach my $command ($root->first_child('commands')->children('command'))
89
{
90
	my $commandName = $command->att('name');
91
	$commandName =~ tr/a-z/A-Z/;
92
	my $commandType = $command->att('type');
93
	$commandType =~ tr/a-z/A-Z/;
94
 
95
	if ($commandType eq "SPECIFIC")
96
	{
97
		$commandType = $command->att('module');
98
		$commandType =~ tr/a-z/A-Z/;
99
	}
100
 
101
	if ($command->first_child('variables'))
102
	{
103
		foreach my $variable ($command->first_child('variables')->children('variable'))
104
		{
105
			my $variableName = $variable->att('name');
106
			$variableName =~ tr/a-z/A-Z/;
107
			my $variableType = $variable->att('type');
108
			$variableType =~ tr/a-z/A-Z/;
109
 
110
			if ($variableType eq "ENUM")
111
			{
112
				foreach my $value ($variable->children('value'))
113
				{
114
					my $valueName = $value->att('name');
115
					$valueName =~ tr/a-z/A-Z/;
116
 
117
					print MYFILE "#define CAN_MODULE_CMD_ENUM_" . $commandType . "_" . $commandName . "_" . $variableName . "_" . $valueName . " " . $value->att('id') . "\n";
118
				}
119
			}
120
		}
121
	}
122
}
123
 
124
print MYFILE "\n";
945 runge 125
print MYFILE "//------------------- //\n";
126
print MYFILE "// Module definitions //\n";
127
print MYFILE "//------------------- //\n";
128
print MYFILE "\n";
129
 
130
foreach my $module ($root->first_child('modules')->children('module'))
131
{
950 runge 132
	my $className = $module->att('class');
945 runge 133
	$className =~ tr/a-z/A-Z/;
950 runge 134
	my $moduleName = $module->att('name');
945 runge 135
	$moduleName =~ tr/a-z/A-Z/;
947 runge 136
	print MYFILE "#define CAN_MODULE_TYPE_" . $className . "_" . $moduleName . " " . $module->att('id') . "\n";
945 runge 137
}
138
 
139
print MYFILE "\n";
140
print MYFILE "//----------------- //\n";
141
print MYFILE "// Misc definitions //\n";
142
print MYFILE "//----------------- //\n";
143
print MYFILE "\n";
144
 
145
foreach my $define ($root->first_child('defines')->children('define'))
146
{
950 runge 147
	my $groupName = $define->att('group');
945 runge 148
	$groupName =~ tr/a-z/A-Z/;
950 runge 149
	my $defineName = $define->att('name');
945 runge 150
	$defineName =~ tr/a-z/A-Z/;
947 runge 151
	print MYFILE "#define " . $groupName . "_" . $defineName . " " . $define->att('id') . "\n";
945 runge 152
}
153
 
154
print MYFILE "\n";
155
 
965 runge 156
print MYFILE "#endif /*MODULEID_H_*/\n";
157
 
945 runge 158
close (MYFILE);
159
 
160
print "Successfully wrote " . $cfile . "\n";