File "my_program.bas"
Path: /WAF - Wireless Android Framework/WAF_0.1_Android/assets/waf/source/my_program.bas
File size: 13.46 KB
MIME-type:
Charset: utf-8
FN.DEF STG$(v)
FN.RTN LEFT$(STR$(v),IS_IN(".",STR$(v))-1)
FN.END
!'TIME y$,m$,d$
!'d$ = y$+m$+d$
!'IF d$ > "20140430" THEN
!' POPUP "Beta expired. Thanks for your help",0,0,1
!' EXIT
!'END IF
VER$="v0.1"
PORT=6369
TIMOUT=500 %' time-out of TCP/IP server in ms
DELAY=3000 %' delay to make "myPC connected" disappear
DQ$=CHR$(34)
LF$=CHR$(10)
WAKELOCK 1 %' CPU still on when screen goes off
GR.OPEN 255,255,255,255,1
GR.ORIENTATION -1 %' depends on the sensor
GR.SCREEN real_w, real_h
IF real_w<real_h THEN %' portrait orientation
di_w=640
di_h=di_w*real_h/real_w
scale_w=real_w/di_w
scale_h=real_h/di_h
ELSE
di_h=640
di_w=di_h*real_w/real_h
scale_w=real_w/di_w
scale_h=real_h/di_h
END IF
GR.SCALE scale_w, scale_h
real_w=0
!' Graphics initialization
GR.BITMAP.LOAD inuBmp, "inu512.png"
GR.BITMAP.DRAW inuPtr, inuBmp, 56, (di_h-50)/2-256
GR.COLOR 255,20,20,20,1 %' dark gray
GR.TEXT.SIZE 40
GR.TEXT.SKEW -0.25
t$ = "Wireless Android Framework"
GR.TEXT.WIDTH tu1w, t$
GR.TEXT.DRAW tu1, 320-tu1w/2, 100, t$
GR.TEXT.SKEW 0
t$ = "ready to receive requests"
GR.TEXT.WIDTH tu2w, t$
GR.TEXT.DRAW tu2, 320-tu2w/2, 146, t$
t$ = "from computers on the LAN"
GR.TEXT.WIDTH tu3w, t$
GR.TEXT.DRAW tu3, 320-tu3w/2, 192, t$
GR.TEXT.SIZE 24
t$ = "* press the Home key to run in background"
GR.TEXT.WIDTH tm1w, t$
GR.TEXT.DRAW tm1, 320-tm1w/2, (di_h-50)/2+256+10, t$
GR.COLOR 255,153,199,232,1 %' light blue
GR.RECT br, di_w-119-10, di_h-50-57, di_w-10, di_h-50
GR.COLOR 255,100,175,235,1 %' darker blue
GR.RECT fr, di_w-119-15, di_h-50-61, di_w-15, di_h-50-4
GR.TEXT.SIZE 40
GR.COLOR 255,255,255,255,1 %' white
GR.TEXT.BOLD 1
t$ = "Exit"
GR.TEXT.WIDTH tbw, t$
GR.TEXT.DRAW tb, di_w-60-15-tbw/2, di_h-50-61+42, t$
GR.TEXT.BOLD 0
GR.COLOR 255,239,52,177,1 %' pink
GR.TEXT.SKEW -0.25
t$ = "myPC connected"
GR.TEXT.WIDTH tm2w, t$
GR.TEXT.DRAW tm2, 320-tm2w/2, 3/4*di_h+85, t$
GR.HIDE tm2
AllApps$ = VERSION$()
!' MAIN LOOP
DO
SOCKET.MYIP ip$ %' Check if WiFi is ON or OFF
IF ip$ = "" & !offline THEN
offline=1
GR.HIDE tu2
GR.HIDE tu3
GR.HIDE tm1
GR.MODIFY tm2, "text", "Please activate the WiFi"
GR.SHOW tm2
ELSEIF ip$<>"" & offline THEN
offline=0
GR.SHOW tu2
GR.SHOW tu3
GR.SHOW tm1
GR.HIDE tm2
END IF
IF computerName$<>"" & CLOCK() > disappearClock THEN %' Handle client popup
computerName$=""
GR.HIDE tm2
ENDIF
GOSUB DetectScreenOrientationChange
IF !BACKGROUND() THEN GR.RENDER
IF offline THEN GOTO Loop
IF !server THEN %' Offer UDP broadcast (discovery) service
SOCKET.CLIENT.STATUS flag
GOSUB DetectScreenOrientationChange
IF flag THEN %' Client connected!
SOCKET.SERVER.CREATE PORT %' Create TCP/IP server
SOCKET.SERVER.CONNECT 0
server=1 %' Used to close server if user exits app
expireClock = CLOCK() + TIMOUT
disappearClock = CLOCK() + DELAY
END IF
END IF
IF !server THEN GOTO Loop
SOCKET.SERVER.STATUS st %' Offer TCP/IP WAF service
IF st = 3 THEN %' connected
GOSUB DetectScreenOrientationChange
SOCKET.SERVER.READ.READY flag
IF flag THEN
GOSUB DetectScreenOrientationChange
SOCKET.SERVER.READ.LINE cmd$
DEBUG.PRINT ">> " + cmd$
i = IS_IN("``", cmd$)
IF i THEN
t$ = LEFT$(cmd$, i-1)
cmd$ = MID$(cmd$, i+2)
IF t$<>computerName$ THEN %' New client is connected
computerName$=t$
t$=computerName$ + " connected"
GR.MODIFY tm2, "text", t$
GR.TEXT.WIDTH tm2w, t$
IF real_w<real_h THEN %' Portrait orientation
GR.MODIFY tm2, "x", 320-tm2w/2
ELSE %' Landscape orientation
GR.MODIFY tm2, "x", MIN(3/4*di_w-tm2w/2, di_w-tm2w)
END IF
GR.SHOW tm2
IF !BACKGROUND() THEN GR.RENDER
END IF
!' ** HEREBELOW IS THE COMMAND PARSER **
answer$ = ""
IF LOWER$(cmd$) = "changelog" THEN %' CHANGELOG command
answer$ = "WAF Android changelog:" + LF$
answer$ += "v0.1 - initial release"
ELSEIF LOWER$(cmd$) = "version" THEN %' VERSION command
answer$ = "WAF Android " + VER$
ELSEIF LOWER$(cmd$) = "devices" THEN %' DEVICES command
answer$ = BIN$()
ELSEIF IS_IN("browse ", LOWER$(cmd$)) = 1 THEN %' BROWSE command
t$ = MID$(cmd$, 8)
IF LEFT$(LOWER$(t$), 4) <> "http" THEN t$ = "file://" + t$
BROWSE t$
ELSEIF LOWER$(cmd$) = "listapps" THEN %' LISTAPPS command
answer$ = AllApps$
ELSEIF IS_IN("uninstall ", LOWER$(cmd$)) = 1 THEN %' UNINSTALL command
t$ = MID$(cmd$, 11)
IF !IS_IN(t$ + "/", AllApps$) THEN
answer$ = "Unknown package. Use " + DQ$ + "waf listapps" + DQ$
GOTO Answer
ELSE
t$ = "am start -a android.intent.action.DELETE -d package:" + t$
GOTO ShellCommand
END IF
ELSEIF IS_IN("launch ", LOWER$(cmd$)) = 1 THEN %' LAUNCH command
t$ = MID$(cmd$, 8)
IF !IS_IN(t$, AllApps$) | !IS_IN("/", t$) THEN
answer$ = "Unknown package/.activity - Use " + DQ$ + "waf listapps" + DQ$
GOTO Answer
ELSE
t$ = "am start -n " + t$
GOTO ShellCommand
END IF
ELSEIF IS_IN("shell ", LOWER$(cmd$)) = 1 THEN %' SHELL command
t$ = MID$(cmd$, 7)
ShellCommand:
SYSTEM.OPEN
SYSTEM.WRITE t$
PAUSE 100
DO
SYSTEM.READ.LINE l$
IF l$<>"" THEN answer$ += l$ + LF$
SYSTEM.READ.READY ready
UNTIL !ready
SYSTEM.CLOSE
IF answer$="" & !IS_IN(" --user 0", t$) THEN
t$ += " --user 0"
GOTO ShellCommand
END IF
ELSEIF IS_IN("pull ", LOWER$(cmd$)) = 1 THEN %' PULL command
t$ = MID$(cmd$, 6) %' get path of file to pull
IF LEFT$(t$, 1) <> "/" THEN
answer$ = "Wrong Android path. Must start with /"
GOTO Answer
END IF
fe=0
WHILE IS_IN("/", t$, 2)
t$ = MID$(t$, IS_IN("/", t$, 2))
FILE.EXISTS fe, "../.." + t$
IF fe THEN W_R.BREAK
REPEAT
IF !fe THEN
answer$ = "No such file or Access denied"
GOTO Answer
END IF
BYTE.OPEN r, fid, "../.." + t$
SOCKET.SERVER.WRITE.FILE fid
BYTE.CLOSE fid
GOTO Answered
ELSEIF IS_IN("push ", LOWER$(cmd$)) = 1 THEN %' PUSH command
t$ = MID$(cmd$, 6) %' get path of file to save
i = IS_IN(">", t$)
IF !i THEN GOTO Answered %' unexpected
filesize = VAL(MID$(t$, i+1))
t$ = LEFT$(t$, i-1)
IF LEFT$(t$, 1) <> "/" THEN
answer$ = "Wrong Android path. Must start with /"
GOTO Answer
END IF
i=1
WHILE IS_IN("/", t$, i+1)
i = IS_IN("/", t$, i+1)
REPEAT
path$ = LEFT$(t$, i)
file$ = MID$(t$, i+1)
fe=0
t$ = path$
WHILE IS_IN("/", t$, 2)
t$ = MID$(t$, IS_IN("/", t$, 2))
FILE.EXISTS fe, "../.." + t$
IF fe THEN W_R.BREAK
REPEAT
IF !fe THEN
answer$ = "Target folder doesn't exist or Access denied"
GOTO Answer
END IF
path$ = "../.." + t$
!' So far, everything's good, se we will
!' initiate transfer of the file itself
maxclock = CLOCK() + 5*DELAY
fs=0
DO
SOCKET.SERVER.READ.READY flag
IF flag THEN
BYTE.OPEN w, fid, path$ + file$
SOCKET.SERVER.READ.FILE fid
BYTE.CLOSE fid
FILE.SIZE fs, path$ + file$
END IF
UNTIL fs | CLOCK() > maxclock
!' At this time, socket is most probably closed
!' because of time out, we can't send result back
IF fs <> filesize THEN FILE.DELETE fd, path$ + file$
GOTO Answered %' So we skip the answer & wait for a new request
ELSEIF IS_IN("install ", LOWER$(cmd$)) = 1 THEN %' INSTALL command
t$ = MID$(cmd$, 9)
filesize = VAL(t$)
maxclock = CLOCK() + 5*DELAY
fs=0
DO
SOCKET.SERVER.READ.READY flag
IF flag THEN
BYTE.OPEN w, fid, "temp.apk"
SOCKET.SERVER.READ.FILE fid
BYTE.CLOSE fid
FILE.SIZE fs, "temp.apk"
END IF
UNTIL fs | CLOCK() > maxclock
!' At this time, socket is most probably closed
!' because of time out, we can't send result back
IF fs <> filesize THEN FILE.DELETE fd, "temp.apk"
APP.INSTALL %' launches the install of /sdcard/waf/data/temp.apk
GOTO Answered %' So we skip the answer & wait for a new request
ELSEIF LOWER$(cmd$) = "start-server" THEN %' START-SERVER command
SOCKET.SERVER.WRITE.BYTES "Server already running. Restarted it"
SOCKET.SERVER.DISCONNECT
SOCKET.SERVER.CLOSE
server=0
computerName$=""
GR.HIDE tm2
AllApps$ = VERSION$()
GOTO Loop
ELSEIF LOWER$(cmd$) = "kill-server" THEN %' KILL-SERVER command
SOCKET.SERVER.WRITE.BYTES "Server killed"
SOCKET.SERVER.DISCONNECT
SOCKET.SERVER.CLOSE
EXIT
ELSEIF IS_IN("popup ", LOWER$(cmd$)) = 1 THEN %' POPUP command
POPUP MID$(cmd$, 7),0,0,1
answer$ = "Popup displayed"
ELSEIF IS_IN("vibrate ", LOWER$(cmd$)) = 1 THEN %' VIBRATE command
t$ = MID$(cmd$, 9)
DIM va[2*LEN(t$)]
FOR i=1 TO LEN(t$) %' Decompose Morse code
c$=MID$(t$,i,1)
IF c$="." THEN %' DOT
va[2*i-1]=100 %' = short pause
va[2*i] =100 %' then short vibrate
ELSEIF c$="-" THEN %' DASH
va[2*i-1]=100 %' = short pause
va[2*i] =300 %' then long vibrate
ELSEIF c$=" " THEN %' PAUSE
va[2*i-1]=300 %' = long pause
va[2*i] =0 %' and no vibrate
END IF
NEXT
VIBRATE va[], -1 %' play just once
UNDIM va[]
answer$ = "Vibrate ok"
ELSE %' UNKNOWN command
answer$ = "Unknown command"
!' ** END OF PARSER: SEND TCP/IP ANSWER **
END IF
Answer:
DEBUG.PRINT "<< " + answer$
SOCKET.SERVER.WRITE.BYTES answer$
Answered:
disappearClock = CLOCK() + DELAY
END IF %' end of well formatted command "PCname``myCmd"
END IF %' end of SOCKET.SERVER.READ.READY
END IF %' end of SOCKET.SERVER.STATUS = 3
GOSUB DetectScreenOrientationChange
IF CLOCK() > expireClock THEN
SOCKET.SERVER.DISCONNECT
SOCKET.SERVER.CLOSE
server=0 %' Disconnected by time-out
ENDIF
Loop:
UNTIL 0
DetectScreenOrientationChange:
GR.SCREEN w,h,dpi
IF w<>real_w THEN %' Screen was tilted
real_w=w
real_h=h
IF real_w<real_h THEN %' Portrait orientation
di_w=640
di_h=di_w*real_h/real_w
scale_w=real_w/di_w
scale_h=real_h/di_h
GR.MODIFY inuPtr, "x", 56
GR.MODIFY inuPtr, "y", (di_h-50)/2-256
GR.MODIFY tu1, "x", 320-tu1w/2
GR.MODIFY tu1, "y", 100
GR.MODIFY tu2, "x", 320-tu2w/2
GR.MODIFY tu2, "y", 146
GR.MODIFY tu3, "x", 320-tu3w/2
GR.MODIFY tu3, "y", 192
GR.MODIFY tm1, "x", 320-tm1w/2
GR.MODIFY tm1, "y", (di_h-50)/2+256+10
GR.MODIFY tm2, "x", 320-tm2w/2
GR.MODIFY tm2, "y", 3/4*di_h+85
GR.MODIFY br, "left", di_w-119-10
GR.MODIFY br, "top", di_h-50-57
GR.MODIFY br, "right", di_w-10
GR.MODIFY br, "bottom", di_h-50
GR.MODIFY fr, "left", di_w-119-15
GR.MODIFY fr, "top", di_h-50-61
GR.MODIFY fr, "right", di_w-15
GR.MODIFY fr, "bottom", di_h-50-4
GR.MODIFY tb, "x", di_w-60-15-tbw/2
GR.MODIFY tb, "y", di_h-61-50+42
ELSE %' Landscape orientation
di_h=640
di_w=di_h*real_w/real_h
scale_w=real_w/di_w
scale_h=real_h/di_h
GR.MODIFY inuPtr, "x", 10
GR.MODIFY inuPtr, "y", (di_h-50)/2-236
GR.MODIFY tu1, "x", MIN(3/4*di_w-tu1w/2, di_w-tu1w)
GR.MODIFY tu1, "y", 105
GR.MODIFY tu2, "x", MIN(3/4*di_w-tu2w/2, di_w-tu2w)
GR.MODIFY tu2, "y", 151
GR.MODIFY tu3, "x", MIN(3/4*di_w-tu3w/2, di_w-tu3w)
GR.MODIFY tu3, "y", 197
GR.MODIFY tm1, "x", MIN(3/4*di_w-tm1w/2, di_w-tm1w)
GR.MODIFY tm1, "y", 320
GR.MODIFY tm2, "x", MIN(3/4*di_w-tm2w/2, di_w-tm2w)
GR.MODIFY tm2, "y", 440
GR.MODIFY br, "left", di_w-119-10
GR.MODIFY br, "top", di_h-50-57
GR.MODIFY br, "right", di_w-10
GR.MODIFY br, "bottom", di_h-50
GR.MODIFY fr, "left", di_w-119-15
GR.MODIFY fr, "top", di_h-50-61
GR.MODIFY fr, "right", di_w-15
GR.MODIFY fr, "bottom", di_h-50-4
GR.MODIFY tb, "x", di_w-60-15-tbw/2
GR.MODIFY tb, "y", di_h-50-61+42
END IF
END IF
RETURN
OnGrTouch:
GR.TOUCH touched, x, y
IF touched THEN
x /= scale_w
y /= scale_h
IF x>=di_w-119-25 & y>=di_h-50-71 & x<=di_w & y<=di_h-50 THEN
IF server THEN
SOCKET.SERVER.DISCONNECT
SOCKET.SERVER.CLOSE
END IF
GR.CLOSE
!'END "-User tapped Exit-"
EXIT
!' ToDo:simu-click
END IF
END IF
GR.ONGRTOUCH.RESUME
OnBackKey:
BACK.RESUME
OnBackGround:
IF BACKGROUND() THEN
IF offline THEN EXIT
NOTIFY "Wireless Android Framework", "Running in background", "Running in background", 0
END IF
BACKGROUND.RESUME