CULflash generalization

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@6385 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-08-09 11:36:20 +00:00
parent 5fe80eefa0
commit 6e9e9a8077
2 changed files with 191 additions and 160 deletions

View File

@ -1,6 +1,5 @@
############################################## ##############################################
# $Id$ # $Id$
# modified by M. Fischer
package main; package main;
use strict; use strict;
use warnings; use warnings;
@ -8,10 +7,7 @@ use HttpUtils;
sub CommandCULflash($$); sub CommandCULflash($$);
my $host = "http://fhem.de"; my $urlbase = "http://fhem.de/fhemupdate4/svn/";
my $path = "/fhemupdate4/svn/";
my $file = "controls_fhem.txt";
my $dfu = "dfu-programmer";
##################################### #####################################
sub sub
@ -28,65 +24,70 @@ sub
CommandCULflash($$) CommandCULflash($$)
{ {
my ($cl, $param) = @_; my ($cl, $param) = @_;
my $modpath = (-d "updatefhem.dir" ? "updatefhem.dir":$attr{global}{modpath});
my $moddir = "$modpath/FHEM";
my %ctypes = ( my %ctypes = (
CUL_V2 => "at90usb162", CUL_V2 =>
CUL_V2_HM => "at90usb162", { cmd => 'dfu-programmer at90usb162 erase && '.
CUL_V3 => "atmega32u4", 'dfu-programmer at90usb162 flash $filepath && '.
CUL_V4 => "atmega32u2", 'dfu-programmer at90usb162 start',
flash => 'CUL_SimpleWrite($defs{$device},"B01");sleep(4); undef;' },
CUL_V2_HM =>
{ cmd => 'dfu-programmer at90usb162 erase && '.
'dfu-programmer at90usb162 flash $filepath && '.
'dfu-programmer at90usb162 start',
flash => 'CUL_SimpleWrite($defs{$device},"B01");sleep(4); undef;' },
CUL_V3 =>
{ cmd => 'dfu-programmer atmega32u4 erase && '.
'dfu-programmer atmega32u4 flash $filepath && '.
'dfu-programmer atmega32u4 start',
flash => 'CUL_SimpleWrite($defs{$device},"B01");sleep(4); undef;' },
CUL_V4 =>
{ cmd => 'dfu-programmer atmega32u2 erase && '.
'dfu-programmer atmega32u2 flash $filepath && '.
'dfu-programmer atmega32u2 start',
flash => 'CUL_SimpleWrite($defs{$device},"B01");sleep(4); undef' },
); );
my @a = split("[ \t]+", $param); my @a = split("[ \t]+", $param);
return "Usage: CULflash <Fhem-CUL-Device> <CUL-type>, ". return "Usage: CULflash [FHEM-Device|none] TYPE>, ".
"where <CUL-type> is one of ". join(" ", sort keys %ctypes) "where TYPE is one of ". join(" ", sort keys %ctypes)
if(!(int(@a) == 2 && if(int(@a)!=2 || !($a[0] eq "none" || $defs{$a[0]}) || !$ctypes{$a[1]});
($a[0] eq "none" || ($defs{$a[0]} && $defs{$a[0]}{TYPE} eq "CUL")) &&
$ctypes{$a[1]}));
my $cul = $a[0]; my $device = $a[0];
my $target = $a[1]; my $type = $a[1];
my $filename = $a[1].".hex";
my $fwdir = $attr{global}{modpath} . "/FHEM/firmware";
my $filepath = "$fwdir/$filename";
################################ ################################
# First get the index file to prove the file size # Get the firmware file:
my $filetimes = GetFileFromURL("$host$path$file"); if(! -d $fwdir) {
return "Can't get $host$path$file" if(!$filetimes); mkdir($fwdir) || return "$fwdir: $!";
}
my %filesize; my $content = GetFileFromURL("$urlbase/FHEM/firmware/$filename");
foreach my $l (split("[\r\n]", $filetimes)) { return "Cannot get $urlbase/FHEM/firmware/$filename"
chomp($l); if(!$content);
next if ($l !~ m/^UPD (20\d\d-\d\d-\d\d_\d\d:\d\d:\d\d) (\d+) (.*)$/); if($content !~ m/:00000001FF/) {
$filesize{$3} = $2; Log3 undef, 3, $content;
return "The retrieved $filename is not a correct .hex file";
} }
return "FHEM/$target.hex is not found in $host$path$file"
if(!$filesize{"FHEM/$target.hex"});
################################ my $localfile = "$filepath";
# Now get the firmware file:
my $content = GetFileFromURL("$host$path/FHEM/$target.hex");
return "File size for $target.hex does not correspond to $file entry"
if(length($content) ne $filesize{"FHEM/$target.hex"});
my $localfile = "$moddir/$target.hex";
open(FH,">$localfile") || return "Can't write $localfile"; open(FH,">$localfile") || return "Can't write $localfile";
print FH $content; print FH $content;
close(FH); close(FH);
my $cmd = "($dfu MCU erase && $dfu MCU flash TARGET && $dfu MCU start) 2>&1"; if($device ne "none" && $ctypes{$type}{flash}) {
my $mcu = $ctypes{$target}; my $ret = eval $ctypes{$type}{flash};
$cmd =~ s/MCU/$mcu/g; Log 1, "CULflash $device: $ret"
$cmd =~ s/TARGET/$localfile/g; if($ret);
if($cul ne "none") {
CUL_SimpleWrite($defs{$cul}, "B01");
sleep(4); # B01 needs 2 seconds for the reset
} }
my $cmd = eval "return \"$ctypes{$type}{cmd};\"";
Log3 undef, 1, "CULflash $cmd"; Log3 undef, 1, "CULflash $cmd";
my $result = `$cmd`; my $result = `($cmd) 2>&1`;
Log3 undef, 1, "CULflash $result"; Log3 undef, 1, "CULflash $result";
return $result; return $result;
} }
# vim: ts=2:et
1; 1;
=pod =pod
@ -95,15 +96,18 @@ CommandCULflash($$)
<a name="CULflash"></a> <a name="CULflash"></a>
<h3>CULflash</h3> <h3>CULflash</h3>
<ul> <ul>
<code>CULflash &lt;CUL-Name&gt; &lt;CUL-Version&gt;</code> <br> <code>CULflash [fhem-device|none]; &lt;TYPE&gt;</code> <br>
<br> <br>
Download the CUL firmware from a nightly SVN chekout and flash the Download the firmware from a nightly SVN chekout and flash the
hardware. Currently only the CUL is supported with its versions: hardware.
Currently the CUL is supported with its versions:
CUL_V2, CUL_V2_HM, CUL_V3, CUL_V4.<br> CUL_V2, CUL_V2_HM, CUL_V3, CUL_V4.<br>
<b>Note:</b> dfu-programmer has to be installed in the path, this is If the fhem-device is none, than the inserted device must already be in the
already the case with the Fritz!Box 7390 image from fhem.de<br> flash-mode.<br>
<b>Note:</b>for flashing the CUL dfu-programmer has to be installed in the
path, this is already the case with the Fritz!Box 7390 image from
fhem.de<br>
If the CUL is not yet flashed, then specify "none" as CUL-Name.
Example: Example:
<ul> <ul>
<code>CULflash CUL CUL_V3<br> <code>CULflash CUL CUL_V3<br>
@ -113,6 +117,33 @@ CommandCULflash($$)
normal on the FB7390. normal on the FB7390.
</ul> </ul>
=end html =end html
=begin html_DE
<a name="CULflash"></a>
<h3>CULflash</h3>
<ul>
<code>CULflash [fhem-device|none]; &lt;TYPE&gt;</code> <br>
<br>
L&auml;dt die spezifizierte Firmware von fhem.de und programmiert das
angeschlossene Ger&auml;t.
Z.Zt unterst&uuml;tzt wird das CUL und folgende Versionen:
CUL_V2, CUL_V2_HM, CUL_V3, CUL_V4.<br>
Falls als fhem-device none angegeben wurde, dann muss sich das
angeschlossene Ger&auml;t bereits in flash-mode befinden.<br>
<b>Achtung:</b>F&uuml;r CUL flashen muss dfu-programmer installiert und im
Pfad auffindbar sein, das ist der Fall bei dem Fritz!BOX 7390 Paket von
fhem.de<br>
Beispiele:
<ul>
<code>CULflash CUL CUL_V3<br>
CULflash none CUL_V3</code>
</ul>
Achtung: die Meldung "dfu-programmer: failed to release interface 0." ist
auf der FB7390 "normal".
</ul>
=end html_DE
=cut =cut

