Subversion Repositories HomeAutomation

Rev

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

  1. #!/usr/bin/perl -w
  2. use IO::Socket;
  3. use integer;
  4. use threads;
  5.  
  6. @class = ();        #Klassid
  7. @class_txt = ();    #Klassnamn
  8. @class_layout = (); #Bitlayout för id-fältet för resp klass
  9. @class_layout_txt = (); #Namn på fälten i id
  10. @class_type_txt = ();   #textöversättningar för olika fält i id ( dela av med ';' för olika fält, ',' mellan översättningspar och ':' mellan
  11.             # txt och siffra
  12.  
  13. # Paketklasser:
  14. push (@class , "0x00");
  15. push (@class_txt , "CAN_NMT");
  16. push (@class_layout , "1,8,8,8");
  17. push (@class_layout_txt , "Reserved,TYPE,SID,RID");
  18. push (@class_type_txt, "
  19. ;0x00:TIME,0x04:RESET,0x08:BIOS_START,0x0c:PGM_START,0x10:PGM_DATA,0x14:PGM_END,0x18:PGM_COPY,0x1c:PGMACK,0x20:PGM:NACK,0x24:START_APP,0x28:APP_START,0x2c:HEARTBEAT;
  20. ;
  21. ");
  22.  
  23. push (@class , "0x02");
  24. push (@class_txt , "CAN_SNS");
  25. push (@class_layout , "10,6,9");
  26. push (@class_layout_txt , "SNS_TYPE,SNS_ID,SID");
  27. push (@class_type_txt, "0x10:STATUS,0x12:IR,0x14:TEMPERATUR,0x18:LIGHT,0x0b:RELAY_STATUS,0x0d:SERVO_STATUS; ; ");
  28.  
  29. push (@class , "0x04");
  30. push (@class_txt , "CAN_ACT");
  31. push (@class_layout , "10,6,9");
  32. push (@class_layout_txt , "ACT_TYPE,ACT_ID,SID");
  33. push (@class_type_txt, "0x01:RELAY,0x02:SERVO,0x05:PWM,0x06:PID,0x03:RGBLED; ; ");
  34.  
  35. push (@class , "0x06");
  36. push (@class_txt , "CAN_PKT");
  37. push (@class_layout , "25");
  38. push (@class_layout_txt , "DATA");
  39. push (@class_type_txt, " ");
  40.  
  41. push (@class , "0x08");
  42. push (@class_txt , "CAN_CON");
  43. push (@class_layout , "25");
  44. push (@class_layout_txt , "DATA");
  45. push (@class_type_txt, " ");
  46.  
  47. push (@class , "0x0f");
  48. push (@class_txt , "CAN_TST");
  49. push (@class_layout , "25");
  50. push (@class_layout_txt , "DATA");
  51. push (@class_type_txt, " ");
  52.  
  53. push (@class , "0x05");
  54. push (@class_txt , "CAN_ACT_CONF");
  55. push (@class_layout , "10,6,9");
  56. push (@class_layout_txt , "ACT_TYPE,ACT_ID,SID");
  57. push (@class_type_txt, " ;0x05:PWM,0x06:PID; ");
  58.  
  59. print "---------------------------------\n";
  60. print "CAN-Interpreter 0.1\n";
  61. print "Makes the output from canDaemon easy to read\n";
  62. print "---------------------------------\n";
  63.  
  64. print "Initiating sockets to canDaemon...";
  65. $remote = IO::Socket::INET->new(
  66.                     Proto    => "tcp",
  67.                     PeerAddr => "localhost",
  68.                     PeerPort => "1200",
  69.                 )
  70.                or die " FAIL: cannot connect to port 1200 at localhost";
  71.  
  72. print "Success!\n";
  73.  
  74. print "Checking the length of the class arrays...";
  75. #get the lengths of the class arrays:
  76. $class = @class;
  77. $class_txt = @class_txt;
  78. $class_layout = @class_layout;
  79. $class_layout_txt = @class_layout_txt;
  80. $class_type_txt = @class_type_txt;
  81. if ($class != $class_txt || $class != $class_layout || $class != $class_layout_txt || $class != $class_type_txt ) {
  82.         print "All class vectors must be same length\n";
  83.         exit;
  84. }
  85.  
  86. print "Success!\n";
  87. @curr_class_layout = ();
  88. @curr_class_layout_txt = ();
  89. #read line from socket (blocking)
  90. while ( $line = <$remote> ) {
  91.     if (length($line) > 12) {
  92.         $class_found = 0;           #used to print raw data if the packet type isn't defined
  93.         $id = hex(substr($line, 4, 8));     #id as a hex string
  94.         $bin_id = sprintf ("%.29b", $id);   #id as a binary string
  95.         $pkt_class = sprintf("%#.2x" , oct("0b".substr($bin_id , 0 , 4))); #first four bits as hex
  96.         if ($pkt_class eq "00") {   #Fix to make class id 0x00 work
  97.             $pkt_class = "0x00";
  98.         }
  99.         for ($i = 0; $i < $class; $i++) {
  100.             if ($class[$i] eq $pkt_class) {     #determine class
  101.                 $class_found = 1;
  102.                 @curr_class_layout = split (',',$class_layout[$i]);
  103.                 @curr_class_layout_txt = split (',',$class_layout_txt[$i]);
  104.                 @curr_class_type_txt = split (';',$class_type_txt[$i]);
  105.                 print "Klass: ".$class_txt[$i]." >";
  106.                 $id_index = 4;
  107.                 for ($j = 0; $j < @curr_class_layout ; $j++) {  #replaces hex numbers with the text defined in
  108.                                         # $class_type_txt
  109.                     @id_field_txt = split (',' , $curr_class_type_txt[$j]);
  110.                     $data = sprintf("%#.2x" , oct("0b".substr($bin_id , $id_index , $curr_class_layout[$j])));
  111.                     for ($n = 0; $n < @id_field_txt; $n++) {
  112.                         #print $id_field_txt[$n]."\n";
  113.                         @field = split(':' , $id_field_txt[$n]);
  114.                         if ($data eq $field[0]) {
  115.                             $data = $field[1];
  116.                             #break;
  117.                         }
  118.                     }              
  119.                     $id_index = $id_index + $curr_class_layout[$j];
  120.                     print " ".$curr_class_layout_txt[$j].": ".$data;
  121.                 }
  122.                 print " Data: ".substr($line, 17, length($line)-18)."\n";
  123.             }
  124.         }
  125.         if ($class_found == 0) {
  126.             print $line;
  127.         }
  128.     }
  129. }
  130.