#!/usr/bin/expect -f

#
# Listening on my radio port for spots
#
# Two samples:
#
# "DX de SP3JUN:    14013.5  CT3FT         0914                          0912Z"
# "PC11^1827.0^9X4WW^ 8-Jan-1997^2227Z^SSB^OZ3PZ^OZ2DXB^H6^~"
#
# The script looks for DX spots in two formats: Either in the user
# format "DX de .." or in the PC11 format. The later is converted
# into the "DX de .." format as clx only understands that in U mode.

# --------------------- User configurable ---------------------
set port "/dev/ttyS0"
set mycall "dj0zy"
set log_dir "~clx_us/log"
# --------------------- User configurable ---------------------

log_user 1
set timeout 10
set tty [ lindex [split $port '/'] 2 ]

set dxspot "DX de ....................................................................Z"
set pc11spot "(PC11.*)~"

# First remember my spawn_id and pid
set expect_pid [pid]
set con_ctl $user_spawn_id

# Then spawn the listen process and remember spawn_id and pid
spawn /usr/bin/cu -l $port
log_file -a $log_dir/$tty.log
set listen $spawn_id
set listen_pid [exp_pid -i $listen]

expect "Connected."
sleep 1
expect *

send "\3\r"
expect "cmd:"
expect *

send "intface term\r"
expect "cmd:"

send "reset\r"
expect "cmd:"

send "echo on\r"
expect "cmd:"

send "mycall $mycall\r"
expect "cmd:"

send "passall off/off\r"
expect "cmd:"

send "monitor on/on\r"
expect "cmd:"

send "conok off\r"
expect "cmd:"

send "beacon 0/0\r"
expect "cmd:"

send "maxframe 1/1\r"
expect "cmd:"

send "digipeat off/off\r"
expect "cmd:"

send "hid off/off\r"
expect "cmd:"

send "streamsw \$7E/\$7C\r"
expect "cmd:"

send "convers\r"
sleep 1
expect *

send "|a\r"

# A very crude way to get my parent's PID, in fact we don't need this
set x [ exec cat /proc/$expect_pid/status | grep PPid ]
set ppid [ lindex $x 1 ]

# Something nice to look at
set prompt "listen pid=$listen_pid, con_ctl ppid=$ppid"

proc syslog {msg} {

# To put something into the log

	set filename "monitor"
	exec logger -p local5.info "$filename (pid=[pid]): $msg"
}


syslog "sucessfully started: $prompt\n"

set timeout -1
while (1) {
	expect {
		-i $listen 
		-re $dxspot { 
			send_user "$expect_out(0,string)\n" 
		}
		-re $pc11spot { 
			set pc11 [split $expect_out(1,string) '^']
                        set freq [lindex $pc11 1]
                        set call [lindex $pc11 2]
                        set utc [lindex $pc11 4]
                        set comment [lindex $pc11 5]
                        set from [lindex $pc11 6]:
                        set fmt "DX de %-9s %8s  %-12s %-29s %6s\n"
                        send_user [format $fmt $from $freq $call $comment $utc]
		}
		eof { 
			set msg "EOF rcvd from listen (died?) - exiting\n" 
			send_user $msg
			syslog $msg
			exit 
		}
		-i $con_ctl 
		-re ".*\n" { 
			syslog "ping rcvd from con_ctl\n" 
		}
		eof { 
			set msg "EOF rcvd from con_ctl (disc?) - exiting\n"
			send_user $msg
			syslog $msg
			exit
		}
	}
}
