Subversion Repositories HomeAutomation

Rev

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
}