Order Tray | Contact Us | Home | SIG Lists

[aprssig] KPC 3+ reset script

Lee Bengston lee.bengston at gmail.com
Thu Feb 23 21:29:49 UTC 2012


I beat this to death not long ago.  Just change the port and baud rate
settings to match your system.  This is designed to run when my
computer is re-booted, and at boot time it doesn't know what mode the
TCN is in - and it wants it in KISS mode.  I'm using this on a
KPC-9612+, but I think the commands are the same for a KPC-3+.

Regards,
Lee

-------------------

#!/usr/bin/perl
# script to figure out the current TNC mode and put into KISS mode if
it is not there
# Last update February 5, 2012

use strict;
use warnings;

my ($gotcmd, $match, $after, $pattern, $instead, $count, $result, $cmdflag);
my $kiss1 = "INTFACE KISS\r";
my $kiss2 = "RESET\r";
my $mycall = "K5DAT";
use Device::SerialPort;

my $PortObj=Device::SerialPort->new("/dev/ttyUSB0");

$PortObj->baudrate(9600);
$PortObj->parity("none");
$PortObj->databits(8);
$PortObj->stopbits(1);
$PortObj->handshake("rts");
$PortObj->write_settings;

$PortObj->read_char_time(0);
$PortObj->read_const_time(100);

# send some stuff looking for a response
$PortObj->write("junk\r");
$PortObj->read(2047); # read out lots of bytes in case lots of packets
have come in
sleep (1);
$PortObj->write("junk\r\r"); # now send again and look for cmd prompt
# will iterate up to 12 times looking for the command prompt
# in case there's lots more in the buffer to read out
$count = 12; # choice of 12 is somewhat arbitrary and possibly overkill
$cmdflag = 0;
while ($count > 0)  {
  $result = $PortObj->read(255);
  print "Reading Data...\n\n";
  if ($result =~ m/cmd:/)  {
    $cmdflag = 1;
    $count = 0;
  }
  else {
  $count = $count - 1;
  }
}

# print "cmdflag = $cmdflag\n\n";
if ($cmdflag == 1)  {
  print "OK - got the cmd prompt\n\n";
}
else {
# send commands to take TNC out of KISS MODE - at this point we don't
know for sure
# if it in KISS mode or not, but we know we're not getting expected
responses for
# normal command mode, so this will take it out of KISS if it's in that mode.

  print "no command prompt - sending commands to exit\nKISS mode in
case that's the reason\n\n";

  $PortObj->write(chr(192));
  $PortObj->write(chr(255));
  $PortObj->write(chr(192));

#  check again and see if we can get command mode reponses
  $PortObj->write("junk\r");
  sleep(1);
  $PortObj->write("foo\r");
  $count = 20;
  while ($count > 0)  {
    $result = $PortObj->read(255);
    sleep(1);
    print "Reading data after sending commands to exit KISS mode...\n\n";
    print "$result\n\n";
    if ($result =~ m/cmd:/)  {
      $cmdflag = 2;
      $count = 0;
      print "OK, saw expected command prompt\n\n";
    }
    elsif ($result =~ m/BAUD/)  {
    print "TNC found in 'reset' mode\n\n";
    $PortObj->write("*");
    sleep(1);
    $result = $PortObj->read(127);
    print "$result\n\n";
    $PortObj->write("$mycall\r");
    sleep(1);
    $result = $PortObj->read(63);
    print "$result\n\n";
    $cmdflag = 3;
    }
    else {
    $count = $count - 1;
    }
  }
}

if ($cmdflag == 0)  {
  print "Was never able to communicate\n\n";
}

if ($cmdflag > 0)  {
  print "Sending commands to put the TNC in KISS mode\n\n";
# if we have a prompt, go ahead and put the TNC in KISS mode
  $PortObj->write($kiss1);
  sleep(1);
  $result = $PortObj->read(255);
  print "$result\n\n";
  $PortObj->write($kiss2);
  sleep(1);
  $result = $PortObj->read(255);
  print "$result\n\n";
  print "Commands sent to put the TNC in KISS mode;\n\n";
}
$PortObj->close;



On Thu, Feb 23, 2012 at 4:04 PM, John Gorkos <jgorkos at gmail.com> wrote:
> Great perl minds think alike:  I've got the part to get me OUT of kiss down
> pat.  It's the "get me back IN to kiss" that's a bit harder.  I'll grind out
> some Perl-Expect and post it to this thread when it sort of works.  It would
> be much better if Kantronics would FIX THEIR BUGGY FIRMWARE! (I know, shouting
> on the internet doesn't mean that the Kantronics engineering staff will hear me
> and do what we pay them to do, but it's worth a try).
>
> John gorkos
>
>
> On Thursday, February 23, 2012 01:00:39 PM Curt, WE7U wrote:
>> On Thu, 23 Feb 2012, Curt, WE7U wrote:
>> >> to ensure i don't get bit by Kantronics bad programming.  Does anyone
>> >> have a
>> >> TCL or Perl Expect script that will send the KISS escape sequence,
>> >> tickle the
>> >> TNC, send it an INTFACE KISS command, and reset it?
>> >> I'll try to cobble something together, but plagiarism is the highest
>> >> form of
>> >> flattery here...
>> >
>> > There's a "kiss-off" script in the Xastir sources you could start with.
>>
>> Ah, but it ain't much.  Invoked like this:  ./kiss-off.pl >/dev/ttyS1
>>
>> And here are the only real lines of code:
>>
>>      sleep 1;
>>      printf("%c%c%c", 192, 255, 192);
>>      sleep 1;
>>
>> No "expect" used, in fact no two-way communication at all.  Completely
>> open-loop.  Who wrote this piece of crap?  ;-)
>>
>> Even as-is, I found it useful.  For automated rebooting you'll want
>> something more.
>
> _______________________________________________
> aprssig mailing list
> aprssig at tapr.org
> https://www.tapr.org/cgi-bin/mailman/listinfo/aprssig



More information about the aprssig mailing list