Subversion Repositories HomeAutomation

Rev

Rev 1046 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  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";
  27.     print "example: ./$binaryname -x data.xml -c moduleid.h\n";
  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.  
  39. open (MYFILE, '>' . $cfile);
  40.  
  41. print MYFILE "// Built on $now by $binaryname\n";
  42. print MYFILE "// DO NOT CHANGE MANUALLY\n\n";
  43.  
  44.  
  45. print MYFILE "#ifndef MODULEID_H_\n";
  46. print MYFILE "#define MODULEID_H_\n\n";
  47.  
  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. {
  55.     my $className = $class->att('name');
  56.     $className =~ tr/a-z/A-Z/;
  57.     print MYFILE "#define CAN_MODULE_CLASS_$className " . $class->att('id') . "\n";
  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. {
  68.     my $commandName = $command->att('name');
  69.     $commandName =~ tr/a-z/A-Z/;
  70.     my $commandType = $command->att('type');
  71.     $commandType =~ tr/a-z/A-Z/;
  72.    
  73.     if ($commandType eq "SPECIFIC")
  74.     {
  75.         $commandType = $command->att('module');
  76.         $commandType =~ tr/a-z/A-Z/;
  77.     }
  78.    
  79.     print MYFILE "#define CAN_MODULE_CMD_" . $commandType . "_" . $commandName . " " . $command->att('id') . "\n";
  80. }
  81.  
  82. print MYFILE "\n";
  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_ENUM_" . $commandType . "_" . $commandName . "_" . $variableName . "_" . $valueName . " " . $value->att('id') . "\n";
  118.                 }
  119.             }
  120.         }
  121.     }
  122. }
  123.  
  124. print MYFILE "\n";
  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. {
  132.     my $className = $module->att('class');
  133.     $className =~ tr/a-z/A-Z/;
  134.     my $moduleName = $module->att('name');
  135.     $moduleName =~ tr/a-z/A-Z/;
  136.     print MYFILE "#define CAN_MODULE_TYPE_" . $className . "_" . $moduleName . " " . $module->att('id') . "\n";
  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. {
  147.     my $groupName = $define->att('group');
  148.     $groupName =~ tr/a-z/A-Z/;
  149.     my $defineName = $define->att('name');
  150.     $defineName =~ tr/a-z/A-Z/;
  151.     print MYFILE "#define " . $groupName . "_" . $defineName . " " . $define->att('id') . "\n";
  152. }
  153.  
  154. print MYFILE "\n";
  155.  
  156. print MYFILE "#endif /*MODULEID_H_*/\n";
  157.  
  158. close (MYFILE);
  159.  
  160. print "Successfully wrote " . $cfile . "\n";
  161.