Perl code omzetten naar Delphi

Status
Niet open voor verdere reacties.

cpri

Nieuwe gebruiker
Lid geworden
2 jan 2013
Berichten
2
Ik ben bezig met een programma om mijn thermostaat uit telezen om zo mijn temperatuur in huis te kunnen monitoren.
Hiervoor heb ik een perl script gevonden, graag wil ik dit omzetten naar Delphi zodat ik mijn eigen Windows programma hiervoor kan schrijven.
De perl code staat hier:
https://code.google.com/p/heatmiser-wifi/source/browse/trunk/bin/
Hierin zijn de volgende files van belang:
heatmiser.pl
heatmiser_wifi.pm

Nu loop ik stuk op de volgende code
Vanhuit het hoofdprogramma wordt de functie read_dcb aangeroepen.
Hierin vorden weer de functies/procedures command en respons aangeroepen.
Als ik kij naar de functie aanroep van command dan worden daar parameters aan door gegeven (de functie w2b is niets anders dan een omzetting van een word naar 2 bytes)
Ik de routine command zie ik echter niets terug van deze parameters. kan iemand mij uitleggen wat hier gebeurd (hoeft niet in Delphi mag ook in gewone mensen taal ;-) )
verder snap ik niet hoe de waarde voor de variabele cmd wordt berekend, ik kan geen definitie van deze variable vinden
Code:
sub read_dcb
{
    my ($self, $start, $octets) = @_;

    # Construct and issue the inquiry command
    $start = 0x0000 unless defined $start;
    $octets = 0xffff unless defined $octets;
    return undef unless $self->command(0x93, w2b($start), w2b($octets));

    # Read the response
    my ($op, @data) = $self->response();

    # Perform some basic sanity checks on the response
    die "Unexpected opcode in thermostat response\n" unless $op == 0x94;
    die "Start address mismatch in thermostat response\n" unless b2w(@data[0, 1]) == $start;
    my $length = b2w(@data[2, 3]);
    die "Incorrect PIN used\n" unless $length;
    die "Incorrect length of thermostat response\n" unless scalar @data == $length + 4;

    # Return the DCB portion of the response
    return @data[4 .. $#data];
}

# LOW LEVEL THERMOSTAT COMMAND TRANSPORT

# Construct an arbitrary thermostat command
sub command
{
    my ($self, $op, @data) = @_;

    # Ensure that a socket is open
    return undef unless $self->open();

    # Construct the command
    my $len = 7 + scalar @data;
    my @cmd = ($op, w2b($len), w2b($self->{pin}), @data);
    push @cmd, w2b(crc16(@cmd));

    # Convert the command to binary
    my $cmd = join('', map(chr, @cmd));

    # Send the command to the thermostat
    eval
    {
        $self->{socket}->send($cmd, 0) or die "Failed to send command to thermostat: $!\n";
    };
    if ($@)
    {
        # If there was any error then close the port and re-throw the error
        my $error = $@;
        eval { $self->close(); };
        die $error;
    }
    return 1;
}

Ik hoop dat iemand mij kan helpen met het omzetten van deze code
 
Met behulp van een hoop gegoogle heb ik de de volgende code gemaakt.
Met een beetje goede wil kan dit ook in Delphi korter maar dit is het meest duidelijk.
Het enig dat ik nog niet snap is waar @data vandaan komt.

De aanroep vanuit het hoofdprogramma is als volgt:
Code:
my @dcb = $heatmiser->read_dcb();

volgens mij houdt dit in dat de start en stop parameters in de read_dcb procedure ongedefinieerd zijn (immers de functie wordt zonder parameters aangeroepen)
dus geld er dat start = 0 en octets =0xffff
Nu wordt de procedure command aangeroepen met de volgende code
Code:
return undef unless $self->command(0x93, w2b($start), w2b($octets));
dit is dus command(0x93,0x00,0x00,0xff,0xff)

de procedure command begint met de volgende regel
Code:
my ($self, $op, @data) = @_;

Volgens my is nu $op = 0x93 maar wat @data nu is ik zou het niet weten, hopelijk kunnen jullie meer duidelijkheid verschaffen

Zolas belloft hieronder mijn Delphi code
Code:
procedure THeatMiser.command(Avalue, start, stop: word);
var
cmd: array of byte;
cmd_str:string;
len,i : word;
crc_16:word;
begin
len := 7 + length(data);
setlength(cmd,len);
cmd[0] := Avalue;
cmd[1] := w2b(len)[0];
cmd[2] := w2b(len)[1];
cmd[3] := w2b(pin)[0];
cmd[4] := w2b(pin)[1];
for i := 0 to len-8 do
 cmd[i+5] :=  data[i];
crc_16:=crc16(cmd);
cmd[i+6]:= w2b(crc_16)[0];
cmd[i+7]:= w2b(crc_16)[1];

for i := 0 to len-1 do
 cmd_str[i+1]:=chr(cmd[i]);
tcp_ip.IOHandler.WriteLn(cmd_str);

end;

Mocht imand op of aanmerking hebben dan hoor ik dat graag
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan