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