mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-14 05:46:35 +00:00
CULflash
git-svn-id: https://svn.fhem.de/fhem/trunk@928 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d25e1bec4b
commit
2364c55219
@ -4,19 +4,25 @@ use warnings;
|
|||||||
use IO::Socket;
|
use IO::Socket;
|
||||||
|
|
||||||
sub CommandUpdatefhem($$);
|
sub CommandUpdatefhem($$);
|
||||||
|
sub CommandCULflash($$);
|
||||||
|
|
||||||
my $server = "fhem.de:80";
|
my $server = "fhem.de:80";
|
||||||
my $sdir = "/fhemupdate";
|
my $sdir = "/fhemupdate";
|
||||||
my $ftime = "filetimes.txt";
|
my $ftime = "filetimes.txt";
|
||||||
|
my $dfu = "dfu-programmer";
|
||||||
|
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
sub
|
sub
|
||||||
updatefhem_Initialize($$)
|
updatefhem_Initialize($$)
|
||||||
{
|
{
|
||||||
my %lhash = ( Fn=>"CommandUpdatefhem",
|
my %fhash = ( Fn=>"CommandUpdatefhem",
|
||||||
Hlp=>",update fhem from the nightly CVS checkout" );
|
Hlp=>",update fhem from the nightly CVS" );
|
||||||
$cmds{updatefhem} = \%lhash;
|
$cmds{updatefhem} = \%fhash;
|
||||||
|
|
||||||
|
my %chash = ( Fn=>"CommandCULflash",
|
||||||
|
Hlp=>"<cul> <type>,flash the CUL from the nightly CVS" );
|
||||||
|
$cmds{CULflash} = \%chash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -27,7 +33,6 @@ CommandUpdatefhem($$)
|
|||||||
my ($cl, $param) = @_;
|
my ($cl, $param) = @_;
|
||||||
my $lt = "";
|
my $lt = "";
|
||||||
my $ret = "";
|
my $ret = "";
|
||||||
|
|
||||||
#my $moddir = "$attr{global}{modpath}/FHEM";
|
#my $moddir = "$attr{global}{modpath}/FHEM";
|
||||||
my $moddir = "XXX";
|
my $moddir = "XXX";
|
||||||
|
|
||||||
@ -62,6 +67,7 @@ CommandUpdatefhem($$)
|
|||||||
next if($f ne $param);
|
next if($f ne $param);
|
||||||
} else {
|
} else {
|
||||||
next if($oldtime{$f} && $filetime{$f} eq $oldtime{$f});
|
next if($oldtime{$f} && $filetime{$f} eq $oldtime{$f});
|
||||||
|
next if($f =~ m/.hex$/); # skip firmware files
|
||||||
}
|
}
|
||||||
my $localfile = "$moddir/$f";
|
my $localfile = "$moddir/$f";
|
||||||
my $remfile = $f;
|
my $remfile = $f;
|
||||||
@ -101,6 +107,68 @@ CommandUpdatefhem($$)
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
CommandCULflash($$)
|
||||||
|
{
|
||||||
|
my ($cl, $param) = @_;
|
||||||
|
#my $moddir = "$attr{global}{modpath}/FHEM";
|
||||||
|
my $moddir = "XXX";
|
||||||
|
|
||||||
|
my %ctypes = (
|
||||||
|
CUL_V2 => "at90usb162",
|
||||||
|
CUL_V2_HM => "at90usb162",
|
||||||
|
CUL_V3 => "atmega32u4",
|
||||||
|
CUL_V4 => "atmega32u2",
|
||||||
|
);
|
||||||
|
my @a = split("[ \t]+", $param);
|
||||||
|
return "Usage: CULflash <Fhem-CUL-Device> <CUL-type>, ".
|
||||||
|
"where <CUL-type> is one of ". join(" ", sort keys %ctypes)
|
||||||
|
if(int(@a) != 2 ||
|
||||||
|
!$defs{$a[0]} ||
|
||||||
|
$defs{$a[0]}{TYPE} ne "CUL" ||
|
||||||
|
!$ctypes{$a[1]});
|
||||||
|
|
||||||
|
my $cul = $a[0];
|
||||||
|
my $target = $a[1];
|
||||||
|
|
||||||
|
################################
|
||||||
|
# First get the index file to prove the file size
|
||||||
|
my $filetimes = GetHttpFile($server, "$sdir/$ftime");
|
||||||
|
return "Can't get $ftime from $server" if(!$filetimes);
|
||||||
|
|
||||||
|
my (%filetime, %filesize);
|
||||||
|
foreach my $l (split("[\r\n]", $filetimes)) {
|
||||||
|
chomp($l);
|
||||||
|
return "Corrupted filetimes.txt file"
|
||||||
|
if($l !~ m/^20\d\d-\d\d-\d\d_\d\d:\d\d:\d\d /);
|
||||||
|
my ($ts, $fs, $file) = split(" ", $l, 3);
|
||||||
|
$filetime{$file} = $ts;
|
||||||
|
$filesize{$file} = $fs;
|
||||||
|
}
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Now get the firmware file:
|
||||||
|
my $content = GetHttpFile($server, "$sdir/$target.hex");
|
||||||
|
return "File size for $target.hex does not correspond to filetimes.txt entry"
|
||||||
|
if(length($content) ne $filesize{"$target.hex"});
|
||||||
|
my $localfile = "$moddir/$target.hex";
|
||||||
|
open(FH,">$localfile") || return "Can't write $localfile";
|
||||||
|
print FH $content;
|
||||||
|
close(FH);
|
||||||
|
|
||||||
|
my $cmd = "($dfu MCU erase && $dfu MCU flash TARGET && $dfu MCU start) 2>&1";
|
||||||
|
my $mcu = $ctypes{$target};
|
||||||
|
$cmd =~ s/MCU/$mcu/g;
|
||||||
|
$cmd =~ s/TARGET/$localfile/g;
|
||||||
|
|
||||||
|
CUL_SimpleWrite($defs{CUL}, "B01");
|
||||||
|
sleep(4); # B01 needs 2 seconds for the reset
|
||||||
|
Log 1, $cmd;
|
||||||
|
my $result = `$cmd`;
|
||||||
|
Log 1, $result;
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
GetHttpFile($$)
|
GetHttpFile($$)
|
||||||
{
|
{
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
<a href="#attr">attr</a>
|
<a href="#attr">attr</a>
|
||||||
|
<a href="#CULflash">CULflash</a>
|
||||||
<a href="#define">define</a>
|
<a href="#define">define</a>
|
||||||
<a href="#delete">delete</a>
|
<a href="#delete">delete</a>
|
||||||
<a href="#deleteattr">deleteattr</a>
|
<a href="#deleteattr">deleteattr</a>
|
||||||
@ -534,15 +535,36 @@ A line ending with \ will be concatenated with the next one, so long lines
|
|||||||
<code>updatefhem [filename]</code> <br>
|
<code>updatefhem [filename]</code> <br>
|
||||||
<br>
|
<br>
|
||||||
Update the fhem modules and documentation from a nightly CVS chekout. For
|
Update the fhem modules and documentation from a nightly CVS chekout. For
|
||||||
this purpose fhem contants http://fhem.de, compares the stored timestamps
|
this purpose fhem contacts http://fhem.de/fhemupdate, compares the stored
|
||||||
of the local files with the filelist on the server, and downloads the files
|
timestamps of the local files with the filelist on the server, and
|
||||||
changed on the server. For all downloaded modules a reload will be
|
downloads the files changed on the server. For all downloaded modules a
|
||||||
scheduled if the corresponding module is loaded.<br>
|
reload will be scheduled if the corresponding module is loaded.<br>
|
||||||
If an explicit filename is given, then this file will be downloaded
|
If an explicit filename is given, then this file will be downloaded
|
||||||
unconditionally.<br>
|
unconditionally.<br>
|
||||||
Note: if the main program (fhem.pl) is changed, a manual restart of fhem
|
Note: if the main program (fhem.pl) is changed, a manual restart of fhem
|
||||||
will be necessary to apply the changes.
|
will be necessary to apply the changes.
|
||||||
<br> </ul>
|
<br>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<a name="CULflash"></a>
|
||||||
|
<h3>CULflash</h3>
|
||||||
|
<ul>
|
||||||
|
<code>CULflash <CUL-Name> <CUL-Version></code> <br>
|
||||||
|
<br>
|
||||||
|
Download the CUL firmware from a nightly CVS chekout and flash the
|
||||||
|
hardware. Currently only the CUL is supported with its versions:
|
||||||
|
CUL_V2, CUL_V2_HM, CUL_V3, CUL_V4.<br>
|
||||||
|
<b>Note:</b> dfu-programmer has to be installed in the path.<br>
|
||||||
|
If the CUL is not yet flashed, then first define a <a href="#CUL">CUL</a>
|
||||||
|
device (even if fhem won't be able to open the device), insert it with the
|
||||||
|
button pressed (this will set the device into flash-mode), then issue the
|
||||||
|
CULflash command.<br>
|
||||||
|
Example:
|
||||||
|
<ul>
|
||||||
|
<code>fhem> CULflash CUL CUL_V3</code>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<a name="list"></a>
|
<a name="list"></a>
|
||||||
<h3>list</h3>
|
<h3>list</h3>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user