Microsoft Small Basic

Program Listing: ZNZ932
' Client program for simple CGI example

' $Id: cgi_example_client_sb.sb 6338 2013-11-25 14:14:14Z svn $

' Copyright (C)2013, Philip Munts, President, Munts AM Corp.
' All rights reserved.
'
' Redistribution and use in source and binary forms, with or without
' modification, are permitted provided that the following conditions are met:
'
' * Redistributions of source code must retain the above copyright notice,
' this list of conditions and the following disclaimer.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
' IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
' ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
' LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
' CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
' SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
' INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
' CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
' ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
' POSSIBILITY OF SUCH DAMAGE.

If (Program.ArgumentCount > 0) Then
IPADDRESS = Program.GetArgument(1)
Else
IPADDRESS = "usbgadget.munts.net"
Endif

' Build the HTTP query strings

SERVER = "http://" + IPADDRESS + "/cgi-bin/cgi_example_server"
OPERATION_GET = SERVER + "?OPERATION=get"
OPERATION_ON = SERVER + "?OPERATION=on"
OPERATION_OFF = SERVER + "?OPERATION=off"

' Set up the GUI layout

GraphicsWindow.Width = 300
GraphicsWindow.Height = 100
GraphicsWindow.Title = "cgi_example_client"
GraphicsWindow.Show()

GraphicsWindow.DrawText(25, 10, "Control USB Gadget LED via HTTP GET")

buttonToggle = Controls.AddButton("Working...", 75, 45)
buttonQuit = Controls.AddButton("Quit", 175, 45)

' Register button event handler

Controls.ButtonClicked = ButtonEventHandler

' Periodically poll the LED state, in case somebody else changes it

While "true"
GetLEDState()
Program.Delay(1000)
EndWHile

' This is the event handler for all button presses. We either toggle
' the LED or quit the program.

Sub ButtonEventHandler
b = Controls.LastClickedButton

If (b = buttonToggle) Then
c = Controls.GetButtonCaption(b)

If (c = "Turn LED On") Then
TurnLEDOn()
ElseIf (c = "Turn LED Off") Then
TurnLEDOff()
EndIf
EndIf

If (b = buttonQuit) Then
Program.End()
EndIf
EndSub

' Turn the LED on

Sub TurnLEDOn
Sound.PlayClick()
Controls.SetButtonCaption(buttonToggle, "Working...")
Network.GetWebPageContents(OPERATION_ON)
GetLEDState()
EndSub

' Turn the LED off

Sub TurnLEDOff
Sound.PlayClick()
Controls.SetButtonCaption(buttonToggle, "Working...")
Network.GetWebPageContents(OPERATION_OFF)
GetLEDState()
EndSub

' Get the current LED state

Sub GetLEDState
result = Network.GetWebPageContents(OPERATION_GET)

If (result = "ON" + Text.GetCharacter(10)) Then
Controls.SetButtonCaption(buttonToggle, "Turn LED Off")
ElseIf (result = "OFF" + Text.GetCharacter(10)) Then
Controls.SetButtonCaption(buttonToggle, "Turn LED On")
Else
Controls.SetButtonCaption(buttonToggle, "ERROR")
EndIf
EndSub