Domanda

I want to simulate embedded linux keypress events to my Qt GUI Application. Primarily I want to simulate KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, and KEY_F{1-2-3} key presses. I don't have X available.

There is an ASCII character table here:

http://foldoc.org/ASCII+character+table\

And I understand how to send things, say CNTRL-T, using that table to my aplication by spawning it and sending it the following in my expect script:

send "\x14"

I can't seem to find documentation or examples on how to send the KEY_??? key presses using Expect. How can I do this using Expect?

If not possible, is there some other way to send keypresses to my process? I can't seem to be able to echo escape sequences to /dev/input/keypad...

Update:

Thanks for the comments.

I can see the output that my arrow keys generate by doing:

$ od -c
^[[D^[[C^[[D^[[B^[[A^[[A^[[B^[[B^C

I can also see the output of infocmp xterm as:

am, bce, km, mc5i, mir, msgr, npc, xenl,
    colors#8, cols#80, it#8, lines#24, pairs#64,
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
    clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M,
    csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
    cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
    cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
    cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
    dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
    flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
    ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
    ind=^J, indn=\E[%p1%dS, invis=\E[8m,
    is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F,
    kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~,
    kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=\177, kcbt=\E[Z,
    kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
    kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
    kf11=\E[23~, kf12=\E[24~, kf13=\EO2P, kf14=\EO2Q,
    kf15=\EO2R, kf16=\EO2S, kf17=\E[15;2~, kf18=\E[17;2~,
    kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~,
    kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P,
    kf26=\EO5Q, kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~,
    kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~,
    kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~,
    kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R,
    kf4=\EOS, kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~,
    kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
    kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\EO3P,
    kf5=\E[15~, kf50=\EO3Q, kf51=\EO3R, kf52=\EO3S,
    kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~,
    kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~,
    kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\EO4P,
    kf62=\EO4Q, kf63=\EO4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
    khome=\EOH, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
    mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em,
    op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rin=\E[%p1%dT,
    rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
    rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[4%p1%dm,
    setaf=\E[3%p1%dm,
    setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
    setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
    sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\E(0%e\E(B%;,
    sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h,
    smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
    tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
    vpa=\E[%i%p1%dd,

I've tried several of the simple escape sequences on a 'menuconfig' ( much like Linux ) program for Buildroot like so:

#!/usr/bin/expect --

# Span menuconfig
spawn make menuconfig

expect *
send {"\e[D"}
#send {"\e[%p1%dB"}

interact

I'd like to have the menuconfig open and the cursor move down one spot. However, it just launches and quits right away, even though I have an 'interact' statement in there. Any ideas as to why? Thanks -

È stato utile?

Soluzione

Have you tried using autoexpect ? Try this :

$ autoexpect

And do what you want expect to do, if you would like it to scroll two lines down - send two down arrow events - do this by pressing down arrow twice. Then exit autoexpect with Ctrl+C

Autoexpect will generate a script of all your actions that you can then run if you want expect to repeat the same thing. What is more important is that it will also catch the key events you want to send and generate correct lines of expect script that send these events. In my case (down arrow) this was

send -- "^[OB"

Just press all the keys you want to automatically send, and then inspect the generated script (usually named script.exp). Hope this helps

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top