View File

@ -26,45 +26,41 @@ die "SVN failed, exiting\n" if($?);
`../copyfiles.sh`; `../copyfiles.sh`;
for(my $loop = 0; $loop < 2; $loop++) {
################################# #################################
# new Style # new Style
chdir("$homedir/fhem"); chdir("$homedir/fhem");
my $uploaddir2= ($loop ? "fhemupdate4" : "fhemupdate2"); my $uploaddir2 = "fhemupdate4";
system("mkdir -p $uploaddir2"); system("mkdir -p $uploaddir2");
my %filelist2 = ( my %filelist2 = (
"./fhem.pl.txt" => { type=>",fhem,", dir=>"." }, "./fhem.pl.txt" => { type=>",fhem,", dir=>"." },
"./CHANGED" => { type=>",fhem,", dir=>"." }, "./CHANGED" => { type=>",fhem,", dir=>"." },
"./configDB.pm" => { type=>",fhem,", dir=>"." },
"FHEM/.*.pm" => { type=>",fhem,", dir=>"FHEM" }, "FHEM/.*.pm" => { type=>",fhem,", dir=>"FHEM" },
"FHEM/FhemUtils/.*.pm" => { type=>",fhem,", dir=>"FHEM/FhemUtils"}, "FHEM/FhemUtils/.*.pm" => { type=>",fhem,", dir=>"FHEM/FhemUtils"},
"FHEM/FhemUtils/update-.*", => { type=>",fhem,", dir=>"FHEM/FhemUtils"}, "FHEM/FhemUtils/update-.*", => { type=>",fhem,", dir=>"FHEM/FhemUtils"},
"FHEM/lib/.*.pm" => { type=>",fhem,", dir=>"FHEM/lib"}, "FHEM/lib/.*.pm" => { type=>",fhem,", dir=>"FHEM/lib"},
"FHEM/lib/.*.xml" => { type=>",fhem,", dir=>"FHEM/lib"},
"FHEM/lib/SWAP/.*.xml" => { type=>",fhem,", dir=>"FHEM/lib/SWAP"}, "FHEM/lib/SWAP/.*.xml" => { type=>",fhem,", dir=>"FHEM/lib/SWAP"},
"FHEM/lib/SWAP/panStamp/.*" => { type=>",fhem,", dir=>"FHEM/lib/SWAP/panStamp"}, "FHEM/lib/SWAP/panStamp/.*" => { type=>",fhem,", dir=>"FHEM/lib/SWAP/panStamp"},
"FHEM/lib/SWAP/justme/.*" => { type=>",fhem,", dir=>"FHEM/lib/SWAP/justme"}, "FHEM/lib/SWAP/justme/.*" => { type=>",fhem,", dir=>"FHEM/lib/SWAP/justme"},
"FHEM/lib/Device/.*.pm" => { type=>",fhem,", dir=>"FHEM/lib/Device"}, "FHEM/lib/Device/.*.pm" => { type=>",fhem,", dir=>"FHEM/lib/Device"},
"FHEM/lib/Device/Firmata/.*.pm"=>{ type=>",fhem,", dir=>"FHEM/lib/Device/Firmata"}, "FHEM/lib/Device/Firmata/.*.pm"=>{ type=>",fhem,", dir=>"FHEM/lib/Device/Firmata"},
"../culfw/Devices/CUL/.*.hex" => { type=>",fhem,", dir=>"FHEM",
dir3=>"FHEM", },
"www/pgm2/.*" => { type=>"fhem,", dir=>"www/pgm2"}, "www/pgm2/.*" => { type=>"fhem,", dir=>"www/pgm2"},
"www/jscolor/.*" => { type=>"fhem,", dir=>"www/pgm2"}, "www/jscolor/.*" => { type=>"fhem,", dir=>"www/pgm2"},
"www/codemirror/.*" => { type=>"fhem,", dir=>"www/pgm2"},
"www/gplot/.*.gplot" => { type=>"fhem,", dir=>"www/pgm2"}, "www/gplot/.*.gplot" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/dark/.*.png" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/bright/.*.png" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/bright/.*.png" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/fhemSVG/.*.svg" => { type=>"fhem,", dir=>"www/pgm2"}, "www/images/fhemSVG/.*.svg" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/openautomation/.*.svg" => { type=>"fhem,", dir=>"www/pgm2"}, "www/images/openautomation/.*.svg" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/openautomation/.*.txt" => { type=>"fhem,", dir=>"www/pgm2"}, "www/images/openautomation/.*.txt" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/darktouchpad/.*.png" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/default/.*" => { type=>"fhem,", dir=>"www/pgm2"}, "www/images/default/.*" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/default/remotecontrol/.*" => { type=>"fhem,", dir=>"www/pgm2"}, "www/images/default/remotecontrol/.*" => { type=>"fhem,", dir=>"www/pgm2"},
"www/images/smallscreen/.*" => { type=>"fhem,", dir=>"www/pgm2"},
"docs/commandref(_..)?.html" => { type=>"fhem,", dir=>"www/pgm2"}, "docs/commandref(_..)?.html" => { type=>"fhem,", dir=>"www/pgm2"},
"docs/faq(_..)?.html" => { type=>"fhem,", dir=>"www/pgm2"}, "docs/faq(_..)?.html" => { type=>"fhem,", dir=>"www/pgm2"},
"docs/HOWTO(_..)?.html" => { type=>"fhem,", dir=>"www/pgm2"}, "docs/HOWTO(_..)?.html" => { type=>"fhem,", dir=>"www/pgm2"},
"docs/fhem.*.png" => { type=>"fhem,", dir=>"www/pgm2"}, "docs/fhem.*.png" => { type=>"fhem,", dir=>"www/pgm2"},
"docs/.*.jpg" => { type=>"fhem,", dir=>"www/pgm2"}, "docs/.*.jpg" => { type=>"fhem,", dir=>"www/pgm2"},
"docs/fhemdoc.js" => { type=>"fhem,", dir=>"www/pgm2"},
); );
@ -81,8 +77,7 @@ for(my $loop = 0; $loop < 2; $loop++) {
foreach my $fspec (keys %filelist2) { foreach my $fspec (keys %filelist2) {
$fspec =~ m,^(.+)/([^/]+)$,; $fspec =~ m,^(.+)/([^/]+)$,;
my ($dir,$pattern) = ($1, $2); my ($dir,$pattern) = ($1, $2);
my $tdir = $filelist2{$fspec}{$loop ? "dir3" : "dir"}; my $tdir = $dir;
$tdir = $dir if(!$tdir);
opendir DH, $dir || die("Can't open $dir: $!\n"); opendir DH, $dir || die("Can't open $dir: $!\n");
foreach my $file (grep { /$pattern/ && -f "$dir/$_" } readdir(DH)) { foreach my $file (grep { /$pattern/ && -f "$dir/$_" } readdir(DH)) {
next if($skiplist2{$tdir} && $file =~ m/$skiplist2{$tdir}/); next if($skiplist2{$tdir} && $file =~ m/$skiplist2{$tdir}/);
@ -147,7 +142,6 @@ for(my $loop = 0; $loop < 2; $loop++) {
foreach my $k (keys %controls) { foreach my $k (keys %controls) {
close $controls{$k}; close $controls{$k};
} }
}
$ENV{RSYNC_RSH}="ssh"; $ENV{RSYNC_RSH}="ssh";
chdir("$homedir/fhem"); chdir("$homedir/fhem");
@ -161,15 +155,21 @@ if(0) {
my $fsize = $st[7]; my $fsize = $st[7];
} }
system("cp -p ../culfw/Devices/CUL/*.hex fhemupdate4/FHEM");
system("cp -p ../culfw/Devices/CUL/*.hex fhemupdate4/FHEM/firmware");
system("cp -p FHEM/firmware/*.hex fhemupdate4/FHEM/firmware");
my $rsyncopts="-a --delete --compress --verbose"; my $rsyncopts="-a --delete --compress --verbose";
system("rsync $rsyncopts fhemupdate4/. fhem.de:fhem/fhemupdate4/svn"); system("rsync $rsyncopts fhemupdate4/. fhem.de:fhem/fhemupdate4/svn");
if(-f "commandref_changed") { if(-f "commandref_changed") {
system("scp docs/commandref.html docs/commandref_DE.html fhem.de:fhem"); system("scp docs/commandref.html docs/commandref_DE.html fhem.de:fhem");
} }
system("scp CHANGED MAINTAINER.txt fhem.de:fhem"); system("scp CHANGED MAINTAINER.txt fhem.de:fhem");
system("scp fhem.de:fhem/stats/data/fhem_statistics_db.sqlite .."); system("scp fhem.de:fhem/stats/data/fhem_statistics_db.sqlite ..");
chdir("$homedir"); chdir("$homedir");
system("sh stats/dostats.sh");
system("sh mksvnlog.sh > SVNLOG"); system("sh mksvnlog.sh > SVNLOG");
system("scp SVNLOG fhem.de:fhem"); system("scp SVNLOG fhem.de:fhem");