#!/usr/bin/expect -f proc setup {} { set timeout 1 exp_internal 0 log_user 0 set ::env(DISPLAY) :0 spawn sh -c "screen -wipe" spawn sh -c "screen -rx dialer || screen -S dialer /dev/ttyUSB2 115200" sleep 0.3 set modem_pid $spawn_id sleep 0.2 # Set audio routing messagemodem $modem_pid "AT+QDAI=1,0,0,2,0,1,1,1;\r" 1 # Setup text message to immediatly show text response on +CMT recvs messagemodem $modem_pid "AT+CNMI=1,2,0,1,0;\r" 1 # Set message format as PDU messagemodem $modem_pid "AT+CMGF=0;\r" 1 return $modem_pid } proc messagemodem {modem_pid message fatal} { send -i $modem_pid $message expect { -i $modem_pid "OK" { return 1 } } if {$fatal} { puts "Couldn't run command on modem: $message" exit } return 0 } set modem_pid [setup] sleep 0.2 # E.g. consume the thing expect -i $modem_pid eof proc writenumber {number} { exec sh -c "echo '$number' > /tmp/sxmo_incomingcall" puts "Ring for incoming call: <$number>" spawn sxmo_setpineled blue 0 sleep 0.3 } proc ring {modem_pid} { send -i $modem_pid "AT+CLCC\r" expect { -i $modem_pid -re {\n\+CLCC: 4,.+\+(\d+)} { writenumber $expect_out(1,string) } -i $modem_pid -re {\n\+CLCC: 3} { writenumber "UNKNOWN" } } } proc textmsg {modem_pid pdutext} { puts "New text msg - pdu text $pdutext" spawn sxmo_pdudecode $pdutext wait expect -i $spawn_id -re {Date: ([\-0-9]+)\r\nNumber: \+?([^\n]+)\r\nMessage:\r\n(.+)$} { puts "Matched ok"; } set date $expect_out(1,string) set number $expect_out(2,string) set msg [string trim $expect_out(3,string)] puts "" puts "" puts "" spawn date "+%Y/%m/%d %H:%M:%S" -d "@$date" wait expect set prettydate [string trim $expect_out(buffer)] set USER $::env(USER) spawn mkdir -p "/home/$USER/.sxmo/$number" wait set fp "/home/$USER/.sxmo/$number/log.txt" set logf [open $fp a] puts $logf "$number at \[$prettydate\]:\n$msg\n" close $logf } proc nocarrier {modem_pid} { spawn sxmo_setpineled blue 0 exec sh -c "rm -f /tmp/sxmo_incomingcall" puts "No carrier" } while 1 { set is_ringing 0 set timeout 2 expect { -i $modem_pid -re {\nRING\r} {ring $modem_pid; set is_ringing 1} -i $modem_pid -re {\nNO CARRIER\r} {nocarrier $modem_pid; set is_ringing 0} -i $modem_pid -re {\n\+CMT: \S+\r\n([0-9A-F]+)} {textmsg $modem_pid $expect_out(1,string)} } if { $is_ringing } { spawn sxmo_setpineled blue 1 } else { spawn sxmo_setpineled blue 0 } sleep 2 }