Rev 564 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 564 | linlun | 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", |
||
| 1398 | arune | 67 | PeerAddr => "deep.arune.se", |
| 564 | linlun | 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 | } |