~QlarityLib~ 0xFFFF Do not edit this file. Doing so will almost certainly destroy its integrity! Galil_mc @6077950 7947776 2 1.500000 0 N1.5 *2073 39218 1.52 0 sGalilCommunications %GalilCommunication%FFFFF00FC0038FF13FFD7C7F391F9C47CFF3E007F84FFF9FFF3FFE7FFFFF *41291 33704 1.52 0 pGalilCommunications *74995 13477 1.52 0 1GalilCommunications *88472 14233 1.52 0 sGMCPoll %GMCPoll%80013FFC40025FFA58FA577A577A577A587A5FBA5FDA5FFA40023FFC8001 *102705 9359 1.52 0 pGMCPoll *112064 6590 1.52 0 1GMCPoll *118654 25518 1.52 1 sGMCCommand %GMCCommandDisplay%80013FFC40025EFA5F7A403A5F7A5E7A5EFA5C025EFA5F7A40023FFC8001 %GMCCommandExec%FFFFFFFFFFFFFF7FFFBFE01FFFBFFE7FFDFFF807FDFFFEFFFFFFFFFFFFFF *144172 16349 1.52 1 pGMCCommand *160521 11830 1.52 1 1GMCCommand *172351 39092 1.52 0 sGMCGauge %GMCGauge%FFF0FE16FFF6FF96FFF6FF96FFF6FE16FFF0FF90FFF0FF90FFF0FE10FFF0 *211443 36305 1.52 0 pGMCGauge *247748 9402 1.52 0 1GMCGauge *257150 26904 1.52 0 sGMCPathTrace %GMCPathTrace%3FFF73E76DDB6C1B31C77BEF77F777F737F77BEF7DDF7E3F3FFF6EEE0000 *284054 22477 1.52 0 pGMCPathTrace *306531 11174 1.52 0 1GMCPathTrace *317705 14136 1.52 0 sGMCAutoScale %GMCAutoScale%F3BF1D5F7B5F71BF3FFF7FFF7FFF1FFF7FFF7FFF3FFF7DBF795F1D5FFDBF *331841 16179 1.52 0 pGMCAutoScale *348020 2695 1.52 0 1GMCAutoScale *350715 28883 1.52 1 sGMCSimpleTerminal %GMCSimpleTerminal%00007FEE7FEE7FEE00007FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE0000 *379598 31614 1.52 1 pGMCSimpleTerminal *411212 6904 1.52 1 1GMCSimpleTerminal *418116 21314 1.52 0 sGMCTrendChart %GMCTrendChart%00007FFE71FE6EFE5F7E5F7E3FBE2AAA7FBE7FDE7FDE7FEC7FF27FFE0000 *439430 21716 1.52 0 pGMCTrendChart *461146 8555 1.52 0 1GMCTrendChart *469701 8256 0.00 0 sGMCStringAlloc *477957 8400 0.00 0 pGMCStringAlloc *486357 2522 0.00 0 1GMCStringAlloc *488879 13186 1.01 0 sGMCDownload %GMCDownload%00007FFE46FE5AFE5AFE5AFE5AFE463E7FFE7FDE6FEE54066FEE7FDE0000 *502065 8529 1.01 0 pGMCDownload *510594 6862 1.01 0 1GMCDownload *0 0 ZZ #ifnot Galil_mc_src_GalilCommunications #option Galil_mc_src_GalilCommunications enum GMC_DataType as GMC_Position:=100, GMC_PositionError:=101, GMC_CommandedPosition:=102, -> GMC_LatchedPosition:=103, GMC_DualEncoderPosition:=104, GMC_Torque:=105, GMC_Switches:=106, -> GMC_AnalogInput1:=1, GMC_AnalogInput2:=2, GMC_AnalogInput3:=3, GMC_AnalogInput4:=4, -> GMC_AnalogInput5:=5, GMC_AnalogInput6:=6, GMC_AnalogInput7:=7, GMC_AnalogInput8:=8 enum GMC_Axis as GMC_Axis_X := 'X', GMC_Axis_Y := 'Y', GMC_Axis_Z := 'Z', GMC_Axis_W := 'W', -> GMC_Axis_E := 'E', GMC_Axis_F := 'F', GMC_Axis_G := 'G', GMC_Axis_H := 'H' enum GMC_BevelStyle as GMC_BevelRaised, GMC_BevelSunken, GMC_BevelNone enum GMC_SerialFormat as GMC_19200_RTS_CTS:=0, GMC_9600_RTS_CTS:=1, GMC_1200_RTS_CTS:=2, GMC_19200_NOFLOW := 3, GMC_9600_NOFLOW := 4, GMC_1200_NOFLOW := 5 #option GMC_EXTENDEDCOMMODES enum GMC_EnetStates as GMC_Serial := 1, GMC_Pending := 2, GMC_Enet := 3, GMC_Invalid := 4 enum GMC_CommMethod as GMC_UseSerial:=0, GMC_EthernetUDP:=1, GMC_EthernetTCP:=2, GMC_None:=3 enum GMC_DispErrors as GMC_DisplayNone, GMC_DisplayCommErrors, GMC_DisplayAllErrors enum GMC_FailureReason as GMC_FailCommunications, GMC_FailBadCommand, GMC_FailUnexpectedData const GMC_MaxStream := 256 const GMC_MaxPendingStreams := 256 const GMC_MaxTxLen := 80 const GMC_SpecialTerm := "MG\"~@~\"\r" const GMC_TermStr := "~@~" const GMC_VisTimeout := 6 const message GMC_CommSuccess const message GMC_CommFailure const message GMC_SuspendSuccessNotify const message GMC_SuspendCommReceive #hidden dim GMC_CommObjPos as integer #hidden dim GMC_CommObjHeight as integer dim GMC_DefaultCommObj as objref GalilCommunication #undoc func GMC_SetCommObjPos func GMC_SetCommObjPos (obj as objref) dim mu, md, ml, mr, nlx, nly as integer if GMC_CommObjHeight == 0 then GetBDFFontMetrics (ml, mr, mu, md, nlx, nly, default, font_normal) GMC_CommObjHeight = mu+md endif Relocate (obj, 0, GMC_CommObjPos * GMC_CommObjHeight) GMC_CommObjPos := GMC_CommObjPos + 1 endfunc #undoc func GMC_VerifyCommObj func GMC_VerifyCommObj (commObject as reference to objref GalilCommunication) if commObject == empty then commObject := GMC_defaultCommObj #if _tool tool_persist(commObject) #endif endif endfunc #hidden dim GMC_CurLocalPort as integer #undoc func GMC_GetLocalPort func GMC_GetLocalPort() returns unibyte if GMC_CurLocalPort == 0 then SeedRandomNum() GMC_CurLocalPort := 10000 + integer(40000*GetRandomNum()) else GMC_CurLocalPort := ((GMC_CurLocalPort - 9999) mod 40000) + 10000 endif return GMC_CurLocalPort endfunc #undoc func GMC_CountCommands func GMC_CountCommands(stream[] as byte) returns integer dim posS, posN as unibyte 'Using unibyte because -1 translates as 65535 dim oldPos as unibyte dim count as integer 'Quoted strings don't allow semicolons or quotes in them 'Which makes our life easy posS := find (stream, oldPos, -1, ";") posN := find (stream, oldPos, -1, "\n") 'if both are equal we have the end of our loop while (posS <> posN) do if (posS < posN) then count := count + 1 oldPos := posS+1 posS := find(stream, oldPos, -1, ";") else count := count + 1 oldPos := posN+1 posN := find(stream, oldPos, -1, "\n") endif loop 'Is stream terminated? oldPos := len(stream) - 1 if oldPos < 32000 then 'Only count semicolon as final terminator as a semicolon is auto appended if stream 'doesn't end in one. If the final character of the stream is a newline, then 'an extra null command will be appended, but won't be harmful if (stream[oldPos] <> ';') then count := count + 1 endif endif return count endfunc #undoc func GMCDataTypeToCommand func GMCDataTypeToCommand(dt as GMC_DataType, axis as GMC_Axis, useCustom as boolean, -> custom as string) returns string dim tmpStr[1] as byte dim tmpInt as integer tmpStr[0] := axis if useCustom then 'Verify 1 command only tmpInt = GMC_CountCommands(custom) if tmpInt < 1 then return "TPX;" 'Make up an arbitrary command elseif tmpInt == 1 then return custom else 'Shrink down to 1 command tmpInt = find(custom, 0, -1, ";") custom = left(custom, tmpInt) tmpInt = find(custom, 0, -1, "\n") custom = left(custom, tmpInt) return custom + ";" endif elseif dt <= GMC_AnalogInput8 then return "MG@AN[" + str(dt) + "];" elseif dt == GMC_Position then return "TP" + tmpStr + ";" elseif dt == GMC_PositionError then return "TE" + tmpStr + ";" elseif dt == GMC_CommandedPosition then return "RP" + tmpStr + ";" elseif dt == GMC_LatchedPosition then return "RL" + tmpStr + ";" elseif dt == GMC_DualEncoderPosition then return "DE?;" elseif dt == GMC_Torque then return "TT" + tmpStr + ";" elseif dt == GMC_Switches then return "TS" + tmpStr + ";" else return "" endif endfunc #undoc func GMC_ClearException func GMC_ClearException() dim errTyp, errLev as unibyte dim errStr[] as byte GetException(errStr, errTyp, errLev) endfunc Define Area Object type GalilCommunication #ToolImage "FFFFF00FC0038FF13FFD7C7F391F9C47CFF3E007F84FFF9FFF3FFE7FFFFF" '******************************************************************* 'Object: GalilCommunication 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: Galil motion controller communications object ' 'Version: 1.52 'Copyright 2004 QSI Corporation 'Permission is granted to copy, distribute and modify this code, 'provided that this copyright statement is preserved '******************************************************************* #doc object GalilCommunication ~This object forms the core of the Galil library. This object controls ~all interaction between the motion controller and the QTERM-G70. It is ~capable of communicating with a motion controller either serially or via ~ethernet. To communicate with a motion controller, create an instance of ~this object and set up its properties as appropriate. Then create other ~GMC objects and set thier commObject property to refer to this object. ~You can communicate with multiple motion controllers by creating one ~GalilCommunication object per controller. There is a limit of one controller ~per serial port on the G70 and a limit of 8 ethernet controllers that can be ~used at once. Library Standard Source TextSingleLineBDF Library Standard Source IPSupport library standard source formatfunctions #doc prop CommMethod ~The value of this property determines how this object will attempt communication ~with the controller. You can select between Serial, TCP/IP, UDP/IP or no ~communication. If you attempt to change communication methods while this object is ~attempting to open an ethernet channel to the controller, an error is generated and ~no change in communication is made. In general, you should set this property ~when designing your workspace and not change it at runtime on the terminal. dim CommMethod as GMC_CommMethod init CommMethod := GMC_EthernetUDP func CommMethod (newVal as GMC_CommMethod) if (newVal == GMC_EthernetUDP) or (newVal == GMC_EthernetTCP) then 'Attempting to switch to ethernet if (enetState == GMC_Pending) then 'Pending and attempting to switch between TCP & UDP? if newVal <> CommMethod then 'Attempting a swtich throw (str(me), "Unable to switch between UDP and TCP when an ethernet connection is pending") else CommMethod := newVal return 'No change endif elseif (enetState == GMC_Enet) then 'Have a current ethernet connection. Switching between TCP & UDP? if newVal <> CommMethod then 'Attempting swtich between TCP & UDP CommMethod := newVal CloseEthernet() OpenEthernet() else CommMethod := newVal return 'No change endif elseif (enetState == GMC_Serial) then CommMethod := newVal CloseSerial() OpenEthernet() else CommMethod := newVal OpenEthernet() endif elseif (newVal == GMC_UseSerial) then 'Attempting to switch to serial if (enetState == GMC_Serial) then CommMethod := newVal return 'No change elseif (enetState == GMC_Pending) then throw (str(me), "Unable to switch to serial communications while ethernet connecting is pending") elseif (enetState == GMC_Enet) then CommMethod := newVal CloseEthernet() OpenSerial() elseif enetState == GMC_Invalid then CommMethod := newVal OpenSerial() endif elseif (newVal == GMC_None) then 'Attempting to quit communications if (enetState == GMC_Serial) then CommMethod := newVal CloseSerial() elseif (enetState == GMC_Pending) then throw(str(me), "Unable to switch to no communication while ethernet connecting is pending") elseif (enetState == GMC_Enet) then CommMethod := newVal CloseEthernet() elseif (enetState == GMC_Invalid) then CommMethod := newVal endif endif endfunc #doc prop IPAddress ~This property defines the IP address of the motion controller. If communicating via ethernet ~set this property to be the IP address of the motion controller. Use the industry standard ~dotted string format (i.e. "192.168.1.1") to specify the address. This property is ignored if ~CommMethod is not set to either GMC_EthernetUDP or GMC_EthernetTCP. dim IPAddress as string init IPAddress := "192.168.1.1" func IPAddress (newVal as string) IPAddress := newVal if (enetState == GMC_SERIAL) or (enetState == GMC_Invalid) then return elseif (enetState == GMC_Pending) then throw (Str(me), "Unable to change IP address while ethernet connection is pending") else CloseEthernet() OpenEthernet() endif endfunc #doc prop serialPort ~This property determines which serial port on the QTERM-G70 is used for communication with ~the motion controller. Set it to the G70 serial port to which the controller is attached. ~This property is ignored if CommMethod is anything except GMC_UseSerial. dim SerialPort as comm init SerialPort := com1 func SerialPort (newVal as comm) if enetState == GMC_Serial then CloseSerial() SerialPort := newVal OpenSerial() else SerialPort := newVal endif endfunc #doc prop serialFormat ~This property determines the serial format that is used for communication with the motion ~controller. Select the format that the motion controller is using to ensure proper communcation. ~This property is ignored if UseEthernet is anything except GMC_UseSerial. dim SerialFormat as GMC_SerialFormat init SerialFormat := GMC_19200_RTS_CTS func SerialFormat (newVal as GMC_SerialFormat) SerialFormat := newVAl if enetState == GMC_Serial then VerifyCurPortSettings() endif endfunc #doc prop maxRetries ~If the motion controller fails to respond to a command, the communications object can attempt ~to retry the command. Generally the motion controller will only fail to respond if it ~is extremely busy or there is a communications problem. As many commands tell the controller ~to perform some action and can cause problems if they are resent, the default number of retries ~is zero. You may increase the number of retries if your application only uses query commands. ~

Note: This property only applies if you are using GMC_UseSerial or GMC_EthernetUDP ~as your communication method. This property is ignored for TCP communication as the ~TCP/IP protocol automatically retries. dim MaxRetries as integer init maxRetries := 0 #doc prop timeout ~timeout defines how long (in milliseconds) this object will wait for a response from ~the controller before it decides that there has been a communications failure. If the ~timeout elapses without receiving a response from the terminal, then the data is considered ~lost and is retried if maxRetries is non-zero. ~

Note: This property only applies if you are using GMC_UseSerial or GMC_EthernetUDP ~as you communication method. This property is ignored for TCP communication as the ~TCP/IP protocol automatically deals with timeout issues. dim timeout as integer init timeout := 3000 func timeout (newVal as integer) timeout := newVal timeoutCounts := newVal / 500 '# of half second ticks endfunc #doc prop displayErrors ~This property determines how, if at all, errors are displayed when they occur. Errors are ~displayed in a small yellow bar near the top of the display. The ~following options are available:

~
GMC_DisplayNone
No errors are displayed. This object will never display an error ~message. ~
GMC_DisplayCommErrors
Errors in communication are displayed. This includes ~communication timeouts and unexpected TCP disconnections. ~
GMC_DisplayAllErrors
All errors are displayed. This includes all communication ~errors as well as errors returned by the controller in response to bad commands.
dim displayErrors as GMC_DispErrors init displayErrors := GMC_DisplayCommErrors #doc prop unsolicitedAware ~This property determines whether this object will watch for unsolicited messages from the ~controller. If this value is true, then all data returned from the controller is examined ~for unsolicited messages (i.e. data returned from the controller that was not requested by ~this terminal. Examples include "MG" commands in the program executing on the controller). ~When unsolicited messages are detected, the UnsolicitedMessageReceived event is ~generated. You can handle this event to examine incomming unsolicited messages.

~If this property is false, then this object does not watch for unsolicited messages. Setting ~this property to false will generally lead to improved performance on the terminal, however, ~if an unsolicited message is sent, then a communications error will occur. Set this property ~to false if you want better performance on the terminal and know that the controller will not ~send unsolicited messages. dim unsolicitedAware as boolean init unsolicitedAware := true func Startup() handles msg_init Enable(me, true) Attach(me, default) CommMethod(CommMethod) RegisterMsghandler (me, MSG_TIMETICK, 25) 'Timeout ticks every 1/2 second GMC_SetCommObjPos(me) timeout(timeout) if GMC_DefaultCommObj == empty then GMC_DefaultCommObj := me #if _Tool Tool_Persist (GMC_DefaultCommObj) #endif endif endfunc private dim enetState as GMC_EnetStates init enetState := GMC_Invalid private func enetState (newVal as GMC_EnetStates) enetState := newVal endfunc private dim thePort as comm private func OpenEthernet() dim IPAddr[] as byte dim netMethod as netprotocol if commMethod == GMC_EthernetTCP then netMethod := NET_TCP else netMethod := NET_UDP endif #if _tool_any if enetState <> GMC_Invalid then tool_Trace (str(me) + " Invalid state when opening ethernet") endif #endif if _ParseIPAddressString (IPAddress, IPAddr) then NetOpen (me, NetMethod, GMC_GetLocalPort(), 51987, IPAddr) enetState = GMC_Pending else enetState = GMC_Invalid comBuf := "" throw (str(me), "Invalid IP Address: " + IPAddress) endif endfunc private func CloseEthernet() if enetState == GMC_Enet then 'Enet is currently open UnregisterMsgHandler (me, MSG_COMM_RECEIVE, thePort) NetClose (thePort) endif enetState = GMC_Invalid comBuf := "" endfunc private func CommAccept (socket as comm) handles MSG_COMM_ACCEPT if enetState <> GMC_Pending then NetClose (socket) 'This should never execute #if _tool_any tool_trace (str(me) + "Invalid state when NetAccept received") #endif endif 'Unregister whatever we might have been listening to UnregisterMsgHandler (me, MSG_COMM_RECEIVE, thePort) thePort := socket RegisterMsgHandler (me, MSG_COMM_RECEIVE, thePort) enetState = GMC_Enet 'Turn echo off. Set the unsolicited bits high SendAsciiCommandStream ("CW1;EO0;", me, 0) endfunc private func CommError (errcode as integer, errmsg[] as byte) handles MSG_COMM_ERROR MakeVisible ("Ethernet error: " + errMsg) if (thePort > COM10) or (thePort < COM1) then NetClose(thePort) endif UnregisterMsgHandler(me, MSG_COMM_RECEIVE, thePort) enetState = GMC_INVALID comBuf := "" CommMethod = GMC_NONE endfunc private func OpenSerial() #if _tool_any if enetState <> GMC_Invalid then tool_Trace (str(me) + "Invalid state when opening port") endif #endif thePort := SerialPort RegisterMsgHandler (me, MSG_COMM_RECEIVE, SerialPort) VerifyCurPortSettings() enetState = GMC_Serial 'Turn echo off. Set the unsolicited bits high SendAsciiCommandStream("TC;CW1;EO0;", me, 0) 'TC is a spurious command to deal with the bad 'char that is transmitted upon bootup endfunc private func CloseSerial() UnregisterMsgHandler (me, MSG_COMM_RECEIVE, SerialPort) enetState = GMC_Invalid comBuf := "" endfunc private func VerifyCurPortSettings () dim baud as syscmd_baud dim flow as syscmd_flowcontrol if SerialFormat == GMC_19200_RTS_CTS then baud := baud_19200 flow := flowcontrol_rts_cts elseif SerialFormat == GMC_9600_RTS_CTS then baud := baud_9600 flow := flowcontrol_rts_cts elseif SerialFormat == GMC_1200_RTS_CTS then baud := baud_1200 flow := flowcontrol_rts_cts elseif SerialFormat == GMC_19200_NOFLOW then baud := baud_19200 flow := flowcontrol_none elseif SerialFormat == GMC_9600_NOFLOW then baud := baud_9600 flow := flowcontrol_none elseif SerialFormat == GMC_1200_NOFLOW then baud := baud_1200 flow := flowcontrol_none else throw (str(me), "Invalid serial format setting") endif VerifyComSettings (serialPort, baud, flow) endfunc private func VerifyComSettings (port as comm, baud as syscmd_Baud, flow as syscmd_flowcontrol) dim dbits as syscmd_databits dim sbits as syscmd_stopbits dim parity as syscmd_parity dim baudCur as syscmd_baud dim flowCur as syscmd_flowcontrol dim bc, dbc, pc, sbc, fc as syscmd if port == com1 then bc := sys_com1baud dbc := sys_com1databits pc := sys_com1parity sbc := sys_com1stopbits fc := sys_com1flowcontrol elseif port == com2 then bc := sys_com2baud dbc := sys_com2databits pc := sys_com2parity sbc := sys_com2stopbits fc := sys_com2flowcontrol endif #ifnot _TOOL 'Don't set the settings in layout view 'Check each serial port paramater and set as appropriate GetsystemSetting (bc, baudCur, sysread_current) if baudCur <> baud then SetSystemSetting (bc, baud, SYSACT_DONOW) endif GetSystemSetting (fc, flowCur, sysread_current) if flowCur <> flow then SetSystemSetting (fc, flow, SYSACT_DONOW) endif GetSystemSetting (dbc, dbits, sysread_current) if dbits <> databits_8 then SetSystemSetting (dbc, databits_8, SYSACT_DONOW) endif GetSystemSetting (pc, parity, sysread_current) if parity <> parity_none then SetSystemSetting (pc, parity_none, SYSACT_DONOW) endif GetSystemSetting (sbc, sbits, sysread_current) if sbits <> stopbits_1 then SetSystemSetting (sbc, stopbits_1, SYSACT_DONOW) endif 'Set the timeout if (port == com1) or (port == com2) then SetSerialTimeout (port, 1) endif #endif endfunc private dim comBuf[] as byte private func CommReceive (data[] as byte) returns boolean handles MSG_COMM_RECEIVE dim pos1, pos2 as integer 'Special handling of suspended data if suspended then if not awaitingsuspense then suspendedRecv := data userDirectMsg (suspendNotify, GMC_SuspendCommReceive, suspendNotifyParm, true) return true endif endif if unsolicitedAware then ParseForUnsolicitedMessages (data) else comBuf := concat (comBuf, data) endif label top pos1 := find (comBuf, 0, -1, GMC_TermStr) if pos1 > 0 then pos2 := find (combuf, pos1, -1, ":") if pos2 > 0 then ' we found a complete response Parse (left (combuf, pos1)) combuf := mid(combuf, pos2+1, -1) 'goto top endif endif return true endfunc #doc prop curResponse ~This property contains the most recent response from the controller. It is guarenteed to be ~valid during a GMC_CommSuccess message. At any other time the value of this property ~may not be valid. It is the responsibility of the object that recieves the GMC_CommSuccess ~to parse the response appropriately #hidden dim curResponse as string private dim recvCmdBrks[GMC_MaxTxLen] as integer #hidden dim curFailureReason as GMC_FailureReason private func Parse(data[] as byte) dim cpos, qpos, oldPos as unibyte dim count as integer dim i, loopTerm, brkIdx, oldBrkIdx as integer dim errs[] as integer dim errorExists as boolean cpos := find (data, 0, -1, ":") qpos := find (data, 0, -1, "?") count = 1 recvCmdBrks[0] := -1 while (cPos < 65535) or (qPos < 65535) do if cPos < qPos then recvCmdBrks[count] := cPos count := count + 1 oldPos := cPos+1 cPos := find (data, oldPos, -1, ":") 'No need to find question else recvCmdBrks[count] := qPos 'note that an error occured redim (errs, len(errs)+1) errs[len(errs)-1] := count errorExists := true count := count + 1 oldPos := qPos+1 qPos := find (data, oldPos, -1, "?") 'No need to find colon endif loop 'Note the (count - 1) is because we started the count at one. We started the 'count at one because parsing the data for curResponse out is easier when we do if pendingCmdCount <> count - 1 then Retransmit("Unexpected controller response") else loopTerm := (pendingPktTail + 1) mod GMC_MaxPendingStreams i := tailIdx brkIdx := 0 oldBrkIdx := 0 if not errorExists then 'slightly faster loop for the common case of no errors! while i <> loopTerm do brkIdx := brkIdx + cmdCount[i] curResponse := mid(data, recvCmdBrks[oldBrkIdx]+1, recvCmdBrks[brkIdx] - recvCmdBrks[oldBrkIdx]-1) UserDirectMsg (notify[i], GMC_CommSuccess, notifyCodes[i], true) i := (i+1) mod GMC_MaxPendingStreams oldBrkIdx := brkIdx loop else 'slower loop where we have to see what errors exist and what to do about it! cpos := 0 'reuse cpos as an array index redim (errs, len(errs)+1) 'give ourselves an extra padding index while i <> loopTerm do brkIdx := brkIdx + cmdCount[i] curResponse := mid(data, recvCmdBrks[oldBrkIdx]+1, recvCmdBrks[brkIdx] - recvCmdBrks[oldBrkIdx]-1) if (oldBrkIdx+1 <= errs[cPos]) and (brkIdx >= errs[cPos]) then 'this command stream contained the error curFailureReason := GMC_FailBadCommand UserDirectMsg (notify[i], GMC_CommFailure, notifyCodes[i], true) cPos := cPos + 1 if displayErrors == GMC_DisplayAllErrors then MakeVisible (str(notify[i]) + ": Bad command") endif else UserDirectMsg (notify[i], GMC_CommSuccess, notifyCodes[i], true) endif i := (i+1) mod GMC_MaxPendingStreams oldBrkIdx := brkIdx loop endif ClearPendingPktInfo() endif endfunc private func ReceiveFail() dim i, loopTerm as integer loopTerm := (pendingPktTail + 1) mod GMC_MaxPendingStreams i := tailIdx curFailureReason := GMC_FailCommunications curResponse := "" while i <> loopTerm do UserDirectMsg (notify[i], GMC_CommFailure, notifyCodes[i], true) i := (i+1) mod GMC_MaxPendingStreams loop ClearPendingPktInfo() endfunc private func ClearPendingPktInfo() if awaitingResponse then awaitingResponse := false xmitbuf := mid (xmitBuf, pendingPktLen, -1) tailIdx := (pendingPktTail + 1) mod GMC_MaxPendingStreams endif TransmitStream() endfunc private dim xmitBuf[] as byte private dim lengths[GMC_MaxPendingStreams] as integer private dim cmdCount[GMC_MaxPendingStreams] as integer private dim notify[GMC_MaxPendingStreams] as objref private dim notifyCodes[GMC_MaxPendingStreams] as integer private dim headIdx as integer private dim tailIdx as integer #doc func SendAsciiCommandStream ~Use this command to send an arbitrary stream of commands to the controller. When the ~controller has responed, this object will send a GMC_CommSuccess or a GMC_CommFailure ~message to the notifyObj with the notifyCode as the paramater. #param stream: A semicolon separated list of commands to send to a Galil motion controller #param notifyObj:The object that will receive notification once the controller has responeded to the commands #param notifyCode:This value will be sent to the notifyObj in the notification message. It is primarily useful for objects that may poll different values at different times so that it can differenciate to which query it is receiving a response. func SendAsciiCommandStream(stream[] as byte, notifyObj as objref, notifyCode as integer) returns boolean return SendAsciiCommandStreamCounted (stream, notifyObj, notifyCode, GMC_CountCommands(stream)) endfunc #doc func SendAsciiCommandStreamCounted ~Use this command to send an arbitrary stream of commands to the controller. When the ~controller has responed, this object will send a GMC_CommSuccess or a GMC_CommFailure ~message to the notifyObj with the notifyCode as the paramater. This function is ~faster than SendAsciiCommandStream. Call this function if you know exactly ~how many commands are in stream. You generally do that by calling the global function ~GMC_CountCommands. #param stream: A semicolon separated list of commands to send to a Galil motion controller #param notifyObj:The object that will receive notification once the controller has responeded to the commands #param notifyCode:This value will be sent to the notifyObj in the notification message. It is primarily useful for objects that may poll different values at different times so that it can differenciate to which query it is receiving a response. #param count:The number of commands in the command stream. This value must correctly identify the number of commands in the stream, or a communications failure will occur. You can obtain the proper value by calling GMC_CountCommands on your stream of commands. func SendAsciiCommandStreamCounted (stream[] as byte, notifyObj as objref, -> notifyCode as integer, count as integer) returns boolean dim strLen as integer dim nextHeadIdx as integer 'Cannot transmit if using no comm method if commMethod == GMC_None then return false endif nextHeadIdx := (headIdx + 1) mod GMC_MaxPendingStreams strlen = len(stream) if len(stream) >= GMC_MaxTxLen then return false elseif (strlen <= 0) or (nextHeadIdx == tailIdx) then return false endif ' Add terminator if necessary if stream[strlen-1] <> ';' then stream := stream + ";" strLen := strLen + 1 endif xmitBuf := concat(xMitBuf, stream) lengths[headIdx] := strLen cmdCount[headIdx] := count notify[headIdx] := notifyObj notifyCodes[headIdx] := notifyCode headIdx := nextHeadIdx TransmitStream() return true endfunc private dim awaitingResponse as boolean private dim pendingPktTail as integer private dim pendingPktLen as integer private dim pendingPktTimeIdx as integer private dim pendingRetries as integer private dim pendingCmdCount as integer private dim curTimeIdx as integer private dim timeoutCounts as integer private dim isVisible as boolean init isVisible := false private dim visMessage as string private dim visTimeIdx as integer private func TransmitStream () dim sum, prevSum as integer dim prevTail as integer dim curTail as integer dim cmdSum, prevCmdSum as integer 'Reasons why we might not be able to transmit if (enetState <> GMC_Serial) and (enetState <> GMC_Enet) then 'Not connected return endif if awaitingResponse then return 'Currently waiting for a response. endif if suspended then 'Are we suspended for special communications? if awaitingSuspense then awaitingSuspense := false UserDirectMsg (suspendNotify, GMC_SuspendSuccessNotify, suspendNotifyParm, false) endif return endif if headIdx == tailIdx then 'Nothing to transmit return endif curTail := tailIdx sum := lengths[curTail] cmdSum := cmdCount[curTail] do prevTail := curTail prevSum := sum prevCmdSum := cmdSum curTail := (curTail + 1) mod GMC_MaxPendingStreams sum := sum + lengths[curTail] cmdSum := cmdSum + cmdCount[curTail] loop while (curTail <> headIdx) and (sum < GMC_MaxTxLen) 'Since the loop always takes us one iteration too far, use prevTail and prevSum awaitingResponse := true transmit (thePort, left(xmitBuf, prevSum) + GMC_SpecialTerm, false) pendingPktTail := prevTail pendingPktLen := prevSum pendingRetries := 0 pendingPktTimeIdx := curTimeIdx pendingCmdCount := prevCmdSum endfunc private func Retransmit (reason as string) if commMethod == GMC_EthernetTCP then return 'No Retry on TCP endif pendingRetries := pendingRetries + 1 if pendingRetries > maxRetries then MakeVisible(reason) ReceiveFail() else transmit (thePort, left(xmitBuf, pendingPktLen) + GMC_SpecialTerm, false) pendingPkttimeIdx := curTimeIdx MakeVisible(reason + ": Retry " + str(pendingRetries) + " / " + str(maxRetries)) endif endfunc private func MakeVisible(data as string) if displayErrors == GMC_DisplayNone then return endif if not isVisible then isVisible := true Resize (me, GetPosInfo(default, Get_Width), GMC_CommObjHeight) endif visMessage := str(me) + ": " + data visTimeIdx := curTimeIdx SendToFront(me) Rerender(me) endfunc private func MakeInvisible() isVisible := false Resize (me, 0,0) endfunc private func Timetick () handles MSG_TIMETICK curTimeIdx := curTimeIdx + 1 if awaitingResponse then if commMethod <> GMC_EthernetTCP then if curTimeIdx >= pendingPktTimeIdx + timeoutCounts then Retransmit("Response Timeout") endif endif endif if IsVisible then if curTimeIdx >= visTimeIdx + GMC_VisTimeout then MakeInvisible() endif endif endfunc private func Draw () handles MSG_DRAW SetFgColor (RGB_RED) SetBGColor (RGB_Yellow) _TextRect (0, GetPosInfo(me, Get_Y), GetPosInfo(default, GET_Width), GMC_CommObjHeight, visMessage, default, HA_CENTER, VA_CENTER) endfunc private func ParseForUnsolicitedMessages(data[] as byte) 'This function will update comBuf with the solicited portion of the message. 'Unsolicited portions will be added to unsolicitedBuf. The UnsolicitedMessageReceived 'event will be called if a complete message is received dim i, max as integer dim oldPos as integer dim state, oldState as boolean max = len(data)-1 for i = 0 to max state := ( (data[i] and byte(0x80)) <> 0) if state <> oldState then if oldState then AddUnsolicited (mid (data, oldPos, i-oldPos), i-oldPos-1) else comBuf := comBuf+ mid(data, oldPos, i-oldPos) endif oldState := state oldPos := i endif next 'Now add remainder if state then AddUnsolicited (mid (data, oldPos, i-oldPos), i-oldPos-1) else comBuf := comBuf+ mid(data, oldPos, i-oldPos) endif endfunc private func AddUnsolicited (data[] as byte, leng as integer) dim i as integer dim p1, p2, oldPos as unibyte for i = 0 to leng data[i] := data[i] and byte(0x7F) next UnsolicitedMessageReceived(data) endfunc #doc override UnsolicitedMessageReceived #param msg:This is the text of the unsolicited message. ~This event is called whenever unsolicited messages are received from the controller. The ~msg paramater contains the actual message. Unsolicited messages are NOT parsed ~for content, but rather are given immediately to this funciton. This means that the user ~is responsible for parsing the message. It is possible that two unsolicited messages may ~be passed to this event at once. It is also possible that a single unsolicited message may ~be split in to two calls to this event. func UnsolicitedMessageReceived(msg as string) return endfunc private dim suspended, awaitingSuspense as boolean private dim suspendNotify as objref private dim suspendNotifyParm as integer #doc prop suspendedRecv ~This property holds the most recent bit of data received by this object once it has been ~suspended. #hidden dim suspendedRecv[] as byte #doc func SuspendCommunications ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function breaks off normal communication with the motion controller. Communication ~requests are queued, until communications are resumed. This function returns true if ~the request has been successfully processed, however, you MUST NOT assume that the ~communications have actually been suspended until the object indicated by the notify ~paramater has received the GMC_SuspendSuccessNotify message.

~Once this object has been suspended, any incomming serial data will be stored in the property ~suspendedRecv and notify will be informed of the data reception via a ~GMC_SuspendCommReceive message. #param notify:Indicates the object that requested the suspension. This object will receive the GMC_SuspendSuccessNotify message once the suspension has taken effect #param parm:This value will be passed to notify as the paramater to the GMC_SuspendSuccessNotify message. func SuspendCommunications(notify as objref, parm as integer) returns boolean if (enetState <> GMC_Serial) and (enetState <> GMC_Enet) then 'Not connected return false endif suspended := true awaitingSuspense := true suspendNotify := notify suspendNotifyParm := parm TransmitStream() return true endfunc #doc func ResumeCommunications ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function resumes normal communications after the communications had been suspended func ResumeCommunications() suspended := false awaitingSuspense := false suspendNotify := empty suspendNotifyParm := 0 TransmitStream() endfunc #doc func IsSuspended ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function returns true if communications are currently suspended, false otherwise. func IsSuspended() returns boolean return (suspended) and (not awaitingSuspense) endfunc #doc func SuspendTransmit ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function is used to perform a special transmission when communications are suspended with ~the motion controller. This can only be used when communication is suspended. It will return ~false if communication is not suspended. Otherwise it transmits the data and returns true. #param data:This data will be transmitted to the controller without respect of formatting. As the communications object does not examine this data, it will not expect a response of any sort from the controller. func SuspendTransmit (data[] as byte) returns boolean if (not suspended) or (awaitingSuspense) then return false endif if (enetState <> GMC_Serial) and (enetState <> GMC_Enet) then 'Not connected return false endif transmit (thePort, data, false) return true endfunc Enddef #endif #endfile Te ˜ž“–“ ’œ Œœ ˜ž“–“œ’’Š‘–œž‹–‘Œ dtd ˜ž“–“ ’œ Œœ ˜ž“–“œ’’Š‘–œž‹–‘Œ dd} ˜’œ ›ž‹ž‹†šÐD} ˜’œ Œ–‹–‘dÀ}˜’œ Œ–‹–‘šeÀ}˜’œ œ’’ž‘›š›Œ–‹–‘fÀ}˜’œ “ž‹œ—š›Œ–‹–‘gÀ}˜’œ ›Šž“š‘œ›šŒ–‹–‘hÀ} ˜’œ ‹ŽŠšiÀ} ˜’œ Œˆ–‹œ—šŒjÀ}˜’œ ž‘ž“˜–‘Š‹ÎÀ}˜’œ ž‘ž“˜–‘Š‹ÍÀ}˜’œ ž‘ž“˜–‘Š‹ÌÀ}˜’œ ž‘ž“˜–‘Š‹ËÀ}˜’œ ž‘ž“˜–‘Š‹ÊÀ}˜’œ ž‘ž“˜–‘Š‹ÉÀ}˜’œ ž‘ž“˜–‘Š‹ÈÀ}˜’œ ž‘ž“˜–‘Š‹Ç dd}˜’œ ž‡–ŒÐD} ˜’œ ž‡–Œ ‡XÀ} ˜’œ ž‡–Œ †YÀ} ˜’œ ž‡–Œ …ZÀ} ˜’œ ž‡–Œ ˆWÀ} ˜’œ ž‡–Œ šEÀ} ˜’œ ž‡–Œ ™FÀ} ˜’œ ž‡–Œ ˜GÀ} ˜’œ ž‡–Œ —H dd}˜’œ š‰š“Œ‹†“šÐD}˜’œ š‰š“ž–Œš›À}˜’œ š‰š“ŒŠ‘”š‘À} ˜’œ š‰š“‘‘š d d } ˜’œ Œš–ž“™’ž‹ÐD } ˜’œ ÎÆÍÏÏ ‹Œ œ‹Œ  À } ˜’œ ÆÉÏÏ ‹Œ œ‹Œ  À } ˜’œ ÎÍÏÏ ‹Œ œ‹Œ  À } ˜’œ ÎÆÍÏÏ ‘™“ˆ  À } ˜’œ ÆÉÏÏ ‘™“ˆ  À } ˜’œ ÎÍÏÏ ‘™“ˆ   d td ˜’œ š‡‹š‘›š›œ’’›šŒ d d } ˜’œ š‘š‹Œ‹ž‹šŒÐD } ˜’œ Œš–ž“  À } ˜’œ š‘›–‘˜  À } ˜’œ š‘š‹  À } ˜’œ –‘‰ž“–›   d d } ˜’œ œ’’’š‹—›ÐD } ˜’œ ŠŒšŒš–ž“  À } ˜’œ š‹—š‘š‹Š›  À } ˜’œ š‹—š‘š‹‹œ  À } ˜’œ ‘‘š   d d } ˜’œ ›–ŒšŒÐD } ˜’œ ›–Œ“ž†‘‘šÀ } ˜’œ ›–Œ“ž†œ’’šŒÀ } ˜’œ ›–Œ“ž†ž““šŒ dd}˜’œ ™ž–“ŠššžŒ‘ÐD}˜’œ ™ž–“œ’’Š‘–œž‹–‘ŒÀ}˜’œ ™ž–“ž›œ’’ž‘›À}˜’œ ™ž–“Š‘š‡šœ‹š››ž‹ž d dàD} ˜’œ ’ž‡Œ‹šž’ dàD}˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dàD} ˜’œ ’ž‡‹‡“š‘P dàD}˜’œ Œšœ–ž“‹š’C²žÝ¿Ýò dàD} ˜’œ ‹š’Œ‹C¿ dàD}˜’œ ‰–Œ‹–’šŠ‹ d dàD0?}˜’œ œ’’ŒŠœœšŒŒ dàD0?}˜’œ œ’’™ž–“Šš dàD0?}˜’œ ŒŠŒš‘›ŒŠœœšŒŒ‘‹–™† dàD0?}˜’œ ŒŠŒš‘›œ’’šœš–‰š d d deÀD}˜’œ œ’’•ŒÐD€> deÀD}˜’œ œ’’•—š–˜—‹ÐD€> dÀD}˜’œ ›š™žŠ“‹œ’’•ÐDà>}˜ž“–“œ’’Š‘–œž‹–‘ d d! d"€W"}"˜’œ Œš‹œ’’•Œ€"}"•ÐD"à>"" d#ÀD#}#’ŠÀ#}#’›À#}#’“À#}#’À#}#‘“‡À#}#‘“†ÐD#€># d$ d%^%}%˜’œ œ’’•—š–˜—‹Ð%%^% d&}&˜š‹›™™‘‹’š‹–œŒ€&}&’“À&}&’À&}&’ŠÀ&}&’›À&}&‘“‡À&}&‘“†À&P&À&}& ™‘‹ ‘’ž“& d'}'˜’œ œ’’•—š–˜—‹Ð'}'’а'}'’› d(@^( d) d*}*š“œž‹š€*}*•À**À*}*˜’œ œ’’•Œ *}*˜’œ œ’’•—š–˜—‹* d+}+˜’œ œ’’•Œ+}+˜’œ œ’’•Œ°++ d,ÐW, d- d. d/€W/}/˜’œ ‰š–™†œ’’•€/}/ œ’’•šœ‹ÐD/W/ W/à>/}/˜ž“–“œ’’Š‘–œž‹–‘/ d0^0}0 œ’’•šœ‹Ð0}0š’‹†^0 d1}1 œ’’•šœ‹1}1˜’œ ›š™žŠ“‹œ’’• d2„d2 ‹“}2 ‹“ šŒ–Œ‹€2}2 œ’’•šœ‹2 d2 d3@^3 d4ÐW4 d5 d6e6ÀD6}6˜’œ œŠ“œž“‹ÐD6€>6 d7 d8€W8}8˜’œ ˜š‹“œž“‹€88°W8P?8 d9^9}9˜’œ œŠ“œž“‹Ð99^9 d:}: Œšš›ž‘›’‘Š’€:: d;};˜’œ œŠ“œž“‹;;'°;€>;€;;@œ ;}; ˜š‹ž‘›’‘Š’€;;; d<0^< d=}=˜’œ œŠ“œž“‹=€=€=}=˜’œ œŠ“œž“‹Ð=='=À==@œ=°==' d>@^> d? d@ð^@}@˜’œ œŠ“œž“‹ dAÐWA dB dC dD€WD}D˜’œ œŠ‘‹œ’’ž‘›Œ€D}DŒ‹šž’°DÐDÐDD >DD°WD€>D dEÀDE}EŒŒÀE}EŒ‘ÐDEP?E dFÀDF}F“›ŒÐDFP?F dGÀDG}GœŠ‘‹ÐDG€>G dH dI dJ dK dL dM}MŒŒM}M™–‘›€M}MŒ‹šž’ÀM}M“›ŒÀMÐMMÀMCMĐM dN}NŒ‘N}N™–‘›€N}NŒ‹šž’ÀN}N“›ŒÀNÐNNÀNCNõN dO dP dQ€^Q€Q}QŒŒàQ}QŒ‘Q^Q dR^R€R}RŒŒÀR}RŒ‘R^R dS}SœŠ‘‹S}SœŠ‘‹°SS dT dU}U“›ŒU}UŒŒ°UU dV}VŒŒV}V™–‘›€V}VŒ‹šž’ÀV}V“›ŒÀVÐVVÀVCVĐV dW0^W dX}XœŠ‘‹X}XœŠ‘‹°XX dY dZ}Z“›ŒZ}ZŒ‘°ZZ d[}[Œ‘[}[™–‘›€[}[Œ‹šž’À[}[“›ŒÀ[Ð[[À[C[õ[ d\@^\ d] ^] d^ d_ d`}`“›Œ`}`“š‘€`}`Œ‹šž’`Ð`` da^a}a“›ŒÀaa}^a db dc dd de^e€e}eŒ‹šž’°e}e“›ŒÐeàee;e^e df}fœŠ‘‹f}fœŠ‘‹°ff dg@^g dh@^h dið^i}iœŠ‘‹ djÐWj dk dl dm€Wm}m˜’œ›ž‹ž‹†š‹œ’’ž‘›€m}m›‹ÐDm}m ˜’œ ›ž‹ž‹†šÀm}mž‡–ŒÐDm}m˜’œ ž‡–ŒÀm}m ŠŒšœŠŒ‹’ÐDm°>mÀm}nœŠŒ‹’ÐDnÀ>nn°WnÀ>n do dpÀDp}p‹’Œ‹°ppÐpÐDp >p dqÀDq}q‹’–‘‹ÐDq€>q dr}r‹’Œ‹°rrÐrr}rž‡–Œ ds dt^t}t ŠŒšœŠŒ‹’^t du dv}v‹’–‘‹Ðv}v˜’œ œŠ‘‹œ’’ž‘›Œ€v}vœŠŒ‹’v dw^w}w‹’–‘‹Àww^w dxð^xCx«¯§Ä dy ^y}y‹’–‘‹Ðyy^y dzð^z}zœŠŒ‹’ d{0^{ d| d}}}‹’–‘‹Ð}}}™–‘›€}}}œŠŒ‹’À}}À}Ð}}À}C}Đ} d~}~œŠŒ‹’Ð~}~“𙋀~}~œŠŒ‹’À~}~‹’–‘‹~ d}‹’–‘‹Ð}™–‘›€}œŠŒ‹’ÀÀÐÀCõ d€}€œŠŒ‹’Ѐ}€“𙋀€}€œŠŒ‹’À€}€‹’–‘‹€ dð^}œŠŒ‹’°CÄ d‚@^‚ dƒ ^ƒ}ƒ›‹ƒ}ƒ˜’œ ž‘ž“˜–‘Š‹Ç^ƒ d„ð^„C„²ž¿Ÿ±€°„}„Œ‹€„}„›‹„°„C„¢Ä d… ^…}…›‹Ð…}… ˜’œ Œ–‹–‘^… d†ð^†C†«¯°†}†‹’Œ‹°†C†Ä d‡ ^‡}‡›‹Ð‡}‡˜’œ Œ–‹–‘š^‡ dˆð^ˆCˆ«º°ˆ}ˆ‹’Œ‹°ˆCˆÄ d‰ ^‰}‰›‹Ð‰}‰˜’œ œ’’ž‘›š›Œ–‹–‘^‰ dŠð^ŠCŠ­¯°Š}Š‹’Œ‹°ŠCŠÄ d‹ ^‹}‹›‹Ð‹}‹˜’œ “ž‹œ—š›Œ–‹–‘^‹ dŒð^ŒCŒ­³°Œ}Œ‹’Œ‹°ŒCŒÄ d ^}›‹Ð}˜’œ ›Šž“š‘œ›šŒ–‹–‘^ dŽð^ŽCŽ»ºÀÄ d ^}›‹Ð} ˜’œ ‹ŽŠš^ dð^C««°}‹’Œ‹°CÄ d‘ ^‘}‘›‹Ð‘}‘ ˜’œ Œˆ–‹œ—šŒ^‘ d’ð^’C’«¬°’}’‹’Œ‹°’C’Ä d“0^“ d”ð^”C” d•@^• d–ÐW– d— d˜ d™€W™}™˜’œ œ“šžš‡œš‹–‘€™™ dšÀDš}šš‹†Àš}šš“š‰ÐDšP?š d›ÀD›}›šŒ‹°›Ð›ÐD› >› dœ d} ˜š‹š‡œš‹–‘€}šŒ‹À}š‹†À}š“š‰ džÐWž dŸKŸKŸ KŸ@KŸ}Ÿ˜ž“–“œ’’Š‘–œž‹–‘ d @d C <¹¹¹¹¹ÏϹŒÏÏÌǹ¹Î̹¹»ÈŒÈ¹ÌÆÎ¹ÆŒËÈŒ¹¹ÌºÏÏȹÇ˹¹¹Æ¹¹¹Ì¹¹ºÈ¹¹¹¹¹ d¡ d¢ d£ d€ d¥ dŠ d§ dš d© dª d« d¬ d­ d® d¯ d° d± d² d³ dŽ dµ d¶ d· dž d¹ dºÀdº}ºŒ‹ž‘›ž›Ðdº}º‹š‡‹Œ–‘˜“š“–‘š›™ d»Àd»}»Œ‹ž‘›ž›Ðd»}» –ŒŠ‹ dŒÀdŒ}ŒŒ‹ž‘›ž›ÐdŒ}Œ™’ž‹™Š‘œ‹–‘Œ dœ dŸ d¿ dÀ dÁ d dà dÄ dÅ dÆÀDÆ}Æ œ’’’š‹—›ÐDÆ}Ƙ’œ œ’’’š‹—› dÇðDÇ}Ç œ’’’š‹—›Ç}ǘ’œ š‹—š‘š‹Š› dȀWÈ}È œ’’’š‹—›€È}È‘šˆ‰ž“ÐDÈ}Ș’œ œ’’’š‹—›È dÉ^ɀÉ}É‘šˆ‰ž“ÐÉ}ɘ’œ š‹—š‘š‹Š›ÉÀɀÉ}É‘šˆ‰ž“ÐÉ}ɘ’œ š‹—š‘š‹‹œÉ^É dÊ dË dÌ^̀Ì}Ì š‘š‹Œ‹ž‹šÐÌ}Ì ˜’œ š‘›–‘˜Ì^Ì dÍ dÎ^Î}Î‘šˆ‰ž“àÎ}Î œ’’’š‹—›^Î dÏ dÐ}Ћ—ˆ€Ð}ÐŒ‹€Ðà^АÐÀÐCÐKª‘ž“šß‹ßŒˆ–‹œ—ßš‹ˆšš‘ߪ»¯ßž‘›ß«Œ¯ßˆ—š‘ßž‘ßš‹—š‘š‹ßœ‘‘šœ‹–‘ß–Œßš‘›–‘˜Ð dÑ0^Ñ dÒ}Ò œ’’’š‹—›Ò}Ò‘šˆ‰ž“ dÓð^Ó dÔ@^Ô dÕ ^ՀÕ}Õ š‘š‹Œ‹ž‹šÐÕ}Õ˜’œ š‘š‹Õ^Õ dÖ d×^×}×‘šˆ‰ž“à×}× œ’’’š‹—›^× dØ dÙ dÚ}Ú œ’’’š‹—›Ú}Ú‘šˆ‰ž“ dÛ}Û œ“Œšš‹—š‘š‹€ېÛ dÜ}Ü š‘š‹—š‘š‹€ܐÜ dÝ0^Ý dÞ}Þ œ’’’š‹—›Þ}Þ‘šˆ‰ž“ dßð^ß dà@^à dá ^á€á}á š‘š‹Œ‹ž‹šÐá}á ˜’œ Œš–ž“á^á dâ}⠜’’’š‹—›â}⑚ˆ‰ž“ dã}㠜“ŒšŒš–ž“€ãã dä}ä š‘š‹—š‘š‹€ää då0^å dæ}æ œ’’’š‹—›æ}摚ˆ‰ž“ dç}ç š‘š‹—š‘š‹€çç dè@^è dé ^é€é}鑚ˆ‰ž“Ðé}é ˜’œ ŠŒšŒš–ž“é^é dê dë^ë€ë}ë š‘š‹Œ‹ž‹šÐë}ë ˜’œ Œš–ž“ë^ë dì}ì œ’’’š‹—›ì}쑚ˆ‰ž“ díð^í dî ^î€î}î š‘š‹Œ‹ž‹šÐî}î ˜’œ š‘›–‘˜î^î dï}ï‹—ˆ€ï}€ïà^ïïÀïCïNª‘ž“šß‹ßŒˆ–‹œ—ß‹ßŒš–ž“ßœ’’Š‘–œž‹–‘Œßˆ—–“šßš‹—š‘š‹ßœ‘‘šœ‹–‘˜ß–Œßš‘›–‘˜ï dð ^ð€ð}𠚑š‹Œ‹ž‹šÐð}𘒜 š‘š‹ð^ð dñ}ñ œ’’’š‹—›ñ}ñ‘šˆ‰ž“ dò}ò œ“Œšš‹—š‘š‹€òò dó}ó š‘Œš–ž“€óó dô ^ô}ô š‘š‹Œ‹ž‹šÐô}ô ˜’œ –‘‰ž“–›^ô dõ}õ œ’’’š‹—›õ}õ‘šˆ‰ž“ dö}ö š‘Œš–ž“€öö d÷@^÷ dø ^ø€ø}ø‘šˆ‰ž“Ðø}ø˜’œ ‘‘šø^ø dù dú^ú€ú}ú š‘š‹Œ‹ž‹šÐú}ú ˜’œ Œš–ž“ú^ú dû}û œ’’’š‹—›û}û‘šˆ‰ž“ dü}ü œ“ŒšŒš–ž“€üü dý ^ý€ý}ý š‘š‹Œ‹ž‹šÐý}ý ˜’œ š‘›–‘˜ý^ý dþ}þ‹—ˆ€þ}þŒ‹€þà^þþÀþCþIª‘ž“šß‹ßŒˆ–‹œ—ß‹ß‘ßœ’’Š‘–œž‹–‘߈—–“šßš‹—š‘š‹ßœ‘‘šœ‹–‘˜ß–Œßš‘›–‘˜þ dÿ ^ÿ€ÿ}ÿ š‘š‹Œ‹ž‹šÐÿ}ÿ˜’œ š‘š‹ÿ^ÿ d} œ’’’š‹—›}‘šˆ‰ž“ d} œ“Œšš‹—š‘š‹€ d ^€} š‘š‹Œ‹ž‹šÐ} ˜’œ –‘‰ž“–›^ d} œ’’’š‹—›}‘šˆ‰ž“ d@^ d@^ dÐW d d d  d  d  d  d ÀD }  –ž››šŒŒÐD À>  dðD} –ž››šŒŒC ÎÆÍÑÎÉÇÑÎÑÎ d€W} –ž››šŒŒ€}‘šˆ‰ž“ÐDÀ> d} –ž››šŒŒ}‘šˆ‰ž“ d d^€} š‘š‹Œ‹ž‹šÐ} ˜’œ Œš–ž“À€} š‘š‹Œ‹ž‹šÐ} ˜’œ –‘‰ž“–›^ dð^ d ^€} š‘š‹Œ‹ž‹šÐ} ˜’œ š‘›–‘˜^ d}‹—ˆ€}Œ‹€à^ÀC@ª‘ž“šß‹ßœ—ž‘˜šß¶¯ßž››šŒŒßˆ—–“šßš‹—š‘š‹ßœ‘‘šœ‹–‘ß–Œßš‘›–‘˜ d0^ d} œ“Œšš‹—š‘š‹€ d} š‘š‹—š‘š‹€ d@^ dÐW d d d d d d ÀD }  Œš–ž“‹ÐD } œ’’ d!ðD!}! Œš–ž“‹!}!œ’Î d"€W"}" Œš–ž“‹€"}"‘šˆ‰ž“ÐD"}"œ’’" d#^#}# š‘š‹Œ‹ž‹šÐ#}# ˜’œ Œš–ž“^# d$}$ œ“ŒšŒš–ž“€$$ d%}% Œš–ž“‹%}%‘šˆ‰ž“ d&}& š‘Œš–ž“€&& d'0^' d(}( Œš–ž“‹(}(‘šˆ‰ž“ d)@^) d*ÐW* d+ d, d- d. d/ d0ÀD0}0 Œš–ž“™’ž‹ÐD0}0˜’œ Œš–ž“™’ž‹ d1ðD1}1 Œš–ž“™’ž‹1}1˜’œ ÎÆÍÏÏ ‹Œ œ‹Œ d2€W2}2 Œš–ž“™’ž‹€2}2‘šˆ‰ž“ÐD2}2˜’œ Œš–ž“™’ž‹2 d3}3 Œš–ž“™’ž‹3}3‘šˆ‰ž“ d4^4}4 š‘š‹Œ‹ž‹šÐ4}4 ˜’œ Œš–ž“^4 d5}5‰š–™†œŠ‹Œš‹‹–‘˜Œ€55 d6@^6 d7ÐW7 d8 d9 d: d; d< d= d> d? d@ dA dBÀDB}B ’ž‡š‹–šŒÐDB€>B dCðDC}C ’ž‡š‹–šŒCC dD dE dF dG dH dI dJ dK dL dMÀDM}M‹–’šŠ‹ÐDM€>M dNðDN}N‹–’šŠ‹NNž dO€WO}O‹–’šŠ‹€O}O‘šˆ‰ž“ÐDO€>OO dP}P‹–’šŠ‹P}P‘šˆ‰ž“ dQ}Q ‹–’šŠ‹œŠ‘‹ŒQ}Q‘šˆ‰ž“ðQQô dRÐWR dS dT dU dV dW dX dY dZ d[ d\ d] d^ÀD^}^ ›–Œ“ž†šŒÐD^}^˜’œ ›–ŒšŒ d_ðD_}_ ›–Œ“ž†šŒ_}_˜’œ ›–Œ“ž†œ’’šŒ d` da db dc dd de df dg dh di dj dk dl dmÀDm}mŠ‘Œ“–œ–‹š›žˆžšÐDm°>m dnðDn}nŠ‘Œ“–œ–‹š›žˆžšn1n do dp€Wp}pŒ‹ž‹Š€pp dqÀWq}q’Œ˜ –‘–‹ dr ds}sš‘ž“š€sà^sÀs1ss dt}tž‹‹žœ—€tà^tÀtPtt du dv}v œ’’’š‹—›€v}v œ’’’š‹—›v dw}wš˜–Œ‹š’Œ˜—ž‘›“š€wà^wÀw}w ’Œ˜ ‹–’š‹–œ”Àwww dx dy}y˜’œ Œš‹œ’’•Œ€yà^yy dz}z‹–’šŠ‹€z}z‹–’šŠ‹z d{ d|^|}|˜’œ ›š™žŠ“‹œ’’•Ð|}|š’‹†^| d}}}˜’œ ›š™žŠ“‹œ’’•}à^} d~„d~ ‹“}~ ‹“ šŒ–Œ‹€~}~˜’œ ›š™žŠ“‹œ’’•~ d~ d@^ d€ÐW€ d d‚ dƒ`KƒÀDƒ}ƒ š‘š‹Œ‹ž‹šÐDƒ}ƒ˜’œ š‘š‹Œ‹ž‹šŒ d„ðD„}„ š‘š‹Œ‹ž‹š„}„ ˜’œ –‘‰ž“–› d…`K…€W…}… š‘š‹Œ‹ž‹š€…}…‘šˆ‰ž“ÐD…}…˜’œ š‘š‹Œ‹ž‹šŒ… d†}† š‘š‹Œ‹ž‹š†}†‘šˆ‰ž“ d‡ÐW‡ dˆ d‰`K‰ÀD‰}‰‹—š‹ÐD‰}‰œ’’ dŠ d‹`K‹€W‹}‹ š‘š‹—š‘š‹€‹‹ dŒÀDŒ}Œ–ž››°ŒÐŒÐDŒ >Œ d dŽÀDŽ}Ž ‘š‹’š‹—›ÐDŽ}Ž ‘š‹‹œ“ d^} œ’’’š‹—›Ð}˜’œ š‹—š‘š‹‹œ^ d} ‘š‹’š‹—›}‘š‹ ‹œ d‘0^‘ d’}’ ‘š‹’š‹—›’}’‘š‹ Š› d“@^“ d” d•„d•  ‹“ ž‘† d–^–}– š‘š‹Œ‹ž‹šà–}– ˜’œ –‘‰ž“–›^– d—}— ‹“ ‹žœš€—}—Œ‹€—à^——°—C—$ß¶‘‰ž“–›ßŒ‹ž‹šßˆ—š‘ߐš‘–‘˜ßš‹—š‘š‹— d˜@^˜ d™ d™ dš d›^›}› žŒš–ž››šŒŒŒ‹–‘˜€›}› –ž››šŒŒÀ›}›–ž›››^› dœ}œ‘š‹š‘€œà^œÀœ}œ ‘š‹’š‹—›Àœ}œ˜’œ ˜š‹“œž“‹€œœÀœœËÀœ}œ–ž››œ d} š‘š‹Œ‹ž‹šÐ} ˜’œ š‘›–‘˜ dž0^ž dŸ}Ÿ š‘š‹Œ‹ž‹šÐŸ}Ÿ ˜’œ –‘‰ž“–› d } œ’Š™ C  d¡}¡‹—ˆ€¡}¡Œ‹€¡à^¡¡À¡C¡¶‘‰ž“–›ß¶¯ßŸ››šŒŒÅß°¡}¡ –ž››šŒŒ¡ d¢@^¢ d£ÐW£ d€ d¥`K¥€W¥}¥ œ“Œšš‹—š‘š‹€¥¥ dŠ^Š}Š š‘š‹Œ‹ž‹šÐŠ}Š˜’œ š‘š‹^Š d§}§Š‘š˜–Œ‹š’Œ˜—ž‘›“š€§à^§À§}§’Œ˜ œ’’ šœš–‰šÀ§}§‹—š‹§ dš}š‘š‹œ“Œš€š}š‹—š‹š d©@^© dª}ª š‘š‹Œ‹ž‹šÐª}ª ˜’œ –‘‰ž“–› d«}«œ’Š™«C« d¬ÐW¬ d­ d®`K®€W®}® œ’’žœœš‹€®}®Œœ”š‹ÐD®}®œ’’® d¯ÀW¯}¯’Œ˜ œ’’ žœœš‹ d° d±^±}± š‘š‹Œ‹ž‹šà±}± ˜’œ š‘›–‘˜^± d²}²‘š‹œ“Œš€²}²Œœ”š‹² d³„d³  ‹“ ž‘† dŽ}Ž ‹“ ‹žœš€Ž}ŽŒ‹€Žà^ސްŽCŽ%¶‘‰ž“–›ßŒ‹ž‹šßˆ—š‘ß±š‹Ÿœœš‹ßšœš–‰š›Ž dµ dµ d¶@^¶ d· dž d¹}¹Š‘š˜–Œ‹š’Œ˜—ž‘›“š€¹à^¹À¹}¹’Œ˜ œ’’ šœš–‰šÀ¹}¹‹—š‹¹ dº d»}»‹—š‹»}»Œœ”š‹ dŒ}Œš˜–Œ‹š’Œ˜—ž‘›“š€Œà^ŒÀŒ}Œ’Œ˜ œ’’ šœš–‰šÀŒ}Œ‹—š‹Œ dœ dŸ}Ÿ š‘š‹Œ‹ž‹šÐŸ}Ÿ˜’œ š‘š‹ d¿ dÀ dÁ}ÁŒš‘›žŒœ––œ’’ž‘›Œ‹šž’€ÁCÁŒšÎĺ°ÏÄÀÁà^ÁÀÁÁÁ dÂÐW dà dÄ`KÄ€WÄ}Ä œ’’š€Ä}Äšœ›šÐDÄ€>ÄÀÄ}Äš’Œ˜°ÄÐÄÐDÄ >ÄÄ dÅÀWÅ}Å’Œ˜ œ’’ š dÆ dÇ}Ç ’ž”š‰–Œ–“š€ÇCǺ‹—š‘š‹ßšÅß°Ç}Çš’Œ˜Ç dÈ dÉ^É€É}É‹—š‹àÉ}Éœ’ÎϐÉÀÉ€É}É‹—š‹ÀÉ}Éœ’ΐÉ^É dÊ}Ê‘š‹œ“Œš€Ê}Ê‹—š‹Ê dË@^Ë dÌ}ÌŠ‘š˜–Œ‹š’Œ˜—ž‘›“š€Ìà^ÌÀÌ}Ì’Œ˜ œ’’ šœš–‰šÀÌ}Ì‹—š‹Ì dÍ}Í š‘š‹Œ‹ž‹šÐÍ}Í ˜’œ –‘‰ž“–› dÎ}̐’Š™ÎCÎ dÏ}Ï œ’’’š‹—›ÐÏ}Ϙ’œ ‘‘š dÐÐWÐ dÑ dÒ`KÒ€WÒ}Ò š‘Œš–ž“€ÒÒ dÓ„dÓ  ‹“ ž‘† dÔ^Ô}Ô š‘š‹Œ‹ž‹šàÔ}Ô ˜’œ –‘‰ž“–›^Ô dÕ}Õ ‹“ ‹žœš€Õ}ÕŒ‹€Õà^ՐհÕCÕ¶‘‰ž“–›ßŒ‹ž‹šßˆ—š‘ߐš‘–‘˜ß‹Õ dÖ@^Ö d× d× dØ dÙ}Ù‹—š‹Ù}Ù Œš–ž“‹ dÚ}Úš˜–Œ‹š’Œ˜—ž‘›“š€Úà^ÚÀÚ}Ú’Œ˜ œ’’ šœš–‰šÀÚ}Ú Œš–ž“‹Ú dÛ}Û‰š–™†œŠ‹Œš‹‹–‘˜Œ€ÛÛ dÜ}Ü š‘š‹Œ‹ž‹šÐÜ}Ü ˜’œ Œš–ž“ dÝ dÞ dß}ßŒš‘›žŒœ––œ’’ž‘›Œ‹šž’€ßCß «ŒÄŒšÎĺ°ÏÄÀßà^ßÀßßß dà dáÐWá dâ dã`Kã€Wã}ã œ“ŒšŒš–ž“€ãã dä}䊑š˜–Œ‹š’Œ˜—ž‘›“š€äà^äÀä}ä’Œ˜ œ’’ šœš–‰šÀä}ä Œš–ž“‹ä då}å š‘š‹Œ‹ž‹šÐå}å ˜’œ –‘‰ž“–› dæ}朐’Š™æCæ dçÐWç dè dé`Ké€Wé}鉚–™†œŠ‹Œš‹‹–‘˜Œ€éé dêÀDê}êžŠ›ÐDê}ê Œ†Œœ’› žŠ› dëÀDë}뙓ˆÐDë}댆Œœ’› ™“ˆœ‘‹“ dì dí^í}í Œš–ž“™’ž‹Ðí}혒œ ÎÆÍÏÏ ‹Œ œ‹Œ^í dî}îžŠ›î}î žŠ› ÎÆÍÏÏ dï}ˆï}ˆœ‘‹“ ‹Œ œ‹Œ dð ^ð}𠌚–ž“™’ž‹Ðð}𘒜 ÆÉÏÏ ‹Œ œ‹Œ^ð dñ}ñžŠ›ñ}ñ žŠ› ÆÉÏÏ dò}ò™“ˆò}ò™“ˆœ‘‹“ ‹Œ œ‹Œ dó ^ó}ó Œš–ž“™’ž‹Ðó}ó˜’œ ÎÍÏÏ ‹Œ œ‹Œ^ó dô}ôžŠ›ô}ô žŠ› ÎÍÏÏ dõ}õ™“ˆõ}õ™“ˆœ‘‹“ ‹Œ œ‹Œ dö ^ö}ö Œš–ž“™’ž‹Ðö}ö˜’œ ÎÆÍÏÏ ‘™“ˆ^ö d÷}÷žŠ›÷}÷ žŠ› ÎÆÍÏÏ dø}ø™“ˆø}ø™“ˆœ‘‹“ ‘‘š dù ^ù}ù Œš–ž“™’ž‹Ðù}ù˜’œ ÆÉÏÏ ‘™“ˆ^ù dú}úžŠ›ú}ú žŠ› ÆÉÏÏ dû}û™“ˆû}û™“ˆœ‘‹“ ‘‘š dü ^ü}ü Œš–ž“™’ž‹Ðü}ü˜’œ ÎÍÏÏ ‘™“ˆ^ü dý}ýžŠ›ý}ý žŠ› ÎÍÏÏ dþ}þ™“ˆþ}þ™“ˆœ‘‹“ ‘‘š dÿ0^ÿ d}‹—ˆ€}Œ‹€à^ÀC¶‘‰ž“–›ßŒš–ž“ß™’ž‹ßŒš‹‹–‘˜ d@^ d d}‰š–™†œ’Œš‹‹–‘˜Œ€} Œš–ž“‹À}žŠ›À}™“ˆ dÐW d d`K€W}‰š–™†œ’Œš‹‹–‘˜Œ€}‹ÐD}œ’’À}žŠ›ÐD} Œ†Œœ’› žŠ›À}™“ˆÐD}Œ†Œœ’› ™“ˆœ‘‹“ dÀD}›–‹ŒÐD}Œ†Œœ’› ›ž‹ž–‹Œ dÀD}Œ–‹ŒÐD}Œ†Œœ’› Œ‹–‹Œ d ÀD } ž–‹†ÐD }  Œ†Œœ’› ž–‹† d ÀD } žŠ›œŠÐD }  Œ†Œœ’› žŠ› d ÀD } ™“ˆœŠÐD } Œ†Œœ’› ™“ˆœ‘‹“ d  d ÀD } œÀ } ›œÀ } œÀ } ŒœÀ } ™œÐD } Œ†Œœ’› d d^}‹Ð}œ’Î^ d}œ} Œ†Œ œ’ΝžŠ› d}›œ}Œ†Œ œ’Λž‹ž–‹Œ d}œ}Œ†Œ œ’Ώž–‹† d}Œœ}Œ†Œ œ’ÎŒ‹–‹Œ d}™œ}Œ†Œ œ’Ι“ˆœ‘‹“ d ^}‹Ð}œ’Í^ d}œ} Œ†Œ œ’͝žŠ› d}›œ}Œ†Œ œ’Í›ž‹ž–‹Œ d}œ}Œ†Œ œ’͏ž–‹† d}Œœ}Œ†Œ œ’ÍŒ‹–‹Œ d}™œ}Œ†Œ œ’Í™“ˆœ‘‹“ d@^ d dTe ‹“ d d}˜š‹Œ†Œ‹š’Œš‹‹–‘˜€}œÀ}žŠ›œŠÀ}Œ†Œšž› œŠš‘‹ d ^ } žŠ›œŠà } žŠ›^  d!}!Œš‹Œ†Œ‹š’Œš‹‹–‘˜€!}!œÀ!}!žŠ›À!}! Œ†Œžœ‹ ›‘ˆ! d"@^" d# d$}$˜š‹Œ†Œ‹š’Œš‹‹–‘˜€$}$™œÀ$}$™“ˆœŠÀ$}$Œ†Œšž› œŠš‘‹$ d%^%}%™“ˆœŠà%}%™“ˆ^% d&}&Œš‹Œ†Œ‹š’Œš‹‹–‘˜€&}&™œÀ&}&™“ˆÀ&}& Œ†Œžœ‹ ›‘ˆ& d'@^' d( d)})˜š‹Œ†Œ‹š’Œš‹‹–‘˜€)})›œÀ)})›–‹ŒÀ)})Œ†Œšž› œŠš‘‹) d*^*}*›–‹Œà*}* ›ž‹ž–‹Œ Ç^* d+}+Œš‹Œ†Œ‹š’Œš‹‹–‘˜€+}+›œÀ+}+ ›ž‹ž–‹Œ ÇÀ+}+ Œ†Œžœ‹ ›‘ˆ+ d,@^, d- d.}.˜š‹Œ†Œ‹š’Œš‹‹–‘˜€.}.œÀ.}.ž–‹†À.}.Œ†Œšž› œŠš‘‹. d/^/}/ž–‹†à/}/ ž–‹† ‘‘š^/ d0}0Œš‹Œ†Œ‹š’Œš‹‹–‘˜€0}0œÀ0}0 ž–‹† ‘‘šÀ0}0 Œ†Œžœ‹ ›‘ˆ0 d1@^1 d2 d3}3˜š‹Œ†Œ‹š’Œš‹‹–‘˜€3}3ŒœÀ3}3Œ–‹ŒÀ3}3Œ†Œšž› œŠš‘‹3 d4^4}4Œ–‹Œà4}4 Œ‹–‹Œ Î^4 d5}5Œš‹Œ†Œ‹š’Œš‹‹–‘˜€5}5ŒœÀ5}5 Œ‹–‹Œ ÎÀ5}5 Œ†Œžœ‹ ›‘ˆ5 d6@^6 d7 d8 d9^9€9}9‹Ð9}9œ’ΐ9À9€9}9‹Ð9}9œ’͐9^9 d:}:Œš‹Œš–ž“‹–’šŠ‹€:}:‹À::: d;@^; d< d= d= d>ÐW> d? d@ dA`KAÀDA}Aœ’Š™°AÐAÐDA >A dB`KB€WB}B œ’’šœš–‰š€B}B›ž‹ž°BÐBÐDB >BB°WB°>B dCÀWC}C’Œ˜ œ’’ šœš–‰š dD dEÀDE}EŒÎÀE}EŒÍÐDE€>E dF dG dH dI^I}I ŒŠŒš‘›š›^I dJ^JJ}Jžˆž–‹–‘˜ŒŠŒš‘Œš^J dK}K ŒŠŒš‘›š›šœ‰K}K›ž‹ž dL}L ŠŒš›–šœ‹’Œ˜€L}L ŒŠŒš‘›‘‹–™†ÀL}L˜’œ ŒŠŒš‘›œ’’šœš–‰šÀL}LŒŠŒš‘›‘‹–™†ž’ÀL1LL dMð^M1M dN@^N dO@^O dP dQ^Q}QŠ‘Œ“–œ–‹š›žˆžš^Q dR}RžŒš™Š‘Œ“–œ–‹š›’šŒŒž˜šŒ€R}R›ž‹žR dS0^S dT}Tœ’Š™T}Tœ‘œž‹€T}Tœ’Š™ÀT}T›ž‹žT dU@^U dV dWà]W}W‹ dX}XŒÎX}X™–‘›€X}Xœ’Š™ÀXXÀXÐXXÀX}X ˜’œ ‹š’Œ‹X dY^Y}YŒÎàYY^Y dZ}ZŒÍZ}Z™–‘›€Z}Zœ’Š™ÀZ}ZŒÎÀZÐZZÀZCZŐZ d[^[}[ŒÍà[[^[ d\}\žŒš€\}\“𙋀\}\œ’Š™À\}\ŒÎ\\ d]}]œ’Š™]}]’–›€]}]œ’Š™À]}]ŒÍ°]]À]Ð]]] d^ d_@^_ d`@^` da dbð^b1b dcÐWc dd de df dg dh di djejÀDj}j œŠšŒ‘ŒšÐDjÀ>j dk`KkÀDk}k šœ‰œ’›”Œ°k}k ˜’œ ’ž‡‹‡“š‘ÐkÐDk€>k dl dmemÀDm}mœŠ™ž–“ŠššžŒ‘ÐDm}m˜’œ ™ž–“ŠššžŒ‘ dn do`Ko€Wo}ožŒš€o}o›ž‹ž°oÐoÐDo >oo dpÀDp}pœŒÀp}pŽŒÀp}p“›ŒÐDpP?p dqÀDq}qœŠ‘‹ÐDq€>q drÀDr}r–Àr}r“‹š’Àr}r”–›‡Àr}r “›”–›‡ÐDr€>r dsÀDs}sšŒ°sÐsÐDs€>s dtÀDt}t šš‡–Œ‹ŒÐDt°>t du}uœŒu}u™–‘›€u}u›ž‹žÀuuÀuÐuuÀuCuŐu dv}vŽŒv}v™–‘›€v}v›ž‹žÀvvÀvÐvvÀvCvÀv dw dx}xœŠ‘‹Ðxx dy}y šœ‰œ’›”Œ°yyÐyyÐyy dz€^z€z}zœŒÀzzÿÿzÀz€z}zŽŒÀzzÿÿz^z d{^{}{œŒÀ{}{ŽŒ^{ d|}| šœ‰œ’›”Œ°|}|œŠ‘‹Ð||}|œŒ d}}}œŠ‘‹}}}œŠ‘‹°}} d~}~“›Œ~}~œŒ°~~ d}œŒ}™–‘›€}›ž‹žÀ}“›ŒÀÐÀCŐ d€0^€ d} šœ‰œ’›”Œ°}œŠ‘‹Ð}ŽŒ d‚ dƒ d„}„š›–’€„}„šŒÀ„}„“𑀄}„šŒ„°„„„ d…}…šŒ°…}…“š‘€…}…šŒ…Ð……Ð……}…œŠ‘‹ d†}† šš‡–Œ‹Œ†1† d‡ dˆ}ˆœŠ‘‹ˆ}ˆœŠ‘‹°ˆˆ d‰}‰“›Œ‰}‰ŽŒ°‰‰ dŠ}ŠŽŒŠ}Š™–‘›€Š}Š›ž‹žÀŠ}А“›ŒÀŠÐŠŠÀŠCŠÀŠ d‹@^‹ dŒ ^Œ d dŽ d d d‘^‘}‘š‘›–‘˜œ’›œŠ‘‹à‘}‘œŠ‘‹Ð‘‘^‘ d’}’ š‹ž‘Œ’–‹€’C’ª‘š‡šœ‹š›ßœ‘‹““šßšŒ‘Œš’ d“0^“ d”}”“‹š’”€”}”š‘›–‘˜”‹‹ž–“°”””À”}”˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ d•}•–•}•‹ž–“–›‡ d–}–”–›‡–– d—}— “›”–›‡—— d˜^˜˜}˜ šš‡–Œ‹Œ^˜ d™ dš€^š}š–àš}𓐐‹š’^š d›}›”–›‡›}›”–›‡°›}›œ’›œŠ‘‹°›}›–Л dœ}œ œŠšŒ‘Œšœ}œ’–›€œ}œ›ž‹žÀœ}œ šœ‰œ’›”Œ°œ}œ “›”–›‡Ðœ°œœÀœ}œ šœ‰œ’›”Œ°œ}œ”–›‡ÐœÐœ}œ šœ‰œ’›”Œ°œ}œ “›”–›‡ÐœÐœœœ d} ŠŒš›–šœ‹’Œ˜€}‘‹–™†°}–НÀ}˜’œ œ’’ŒŠœœšŒŒÀ} ‘‹–™†œ›šŒ°}–НÀ1 dž}ž–ž€ž}ž–°žžžÀž}ž˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dŸ}Ÿ “›”–›‡Ÿ}Ÿ”–›‡ d  ^  d¡0^¡ d¢ d£}£œŒ££ d€}€š›–’€€}€šŒÀ€}€“š‘€€}€šŒ€°€€€ d¥€^¥}¥–à¥}¥“‹š’^¥ dŠ}Š”–›‡Š}Š”–›‡°Š}Šœ’›œŠ‘‹°Š}Š–ÐŠ d§}§ œŠšŒ‘Œš§}§’–›€§}§›ž‹žÀ§}§ šœ‰œ’›”Œ°§}§ “›”–›‡Ð§°§§À§}§ šœ‰œ’›”Œ°§}§”–›‡Ð§Ð§}§ šœ‰œ’›”Œ°§}§ “›”–›‡Ð§Ð§§§ dš^š€š}𠐓›”–›‡°ššš}ššŒ°š}šœŒÐšš`š€š}š”–›‡ðš}ššŒ°š}šœŒÐšš^š d©}©œŠ™ž–“ŠššžŒ‘©}©˜’œ ™ž–“ž›œ’’ž‘› dª}ª ŠŒš›–šœ‹’Œ˜€ª}ª‘‹–™†°ª}ª–ЪÀª}ª˜’œ œ’’™ž–“ŠšÀª}ª ‘‹–™†œ›šŒ°ª}ª–ЪÀª1ªª d«}«œŒ«}«œŒ°«« d¬^¬}¬ ›–Œ“ž†šŒÐ¬}¬˜’œ ›–Œ“ž†ž““šŒ^¬ d­}­ ’ž”š‰–Œ–“š€­}­Œ‹€­}­‘‹–™†°­}­–Э­°­C­ Åßœž›ßœ’’ž‘›­ d®@^® d¯0^¯ d°}° ŠŒš›–šœ‹’Œ˜€°}°‘‹–™†°°}°–аÀ°}°˜’œ œ’’ŒŠœœšŒŒÀ°}° ‘‹–™†œ›šŒ°°}°–аÀ°1°° d±@^± d²}²–²€²}²–°²²²À²}²˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ d³}³ “›”–›‡³}³”–›‡ dŽ ^Ž dµ@^µ d¶}¶œ“šžš‘›–‘˜”‹–‘™€¶¶ d·@^· džÐWž d¹ dº`Kº€Wº}º šœš–‰š™ž–“€ºº d»ÀD»}»–À»}»“‹š’ÐD»€>» dŒ dœ}œ“‹š’œ€œ}œš‘›–‘˜”‹‹ž–“°œœœÀœ}œ˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dŸ}Ÿ–Ÿ}Ÿ‹ž–“–›‡ d¿}¿œŠ™ž–“ŠššžŒ‘¿}¿˜’œ ™ž–“œ’’Š‘–œž‹–‘Œ dÀ}À œŠšŒ‘ŒšÀCÀ dÁ€^Á}Á–àÁ}Á“‹š’^Á dÂ}Â ŠŒš›–šœ‹’Œ˜€Â}‘‹–™†°Â}–ÐÂÀÂ}˜’œ œ’’™ž–“ŠšÀÂ} ‘‹–™†œ›šŒ°Â}–ÐÂÀÂ1 dÃ}ÖÀÃ}Ö°ÃÐÃÀÃ}Ø’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dÄ ^Ä dÅ}Åœ“šžš‘›–‘˜”‹–‘™€ÅÅ dÆÐWÆ dÇ dÈ`KÈ€WÈ}Èœ“šžš‘›–‘˜”‹–‘™€ÈÈ dÉ^É}Éžˆž–‹–‘˜šŒ‘Œš^É dÊ}Êžˆž–‹–‘˜šŒ‘ŒšÊAÊ dË}ˇ’–‹Š™Ë}Ë’–›€Ë}ˇ’–‹Š™ÀË}Ë š‘›–‘˜”‹“š‘ÀËÐËËË dÌ}Ì‹ž–“–›‡Ì€Ì}Ìš‘›–‘˜”‹‹ž–“°Ì̐ÌÀÌ}̘’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dÍ@^Í dÎ}΋ž‘Œ’–‹Œ‹šž’€ÎÎ dÏÐWÏ dÐ dÑ`KÑÀDÑ}ч’–‹Š™°ÑÐÑÐDÑ >Ñ dÒ`KÒÀDÒ}Ò“š‘˜‹—Œ°Ò}Ò˜’œ ’ž‡š‘›–‘˜Œ‹šž’ŒÐÒÐDÒ€>Ò dÓ`KÓÀDÓ}Óœ’›œŠ‘‹°Ó}Ó˜’œ ’ž‡š‘›–‘˜Œ‹šž’ŒÐÓÐDÓ€>Ó dÔ`KÔÀDÔ}Ô‘‹–™†°Ô}Ô˜’œ ’ž‡š‘›–‘˜Œ‹šž’ŒÐÔÐDÔà>Ô dÕ`KÕÀDÕ}Õ ‘‹–™†œ›šŒ°Õ}Õ˜’œ ’ž‡š‘›–‘˜Œ‹šž’ŒÐÕÐDÕ€>Õ dÖ`KÖÀDÖ}Ö—šž›–›‡ÐDÖ€>Ö d×`K×ÀD×}׋ž–“–›‡ÐD×€>× dØ dÙ dÚ dÛ dÜ dÝ dÞ dß dà€Wà}àŒš‘›žŒœ––œ’’ž‘›Œ‹šž’€à}àŒ‹šž’°àÐàÐDà >àÀà}à ‘‹–™†•ÐDàà>àÀà}à ‘‹–™†œ›šÐDà€>àà°Wà°>à dáð^á}ጚ‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€á}ጋšž’Àá}á ‘‹–™†•Àá}á ‘‹–™†œ›šÀá}ᘒœ œŠ‘‹œ’’ž‘›Œ€á}ጋšž’áá dâÐWâ dã dä då dæ dç dè dé dê dë dì dí dî dï€Wï}‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€ï}šž’°ïÐïÐDï >ïÀï}ï ‘‹–™†•ÐDïà>ïÀï}𠑐‹–™†œ›šÐDð€>ðÀð}𜐊‘‹ÐDð€>ðð°Wð°>ð dñÀDñ}ñŒ‹“š‘ÐDñ€>ñ dòÀDò}ò ‘š‡‹—šž›–›‡ÐDò€>ò dó dô dõ^õ}õ œ’’’š‹—›Ðõ}õ˜’œ ‘‘š^õ döð^öAö d÷@^÷ dø dù}ù ‘š‡‹—šž›–›‡ù€ù}ù—šž›–›‡°ùùùÀù}ù˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dú}úŒ‹“š‘Ðú}ú“š‘€ú}úŒ‹šž’ú dû^û}û“š‘€û}ûŒ‹šž’ûðû}û ˜’œ ’ž‡‹‡“š‘^û düð^üAü dý ^ý€ý}ýŒ‹“š‘ýýýÀý€ý}ý ‘š‡‹—šž›–›‡Ðý}ý‹ž–“–›‡ý^ý dþð^þAþ dÿ@^ÿ d d d^}Œ‹šž’°}Œ‹“š‘ÐÐà;^ d}Œ‹šž’}Œ‹šž’°CÄ d}Œ‹“š‘}Œ‹“š‘° d@^ d d}‡’–‹Š™}œ‘œž‹€}‡’–‹Š™À}Œ‹šž’ d}“š‘˜‹—Œ°}—šž›–›‡Ð}Œ‹“š‘ d } œ’›œŠ‘‹° } —šž›–›‡Ð  } œŠ‘‹ d } ‘‹–™†° } —šž›–›‡Ð  }  ‘‹–™†• d }  ‘‹–™†œ›šŒ° } —šž›–›‡Ð  }  ‘‹–™†œ›š d } —šž›–›‡ }  ‘š‡‹—šž›–›‡ d  d}‹ž‘Œ’–‹Œ‹šž’€ d dð^1 dÐW d d`KÀD}žˆž–‹–‘˜šŒ‘ŒšÐD°> d`KÀD}š‘›–‘˜”‹‹ž–“ÐD€> d`KÀD} š‘›–‘˜”‹“š‘ÐD€> d`KÀD}š‘›–‘˜”‹‹–’𖛇ÐD€> d`KÀD}š‘›–‘˜š‹–šŒÐD€> d`KÀD}š‘›–‘˜œ’›œŠ‘‹ÐD€> d`KÀD} œŠ‹–’𖛇ÐD€> d`KÀD} ‹–’šŠ‹œŠ‘‹ŒÐD€> d`KÀD} –Œ‰–Œ–“šÐD°> dðD} –Œ‰–Œ–“šA d`KÀD} ‰–Œ’šŒŒž˜šÐDÀ> d`KÀD} ‰–Œ‹–’𖛇ÐD€> d d `K €W } ‹ž‘Œ’–‹Œ‹šž’€   d!ÀD!}!ŒŠ’À!}!š‰ŒŠ’ÐD!€>! d"ÀD"}"š‰‹ž–“ÐD"€>" d#ÀD#}#œŠ‹ž–“ÐD#€># d$ÀD$}$œ’›ŒŠ’À$}$ š‰œ’›ŒŠ’ÐD$€>$ d% d& d'^'€'}' š‘š‹Œ‹ž‹šà'}' ˜’œ Œš–ž“'`'€'}' š‘š‹Œ‹ž‹šà'}'˜’œ š‘š‹'^' d(ð^( d)@^) d*^*}*žˆž–‹–‘˜šŒ‘Œš^* d+ð^+ d,@^, d-^-}- ŒŠŒš‘›š›^- d. d/^/}/žˆž–‹–‘˜ŒŠŒš‘Œš^/ d0}0žˆž–‹–‘˜ŒŠŒš‘Œš0A0 d1}1 ŠŒš›–šœ‹’Œ˜€1}1 ŒŠŒš‘›‘‹–™†À1}1˜’œ ŒŠŒš‘›ŒŠœœšŒŒ‘‹–™†À1}1ŒŠŒš‘›‘‹–™†ž’À1A11 d2@^2 d3ð^3 d4@^4 d5^5}5—šž›–›‡Ð5}5‹ž–“–›‡^5 d6ð^6 d7@^7 d8 d9}9œŠ‹ž–“9}9‹ž–“–›‡ d:}:ŒŠ’:}:“š‘˜‹—Œ°:}:œŠ‹ž–“Ð: d;};œ’›ŒŠ’;};œ’›œŠ‘‹°;};œŠ‹ž–“Ð; d<^< d=}=š‰‹ž–“=}=œŠ‹ž–“ d>}>š‰ŒŠ’>}>ŒŠ’ d?}? š‰œ’›ŒŠ’?}?œ’›ŒŠ’ d@ dA}AœŠ‹ž–“A€A}AœŠ‹ž–“°AAAÀA}A˜’œ ’ž‡š‘›–‘˜Œ‹šž’Œ dB}BŒŠ’B}BŒŠ’°B}B“š‘˜‹—Œ°B}BœŠ‹ž–“ÐB dC}Cœ’›ŒŠ’C}Cœ’›ŒŠ’°C}Cœ’›œŠ‘‹°C}CœŠ‹ž–“ÐC dD dE ^E€^E€E}EœŠ‹ž–“àE}E—šž›–›‡E`E€E}EŒŠ’ÀE}E ˜’œ ’ž‡‹‡“š‘E dF dG dH dI dJ}Jžˆž–‹–‘˜šŒ‘ŒšJ1J dK}K‹ž‘Œ’–‹€K}K‹—š‹ÀK}K“𙋀K}K‡’–‹Š™ÀK}Kš‰ŒŠ’K°K}K˜’œ Œšœ–ž“‹š’ÀKAKK dL}Lš‘›–‘˜”‹‹ž–“L}Lš‰‹ž–“ dM}M š‘›–‘˜”‹“š‘M}Mš‰ŒŠ’ dN}Nš‘›–‘˜š‹–šŒNN dO}Oš‘›–‘˜”‹‹–’𖛇O}O œŠ‹–’𖛇 dP}Pš‘›–‘˜œ’›œŠ‘‹P}P š‰œ’›ŒŠ’ dQÐWQ dR dS`KS€WS}S š‹ž‘Œ’–‹€S}SšžŒ‘ÐDSÀ>SS dT^T}T œ’’’š‹—›ÐT}T˜’œ š‹—š‘š‹‹œ^T dUð^U dV@^V dW dX}Xš‘›–‘˜š‹–šŒX}Xš‘›–‘˜š‹–šŒ°XX dY dZ^Z}Zš‘›–‘˜š‹–šŒàZ}Z ’ž‡š‹–šŒ^Z d[}[ ’ž”š‰–Œ–“š€[}[šžŒ‘[ d\}\ šœš–‰š™ž–“€\\ d]0^] d^}^‹ž‘Œ’–‹€^}^‹—š‹À^}^“𙋀^}^‡’–‹Š™À^}^ š‘›–‘˜”‹“š‘^°^}^˜’œ Œšœ–ž“‹š’À^A^^ d_}_š‘›–‘˜”‹‹–’𖛇_}_ œŠ‹–’𖛇 d`}` ’ž”š‰–Œ–“š€`}`šžŒ‘°`C` Åßß­š‹†ß°`}`Œ‹€`}`š‘›–‘˜š‹–šŒ`°`C`ßÐß°`}`Œ‹€`}` ’ž‡š‹–šŒ`` da@^a dbÐWb dc dd`Kd€Wd}d ’ž”š‰–Œ–“š€d}d›ž‹žÐDdÀ>dd de^e}e ›–Œ“ž†šŒÐe}e˜’œ ›–Œ“ž†‘‘š^e dfð^f dg@^g dh di^ii}i –Œ‰–Œ–“š^i dj}j –Œ‰–Œ–“šj1j dk}kšŒ–…š€kà^kÀk}k ˜š‹Œ–‘™€kPkÀk}k ˜š‹ ˆ–›‹—kÀk}k˜’œ œ’’•—š–˜—‹k dl@^l dm dn}n ‰–Œ’šŒŒž˜šn}nŒ‹€nà^nn°nCnÅß°n}n›ž‹ž do}o ‰–Œ‹–’𖛇o}o œŠ‹–’𖛇 dp}p Œš‘›‹™‘‹€pà^pp dq}qšš‘›š€qà^qq drÐWr ds dt`Kt€Wt}t ’ž”𖑉–Œ–“š€tt du}u –Œ‰–Œ–“šuAu dv}všŒ–…š€và^vÀvvÀvvv dwÐWw dx dy`Ky€Wy}y‹–’š‹–œ”€yy dzÀWz}z ’Œ˜ ‹–’š‹–œ” d{ d|}| œŠ‹–’𖛇|}| œŠ‹–’𖛇°|| d}^}}}žˆž–‹–‘˜šŒ‘Œš^} d~^~}~ œ’’’š‹—›à~}~˜’œ š‹—š‘š‹‹œ^~ d^} œŠ‹–’𖛇ð}š‘›–‘˜”‹‹–’𖛇°} ‹–’šŠ‹œŠ‘‹Œ^ d€}€ š‹ž‘Œ’–‹€€C€­šŒ‘Œšß«–’šŠ‹€ d@^ d‚@^‚ dƒ@^ƒ d„ d…^…}… –Œ‰–Œ–“š^… d†^†}† œŠ‹–’𖛇ð†}† ‰–Œ‹–’𖛇°†}†˜’œ ‰–Œ‹–’šŠ‹^† d‡}‡ ’ž”𖑉–Œ–“š€‡‡ dˆ@^ˆ d‰@^‰ dŠÐWŠ d‹ dŒ`KŒ€WŒ}Œ›žˆ€ŒŒ dÀW}’Œ˜ ›žˆ dŽ d} Œš‹™˜œ“€}˜ š› d} Œš‹˜œ“€} ˜ †š““ˆ d‘ d’}’  ‹š‡‹šœ‹€’’À’}’ ˜š‹Œ–‘™€’à^’À’}’˜š‹ †’À’}’ ˜š‹Œ–‘™€’P’À’}’ ˜š‹ ˆ–›‹—’À’}’˜’œ œ’’•—š–˜—‹À’}’ ‰–Œ’šŒŒž˜šÀ’P’À’}’ —ž œš‘‹šÀ’}’ ‰ž œš‘‹š’ d“ÐW“ d” d•`K•€W•}•žŒš™Š‘Œ“–œ–‹š›’šŒŒž˜šŒ€•}•›ž‹ž°•ЕÐD• >•• d– d— d˜ d™ dšÀDš}š–Àš}š’ž‡ÐDš€>š d›ÀD›}›“›ŒÐD›€>› dœÀDœ}œŒ‹ž‹šÀœ}œ“›Œ‹ž‹šÐDœ°>œ d dž}ž’ž‡Ðž}ž“š‘€ž}ž›ž‹žžÐžž dŸ d P^ } –Р  W } ’ž‡ d¡}¡Œ‹ž‹š¡€¡€¡}¡›ž‹ž°¡}¡–С`¡ >¡€¡!¡€¡¡à¡¡¡ d¢^¢}¢Œ‹ž‹šà¢}¢“›Œ‹ž‹š^¢ d£^£}£“›Œ‹ž‹š^£ d€}€ž››Š‘Œ“–œ–‹š›€€}€’–›€€}€›ž‹žÀ€}€“›ŒÀ€}€–Ѐ}€“›Œ€À€}€–Ѐ}€“›ŒÐ€€€ d¥0^¥ dŠ}Šœ’Š™Š}Šœ’Š™°Š}Š’–›€Š}Š›ž‹žÀŠ}А“›ŒÀŠ}Š–ÐŠ}А“›ŒŠ d§@^§ dš}𐓛Œ‹ž‹šš}šŒ‹ž‹š d©}©“›Œ©}©– dª@^ª d«`^« d¬ d­ d®^®}®Œ‹ž‹š^® d¯}¯ž››Š‘Œ“–œ–‹š›€¯}¯’–›€¯}¯›ž‹žÀ¯}¯“›ŒÀ¯}¯–Я}¯“›Œ¯À¯}¯–Я}¯“›ŒÐ¯¯¯ d°0^° d±}±œ’Š™±}±œ’Š™°±}±’–›€±}±›ž‹žÀ±}±“›ŒÀ±}±–б}±“›Œ± d²@^² d³ÐW³ dŽ dµ`Kµ€Wµ}µž››Š‘Œ“–œ–‹š›€µ}µ›ž‹ž°µÐµÐDµ >µÀµ}µ“š‘˜ÐDµ€>µµ d¶ÀD¶}¶–ÐD¶€>¶ d·ÀD·}·ÎÀ·}·ÍÀ·}·“›ŒÐD·P?· dž d¹P^¹}¹–й¹ W¹}¹“š‘˜ dº}º›ž‹ž°º}º–кº}º›ž‹ž°º}º–к`º >º€º!ºº d»`^» dŒ}ŒŠ‘Œ“–œ–‹š›’šŒŒž˜ššœš–‰š›€Œ}Œ›ž‹žŒ dœÐWœ dŸ d¿ dÀ dÁ d dà dÄ dÅ dÆ dÇ€WÇ}ÇŠ‘Œ“–œ–‹š›’šŒŒž˜ššœš–‰š›€Ç}Ç’Œ˜ÐDÇÀ>ÇÇ dÈð^È dÉÐWÉ dÊ dË`KËÀDË}Ë ŒŠŒš‘›š›ÀË}Ëžˆž–‹–‘˜ŒŠŒš‘ŒšÐD˰>Ë dÌ`KÌÀDÌ}Ì ŒŠŒš‘›‘‹–™†ÐDÌà>Ì dÍ`KÍÀDÍ}ÍŒŠŒš‘›‘‹–™†ž’ÐDÍ€>Í dÎ dÏ dÐ dÑ dÒeÒÀDÒ}Ò ŒŠŒš‘›š›šœ‰°ÒÐÒÐDÒ >Ò dÓ dÔ dÕ dÖ d× dØ dÙ dÚ dÛ dÜ dÝ dÞ dß dà dá€Wá}ጊŒš‘›œ’’Š‘–œž‹–‘Œ€á}ᑐ‹–™†ÐDáà>áÀá}Ꮮ’ÐDá€>áá°Wá°>á dâ^â€â}â š‘š‹Œ‹ž‹šàâ}â ˜’œ Œš–ž“â`â€â}â š‘š‹Œ‹ž‹šàâ}☒œ š‘š‹â^â dãð^ãAã dä@^ä då}å ŒŠŒš‘›š›å1å dæ}枈ž–‹–‘˜ŒŠŒš‘Œšæ1æ dç}ç ŒŠŒš‘›‘‹–™†ç}瑐‹–™† dè}茊Œš‘›‘‹–™†ž’è}菞’ dé}鋍ž‘Œ’–‹Œ‹šž’€éé dêð^ê1ê dëÐWë dì dí dî dï dð dñ€Wñ}ñšŒŠ’šœ’’Š‘–œž‹–‘Œ€ññ dò}ò ŒŠŒš‘›š›òAò dó}󞈞–‹–‘˜ŒŠŒš‘ŒšóAó dô}ô ŒŠŒš‘›‘‹–™†ô}ôš’‹† dõ}õŒŠŒš‘›‘‹–™†ž’õõ dö}ö‹ž‘Œ’–‹Œ‹šž’€öö d÷ÐW÷ dø dù dú dû dü dý€Wý}ý –ŒŒŠŒš‘›š›€ýý°Wý°>ý dþð^þ€þ}þ ŒŠŒš‘›š›þ`þ€þþ}þžˆž–‹–‘˜ŒŠŒš‘Œšþ dÿÐWÿ d d d d d d d d d€W}ŒŠŒš‘›‹ž‘Œ’–‹€}›ž‹ž°ÐÐD >°W°> d ^ €  }  ŒŠŒš‘›š› À € } žˆž–‹–‘˜ŒŠŒš‘Œš ^  d ð^ A  d @^  d  d ^ € }  š‘š‹Œ‹ž‹šà }  ˜’œ Œš–ž“ ` € }  š‘š‹Œ‹ž‹šà } ˜’œ š‘š‹ ^  dð^A d@^ d d}‹ž‘Œ’–‹€}‹—š‹À}›ž‹žÀA d dð^1 dÐW dPK d d d d d d d d d d d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d9 d: d;°d; dim GMC_DefaultCommObj as objref GalilCommunication #undoc func GMC_SetCommObjPos func GMC_SetCommObjPos (obj as objref) endfunc #undoc func GMC_VerifyCommObj func GMC_VerifyCommObj (commObject as reference to objref GalilCommunication) endfunc #undoc func GMC_GetLocalPort func GMC_GetLocalPort() returns unibyte endfunc #undoc func GMC_CountCommands func GMC_CountCommands(stream[] as byte) returns integer endfunc #undoc func GMCDataTypeToCommand func GMCDataTypeToCommand(dt as GMC_DataType, axis as GMC_Axis, useCustom as boolean, -> custom as string) returns string endfunc #undoc func GMC_ClearException func GMC_ClearException() endfunc Define Area Object type GalilCommunication #doc object GalilCommunication ~This object forms the core of the Galil library. This object controls ~all interaction between the motion controller and the QTERM-G70. It is ~capable of communicating with a motion controller either serially or via ~ethernet. To communicate with a motion controller, create an instance of ~this object and set up its properties as appropriate. Then create other ~GMC objects and set thier commObject property to refer to this object. ~You can communicate with multiple motion controllers by creating one ~GalilCommunication object per controller. There is a limit of one controller ~per serial port on the G70 and a limit of 8 ethernet controllers that can be ~used at once. #doc prop CommMethod ~The value of this property determines how this object will attempt communication ~with the controller. You can select between Serial, TCP/IP, UDP/IP or no ~communication. If you attempt to change communication methods while this object is ~attempting to open an ethernet channel to the controller, an error is generated and ~no change in communication is made. In general, you should set this property ~when designing your workspace and not change it at runtime on the terminal. dim CommMethod as GMC_CommMethod func CommMethod (newVal as GMC_CommMethod) endfunc #doc prop IPAddress ~This property defines the IP address of the motion controller. If communicating via ethernet ~set this property to be the IP address of the motion controller. Use the industry standard ~dotted string format (i.e. "192.168.1.1") to specify the address. This property is ignored if ~CommMethod is not set to either GMC_EthernetUDP or GMC_EthernetTCP. dim IPAddress as string func IPAddress (newVal as string) endfunc #doc prop serialPort ~This property determines which serial port on the QTERM-G70 is used for communication with ~the motion controller. Set it to the G70 serial port to which the controller is attached. ~This property is ignored if CommMethod is anything except GMC_UseSerial. dim SerialPort as comm func SerialPort (newVal as comm) endfunc #doc prop serialFormat ~This property determines the serial format that is used for communication with the motion ~controller. Select the format that the motion controller is using to ensure proper communcation. ~This property is ignored if UseEthernet is anything except GMC_UseSerial. dim SerialFormat as GMC_SerialFormat func SerialFormat (newVal as GMC_SerialFormat) endfunc #doc prop maxRetries ~If the motion controller fails to respond to a command, the communications object can attempt ~to retry the command. Generally the motion controller will only fail to respond if it ~is extremely busy or there is a communications problem. As many commands tell the controller ~to perform some action and can cause problems if they are resent, the default number of retries ~is zero. You may increase the number of retries if your application only uses query commands. ~

Note: This property only applies if you are using GMC_UseSerial or GMC_EthernetUDP ~as your communication method. This property is ignored for TCP communication as the ~TCP/IP protocol automatically retries. dim MaxRetries as integer #doc prop timeout ~timeout defines how long (in milliseconds) this object will wait for a response from ~the controller before it decides that there has been a communications failure. If the ~timeout elapses without receiving a response from the terminal, then the data is considered ~lost and is retried if maxRetries is non-zero. ~

Note: This property only applies if you are using GMC_UseSerial or GMC_EthernetUDP ~as you communication method. This property is ignored for TCP communication as the ~TCP/IP protocol automatically deals with timeout issues. dim timeout as integer func timeout (newVal as integer) endfunc #doc prop displayErrors ~This property determines how, if at all, errors are displayed when they occur. Errors are ~displayed in a small yellow bar near the top of the display. The ~following options are available:

~
GMC_DisplayNone
No errors are displayed. This object will never display an error ~message. ~
GMC_DisplayCommErrors
Errors in communication are displayed. This includes ~communication timeouts and unexpected TCP disconnections. ~
GMC_DisplayAllErrors
All errors are displayed. This includes all communication ~errors as well as errors returned by the controller in response to bad commands.
dim displayErrors as GMC_DispErrors #doc prop unsolicitedAware ~This property determines whether this object will watch for unsolicited messages from the ~controller. If this value is true, then all data returned from the controller is examined ~for unsolicited messages (i.e. data returned from the controller that was not requested by ~this terminal. Examples include "MG" commands in the program executing on the controller). ~When unsolicited messages are detected, the UnsolicitedMessageReceived event is ~generated. You can handle this event to examine incomming unsolicited messages.

~If this property is false, then this object does not watch for unsolicited messages. Setting ~this property to false will generally lead to improved performance on the terminal, however, ~if an unsolicited message is sent, then a communications error will occur. Set this property ~to false if you want better performance on the terminal and know that the controller will not ~send unsolicited messages. dim unsolicitedAware as boolean func Startup() handles msg_init endfunc endfunc endfunc endfunc handles MSG_COMM_ACCEPT endfunc handles MSG_COMM_ERROR endfunc endfunc endfunc endfunc endfunc handles MSG_COMM_RECEIVE endfunc #doc prop curResponse ~This property contains the most recent response from the controller. It is guarenteed to be ~valid during a GMC_CommSuccess message. At any other time the value of this property ~may not be valid. It is the responsibility of the object that recieves the GMC_CommSuccess ~to parse the response appropriately endfunc endfunc endfunc #doc func SendAsciiCommandStream ~Use this command to send an arbitrary stream of commands to the controller. When the ~controller has responed, this object will send a GMC_CommSuccess or a GMC_CommFailure ~message to the notifyObj with the notifyCode as the paramater. #param stream: A semicolon separated list of commands to send to a Galil motion controller #param notifyObj:The object that will receive notification once the controller has responeded to the commands #param notifyCode:This value will be sent to the notifyObj in the notification message. It is primarily useful for objects that may poll different values at different times so that it can differenciate to which query it is receiving a response. func SendAsciiCommandStream(stream[] as byte, notifyObj as objref, notifyCode as integer) returns boolean endfunc #doc func SendAsciiCommandStreamCounted ~Use this command to send an arbitrary stream of commands to the controller. When the ~controller has responed, this object will send a GMC_CommSuccess or a GMC_CommFailure ~message to the notifyObj with the notifyCode as the paramater. This function is ~faster than SendAsciiCommandStream. Call this function if you know exactly ~how many commands are in stream. You generally do that by calling the global function ~GMC_CountCommands. #param stream: A semicolon separated list of commands to send to a Galil motion controller #param notifyObj:The object that will receive notification once the controller has responeded to the commands #param notifyCode:This value will be sent to the notifyObj in the notification message. It is primarily useful for objects that may poll different values at different times so that it can differenciate to which query it is receiving a response. #param count:The number of commands in the command stream. This value must correctly identify the number of commands in the stream, or a communications failure will occur. You can obtain the proper value by calling GMC_CountCommands on your stream of commands. func SendAsciiCommandStreamCounted (stream[] as byte, notifyObj as objref, -> notifyCode as integer, count as integer) returns boolean endfunc endfunc endfunc endfunc endfunc handles MSG_TIMETICK endfunc handles MSG_DRAW endfunc endfunc endfunc #doc override UnsolicitedMessageReceived #param msg:This is the text of the unsolicited message. ~This event is called whenever unsolicited messages are received from the controller. The ~msg paramater contains the actual message. Unsolicited messages are NOT parsed ~for content, but rather are given immediately to this funciton. This means that the user ~is responsible for parsing the message. It is possible that two unsolicited messages may ~be passed to this event at once. It is also possible that a single unsolicited message may ~be split in to two calls to this event. func UnsolicitedMessageReceived(msg as string) endfunc #doc prop suspendedRecv ~This property holds the most recent bit of data received by this object once it has been ~suspended. #doc func SuspendCommunications ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function breaks off normal communication with the motion controller. Communication ~requests are queued, until communications are resumed. This function returns true if ~the request has been successfully processed, however, you MUST NOT assume that the ~communications have actually been suspended until the object indicated by the notify ~paramater has received the GMC_SuspendSuccessNotify message.

~Once this object has been suspended, any incomming serial data will be stored in the property ~suspendedRecv and notify will be informed of the data reception via a ~GMC_SuspendCommReceive message. #param notify:Indicates the object that requested the suspension. This object will receive the GMC_SuspendSuccessNotify message once the suspension has taken effect #param parm:This value will be passed to notify as the paramater to the GMC_SuspendSuccessNotify message. func SuspendCommunications(notify as objref, parm as integer) returns boolean endfunc #doc func ResumeCommunications ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function resumes normal communications after the communications had been suspended func ResumeCommunications() endfunc #doc func IsSuspended ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function returns true if communications are currently suspended, false otherwise. func IsSuspended() returns boolean endfunc #doc func SuspendTransmit ~This function is intended for internal use by advanced GMC objects. Do not use it, unless ~you are implementing a special object that has special communication needs.

~This function is used to perform a special transmission when communications are suspended with ~the motion controller. This can only be used when communication is suspended. It will return ~false if communication is not suspended. Otherwise it transmits the data and returns true. #param data:This data will be transmitted to the controller without respect of formatting. As the communications object does not examine this data, it will not expect a response of any sort from the controller. func SuspendTransmit (data[] as byte) returns boolean endfunc Enddef #endfile #ifnot Galil_mc_src_GMCPoll #option Galil_mc_src_GMCPoll Define Area Object type GMCPoll #ToolImage "80013FFC40025FFA58FA577A577A577A587A5FBA5FDA5FFA40023FFC8001" '******************************************************************* 'Object: GMCPoll 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: Galil motion controller polling object ' 'Version: 1.52 'Copyright: 2004 QSI Corporation. Permission to modify and ' distribute this object is granted provided this ' copyright notice remains in tact. '******************************************************************* #doc object GMCPoll ~This object polls the controller with an arbitrary command at regular ~intervals. It then displays the controller's response. It is useful ~for displaying values that will change over time, such as the motor ~position. Many properties are provided which contorol the appearance ~of this object, the polling frequency and what is being polled. ~

Note: To enhance performance, this object will only ~poll the controller when it is visible (enabled). library standard source ToolMessages library galil_mc source GalilCommunications library standard source draw3DRect Library Standard Source TextSingleLineBDF dim enabled as boolean init enabled := true func enabled(newval as boolean) enabled := newval Enable (me, enabled) if enabled then TimeTick() endif endfunc dim parent as objref init parent := default func parent(newval as objref) parent := newval Attach(me, parent) endfunc dim xPos as integer init xPos := 0 func xPos(newval as integer) xPos := newVal Relocate (me, xPos, yPos) endfunc dim yPos as integer init yPos := 0 func yPos(newval as integer) yPos := newval Relocate (me, xPos, yPos) endfunc dim width as integer init width := 25 func width(newval as integer) width := newval Resize (me, width, height) endfunc dim height as integer init height := 25 func height(newval as integer) height := newval Resize (me, width, height) endfunc dim bgColor as color init bgColor := col_183 func bgColor (newVal as color) bgColor := newVal Rerender(me) endfunc dim fgColor as color init fgColor := rgb_black func fgColor (newVal as color) fgColor := newVal Rerender(me) endfunc #doc prop bevelWidth ~This determines the width (in pixels) of the 3D border surrounding the object dim bevelWidth as integer init bevelWidth := 2 func bevelWidth (newVal as integer) bevelWidth := newVal Rerender(me) endfunc #doc prop bevelStyle ~This determines the style of the 3D bevel on this object. Possible values include: ~
GMC_BevelRaised
The bevel will appear to rise out of the background. ~
GMC_BevelSunken
The bevel will appear sunken into the background. ~
GMC_BevelNone
No bevel will be drawn. dim bevelStyle as GMC_BevelStyle init bevelStyle := GMC_BevelSunken func bevelStyle (newVal as GMC_BevelStyle) bevelStyle := newVal Rerender(me) endfunc #doc prop inset ~This determines how close text is allowed to run to the bevel of this object (or the ~edge of the object if the bevel is turned off). This value must always be at least 1. dim inset as integer init inset := 1 func inset (newVal as integer) inset := newVal Rerender(me) endfunc dim font as bdffont init font := default func font(newVal as bdffont) font := newVal Rerender(me) endfunc #doc prop prefix ~The value defined by prefix will be displayed in front of the responses returned ~from the controller. If no prefix is desired, set this property to the empty string (""). dim prefix as string init prefix := "" func prefix (newVal as string) prefix := newVal Rerender(me) endfunc #doc prop suffix ~The value defined by suffix will be displayed following the responses returned ~from the controller. If no suffix is desired, set this property to the empty string (""). dim suffix as string init suffix := "" func suffix (newVal as string) suffix := newVal Rerender(me) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty #doc prop command ~command defines the command (or series of commands) to execute on the controller ~when this button is pressed. This property can be set to any valid command, or any ~semicolon delimited series of commands. Refer to the Command Reference Manual for your ~controller for a list of valid commands. dim command as string init command := "TPX" func command (newVal as string) command := newVal commandCount := GMC_CountCommands (command) endfunc private dim commandCount as integer #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer init pollInterval := 1000 func pollInterval (newVal as integer) if newVal <= 0 then pollInterval := 0 UnregisterMsgHandler (me, msg_timetick, 0) else pollInterval := newVal RegisterMsghandler (me, msg_timetick, newVal/20) endif endfunc func StartUp() handles MSG_INIT Relocate (me, xPos, yPos) Resize (me, width, height) Enable (me, enabled) Attach (me, parent) Command(command) pollInterval(pollInterval) GMC_VerifyCommObj(commObject) endfunc private dim dispValue as string func Draw() handles MSG_DRAW dim bwi as integer if bevelStyle == GMC_BevelNone then bwi = inset else bwi = bevelWidth + inset endif SetBgColor(bgcolor) SetFgColor(bgcolor) DrawBox (xPos, yPos, xPos+width-1, yPos+height-1) SetFgColor (fgColor) _TextRect (xPos+bwi, yPos+bwi, width-2*bwi, height-2*bwi, prefix+dispvalue+suffix, font, ha_center, va_center) if bevelStyle == gmc_bevelraised then _3dframe (xpos, ypos, xpos+width-1, ypos+height-1, _highlight3dcolors[bgcolor], _shadow3dColors[bgcolor], bevelwidth) elseif bevelStyle == gmc_bevelsunken then _3dframe (xpos, ypos, xpos+width-1, ypos+height-1, _shadow3dColors[bgcolor], _highlight3dColors[bgcolor], bevelwidth) endif endfunc private func Timetick () handles MSG_TIMETICK commObject.SendAsciiCommandStreamCounted(command, me, 0, commandCount) return endfunc private func Zenabled (status as boolean) handles MSG_ZENABLED if status and enabled then TimeTick() endif endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess dispValue := trim(commObject.curResponse) ResponseReceived(dispValue) Rerender(me) return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure dispValue := trim(commObject.curResponse) FailureReceived(dispValue, commObject.CurFailureReason) return true endfunc #doc override ResponseReceived #param response:The data returned from the controller. You may modify this paramater for formatting reasons. Any changes to this paramater will be reflected in the final display. ~This event called whenever this object receives receives a response from the controller as a ~result of a poll. The paramater response contains the string that was returned from ~the controller. You may modify response in order to change the final string which ~will be displayed in this object. func ResponseReceived (response as reference to string) return endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as reference to string, failReason as GMC_FailureReason) return endfunc 'The rest of these functions add functionality to the PC development tool. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in the PC development tool. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by the PC development tool, when you change the attachment 'of an object (i.e. in response to dragging it around the object tree). 'Note: the purpose of this function is to allow you to attach to another 'container, you should not change your parent property or call Tool_Persist 'until you receive a MSG_TOOL_ATTACHED. A MSG_TOOL_ATTACHED will be sent 'in response to an Attach API function call. func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH Attach (me, attachTo) endfunc 'This function is called in response to calling Attach (primarily in a 'handler for MSG_TOOL_ATTACH, but possibly in other places as well_. func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED 'Set our parent property to reflect who we are attached to and save parent := newParent Tool_Persist (parent) 'Save parent endfunc 'This function is called when the user drags an object instance with the 'mouse in the PC development tool. dx and dy are relative offsets from the current 'location of the object func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE xPos := xPos + dx yPos := yPos + dy Relocate (me, xPos, yPos) 'Save the changes we just made Tool_Persist (xPos) Tool_Persist (yPos) endfunc 'This function is called by the PC development tool to obtain the coordinates of 'the resize grips. The arrays xCoords, yCoords, and cursors all contain 0 'elements initially. This means that you should either call redim on those 'arrays and set their values, or declare local arrays, set the values of 'the local arrays, and then assign xCoords, yCoords and cursors to those 'local arrays. Closed indicates whether the Foundry should connect the 'first and last grips to make a closed object. xCoords, yCoords, and 'cursors should all contain the same number of elements when this function 'completes func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolGetHandles (xCoords, yCoords, cursors, closed, xPos, yPos, width, height) endfunc 'This function is called in response to a user moving a resize grip within 'the PC development tool. handleNum is the index into the arrays that were returned 'by the handler for MSG_TOOL_GETHANDLES. You should return true from this 'function func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolMoveHandle (handleNum, dx, dy, xPos, yPos, width, height, me) endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. (x1, y1) are the coordinates that the user started his 'drag and (x2, y2) are the coordinates that the mouse was released func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolDragCreate (parentObj, x1, y1, x2, y2, xPos, yPos, width, height, parent) commObject := GMC_DefaultCommObj tool_persist(commObject) 'Call our MSG_INIT handler StartUp() endfunc #endif Enddef #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œ““ dtd˜ž“–“ ’œ Œœ ˜’œ““ dKK K@K}˜’œ““ d@dC<ÇÏÏÎ̹¹ŒËÏÏÍʹ¹ŸÊǹŸÊÈÈŸÊÈÈŸÊÈÈŸÊÇȟʹœŸÊ¹»ŸÊ¹¹ŸËÏÏÍ̹¹ŒÇÏÏÎ d d d d d d d d d d d d d d d d d d d d d d dÀd}Œ‹ž‘›ž›Ðd} ‹“’šŒŒž˜šŒ dÀd}˜ž“–“ ’œÐd}˜ž“–“œ’’Š‘–œž‹–‘Œ dÀd}Œ‹ž‘›ž›Ðd} ›žˆÌ›šœ‹ dÀd}Œ‹ž‘›ž›Ðd}‹š‡‹Œ–‘˜“š“–‘š›™ d dÀD}š‘ž“š›ÐD°> d ðD } š‘ž“š› 1  d!€W!}!š‘ž“š›€!}!‘šˆ‰ž“ÐD!°>!! d"}"š‘ž“š›"}"‘šˆ‰ž“ d#}#š‘ž“š€#à^#À#}#š‘ž“š›# d$ d%^%}%š‘ž“š›^% d&}&‹–’š‹–œ”€&& d'@^' d(ÐW( d) d*ÀD*}*žš‘‹ÐD*à>* d+ðD+}+žš‘‹+P+ d,€W,},žš‘‹€,},‘šˆ‰ž“ÐD,à>,, d-}-žš‘‹-}-‘šˆ‰ž“ d.}.ž‹‹žœ—€.à^.À.}.žš‘‹. d/ÐW/ d0 d1ÀD1}1‡ŒÐD1€>1 d2ðD2}2‡Œ22 d3€W3}3‡Œ€3}3‘šˆ‰ž“ÐD3€>33 d4}4‡Œ4}4‘šˆ‰ž“ d5}5š“œž‹š€5à^5À5}5‡ŒÀ5}5†Œ5 d6ÐW6 d7 d8ÀD8}8†ŒÐD8€>8 d9ðD9}9†Œ99 d:€W:}:†Œ€:}:‘šˆ‰ž“ÐD:€>:: d;};†Œ;};‘šˆ‰ž“ d<}<š“œž‹š€<à^<À<}<‡ŒÀ<}<†Œ< d=ÐW= d> d?ÀD?}?ˆ–›‹—ÐD?€>? d@ðD@}@ˆ–›‹—@@ dA€WA}Aˆ–›‹—€A}A‘šˆ‰ž“ÐDA€>AA dB}Bˆ–›‹—B}B‘šˆ‰ž“ dC}CšŒ–…š€Cà^CÀC}Cˆ–›‹—ÀC}C—š–˜—‹C dDÐWD dE dFÀDF}F—š–˜—‹ÐDF€>F dGðDG}G—š–˜—‹GG dH€WH}H—š–˜—‹€H}H‘šˆ‰ž“ÐDH€>HH dI}I—š–˜—‹I}I‘šˆ‰ž“ dJ}JšŒ–…š€Jà^JÀJ}Jˆ–›‹—ÀJ}J—š–˜—‹J dKÐWK dL dMÀDM}M˜œ“ÐDMð>M dNðDN}N˜œ“N}Nœ“ ÎÇÌ dO€WO}O˜œ“€O}O‘šˆ‰ž“ÐDOð>OO dP}P˜œ“P}P‘šˆ‰ž“ dQ}Qšš‘›š€Qà^QQ dRÐWR dS dTÀDT}T™˜œ“ÐDTð>T dUðDU}U™˜œ“U}U ˜ “žœ” dV€WV}V™˜œ“€V}V‘šˆ‰ž“ÐDVð>VV dW}W™˜œ“W}W‘šˆ‰ž“ dX}Xšš‘›š€Xà^XX dYÐWY dZ d[ d\ d]ÀD]}] š‰š“ˆ–›‹—ÐD]€>] d^ðD^}^ š‰š“ˆ–›‹—^^ d_€W_}_ š‰š“ˆ–›‹—€_}_‘šˆ‰ž“ÐD_€>__ d`}` š‰š“ˆ–›‹—`}`‘šˆ‰ž“ da}ašš‘›š€aà^aa dbÐWb dc dd de df dg dh diÀDi}i š‰š“Œ‹†“šÐDi}i˜’œ š‰š“Œ‹†“š djðDj}j š‰š“Œ‹†“šj}j˜’œ š‰š“ŒŠ‘”š‘ dk€Wk}k š‰š“Œ‹†“š€k}k‘šˆ‰ž“ÐDk}k˜’œ š‰š“Œ‹†“šk dl}l š‰š“Œ‹†“šl}l‘šˆ‰ž“ dm}mšš‘›š€mà^mm dnÐWn do dp dq dr dsÀDs}s–‘Œš‹ÐDs€>s dtðDt}t–‘Œš‹tt du€Wu}u–‘Œš‹€u}u‘šˆ‰ž“ÐDu€>uu dv}v–‘Œš‹v}v‘šˆ‰ž“ dw}wšš‘›š€wà^ww dxÐWx dy dzÀDz}z™‘‹ÐDz?z d{ðD{}{™‘‹{P{ d|€W|}|™‘‹€|}|‘šˆ‰ž“ÐD|?|| d}}}™‘‹}}}‘šˆ‰ž“ d~}~šš‘›š€~à^~~ dÐW d€ d d‚ dƒ d„ÀD„}„š™–‡ÐD„À>„ d…ðD…}…š™–‡…C… d†€W†}†š™–‡€†}†‘šˆ‰ž“ÐD†À>†† d‡}‡š™–‡‡}‡‘šˆ‰ž“ dˆ}ˆšš‘›š€ˆà^ˆˆ d‰ÐW‰ dŠ d‹ dŒ d dŽÀDŽ}ŽŒŠ™™–‡ÐDŽÀ>Ž dðD}ŒŠ™™–‡C d€W}ŒŠ™™–‡€}‘šˆ‰ž“ÐDÀ> d‘}‘ŒŠ™™–‡‘}‘‘šˆ‰ž“ d’}’šš‘›š€’à^’’ d“ÐW“ d” d• d– d— d˜ d™ dš d› dœÀDœ}œ œ’’•šœ‹ÐDœà>œ}œ˜ž“–“œ’’Š‘–œž‹–‘ dðD} œ’’•šœ‹}š’‹† dž dŸ d  d¡ d¢ d£ d€ÀD€}€œ’’ž‘›ÐD€À>€ d¥ðD¥}¥œ’’ž‘›¥C¥«¯§ dŠ€WŠ}Šœ’’ž‘›€Š}Š‘šˆ‰ž“ÐDŠÀ>АŠ d§}§œ’’ž‘›§}§‘šˆ‰ž“ dš}𠜐’’ž‘›œŠ‘‹š}š˜’œ œŠ‘‹œ’’ž‘›Œ€š}šœ’’ž‘›š d©ÐW© dª`KªÀDª}ª œ’’ž‘›œŠ‘‹ÐDª€>ª d« d¬ d­ d® d¯ d° d± d² d³ dŽ dµÀDµ}µ ““–‘‹š‰ž“ÐDµ€>µ d¶ðD¶}¶ ““–‘‹š‰ž“¶¶è d·€W·}· ““–‘‹š‰ž“€·}·‘šˆ‰ž“ÐD·€>·· dž^ž}ž‘šˆ‰ž“žž^ž d¹}¹ ““–‘‹š‰ž“¹¹ dº}ºŠ‘š˜–Œ‹š’Œ˜—ž‘›“š€ºà^ºÀº}º ’Œ˜ ‹–’š‹–œ”Àººº d»0^» dŒ}Œ ““–‘‹š‰ž“Œ}Œ‘šˆ‰ž“ dœ}œš˜–Œ‹š’Œ˜—ž‘›“š€œà^œÀœ}œ ’Œ˜ ‹–’š‹–œ”Àœ}œ‘šˆ‰ž“𜜐œ dŸ@^Ÿ d¿ÐW¿ dÀ dÁ€WÁ}ÁŒ‹ž‹Š€ÁÁ dÂÀWÂ}Â’Œ˜ –‘–‹ dÃ}Ãš“œž‹š€Ãà^ÃÀÃ}ǏŒÀÃ}ƏŒà dÄ}ÄšŒ–…š€Äà^ÄÀÄ}Ĉ–›‹—ÀÄ}Ä—š–˜—‹Ä dÅ}Åš‘ž“š€Åà^ÅÀÅ}Åš‘ž“š›Å dÆ}Æž‹‹žœ—€Æà^ÆÀÆ}Əžš‘‹Æ dÇ}Çœ’’ž‘›€Ç}Çœ’’ž‘›Ç dÈ dÉ}É ““–‘‹š‰ž“€É}É ““–‘‹š‰ž“É dÊ}ʘ’œ ‰š–™†œ’’•€Ê}Ê œ’’•šœ‹Ê dËÐWË dÌ dÍ`KÍÀDÍ}Í ›–Œ‰ž“ŠšÐDÍÀ>Í d΀WÎ}ˍžˆ€ΐÎ dÏÀWÏ}Ï’Œ˜ ›žˆ dÐ dÑÀDÑ}ѝˆ–ÐDр>Ñ dÒ^Ò}Ò š‰š“Œ‹†“šÐÒ}Ò ˜’œ š‰š“‘‘š^Ò dÓ}ӝˆ–ÐÓ}Ó–‘Œš‹ dÔ0^Ô dÕ}՝ˆ–ÐÕ}Õ š‰š“ˆ–›‹—°Õ}Õ–‘Œš‹ dÖ@^Ö d× dØ}Ø Œš‹˜œ“€Ø}؝˜œ“Ø dÙ}Ù Œš‹™˜œ“€Ù}ٝ˜œ“Ù dÚ}Ú›žˆ‡€Ú}Ú‡ŒÀÚ}Ú†ŒÀÚ}Ú‡Œ°Ú}Úˆ–›‹—ÐÚÚÀÚ}Ú†Œ°Ú}Ú—š–˜—‹ÐÚÚÚ dÛ dÜ}Ü Œš‹™˜œ“€Ü}Ü™˜œ“Ü dÝ}Ý  ‹š‡‹šœ‹€Ý}݇Œ°Ý}ݝˆ–ÀÝ}݆Œ°Ý}ݝˆ–ÀÝ}݈–›‹—ÐÝÝ Ý}ݝˆ–ÀÝ}Ý—š–˜—‹ÐÝÝ Ý}ݝˆ–ÀÝ}ݏš™–‡°Ý}Ý ›–Œ‰ž“Šš°Ý}ÝŒŠ™™–‡ÀÝ}Ý™‘‹ÀÝ}Ý —ž œš‘‹šÀÝ}Ý ‰ž œš‘‹šÝ dÞ dß^ß}ß š‰š“Œ‹†“šÐß}ߘ’œ š‰š“ž–Œš›^ß dà}à Ì›™ž’š€à}à‡ŒÀà}à†ŒÀà}à‡Œ°à}àˆ–›‹—ÐààÀà}à†Œ°à}à—š–˜—‹ÐààÀà}à —–˜—“–˜—‹Ì›œ“Œ°à}à˜œ“ÐàÀà}à Œ—ž›ˆÌ›œ“Œ°à}à˜œ“ÐàÀà}à š‰š“ˆ–›‹—à dá ^á}á š‰š“Œ‹†“šÐá}ᘒœ š‰š“ŒŠ‘”š‘^á dâ}â Ì›™ž’š€â}⇏ŒÀâ}↏ŒÀâ}⇏Œ°â}∖›‹—ÐââÀâ}↏Œ°â}â—š–˜—‹ÐââÀâ}â Œ—ž›ˆÌ›œ“Œ°â}❘œ“ÐâÀâ}â —–˜—“–˜—‹Ì›œ“Œ°â}❘œ“ÐâÀâ}⠝š‰š“ˆ–›‹—â dã@^ã däÐWä då dæ`Kæ€Wæ}æ‹–’š‹–œ”€ææ dçÀWç}ç ’Œ˜ ‹–’š‹–œ” dè dé}é œ’’•šœ‹àé}錚‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€é}霐’’ž‘›Àéà^éÀééÀé}é œ’’ž‘›œŠ‘‹é dêð^ê dëÐWë dì dí`Kí€Wí}í…š‘ž“š›€í}팋ž‹ŠŒÐDí°>íí dîÀWî}î ’Œ˜ …š‘ž“š› dï dð^ð}ðŒ‹ž‹ŠŒ`ð}𚑞“š›^ð dñ}ñ‹–’š‹–œ”€ññ dò@^ò dóÐWó dô dõ`Kõ€Wõ}õŒŠœœšŒŒ€õ}õž’ÐDõ€>õõ°Wõ°>õ döÀWö}ö˜’œ œ’’ŒŠœœšŒŒ d÷ dø}ø ›–Œ‰ž“Ššø}ø‹–’€ø}ø œ’’•šœ‹àø}ø œŠšŒ‘Œšø dù}ùšŒ‘Œššœš–‰š›€ù}ù ›–Œ‰ž“Ššù dú}úšš‘›š€úà^úú dûð^û1û düÐWü dý dþ`Kþ€Wþ}þ™ž–“Šš€þ}þž’ÐDþ€>þþ°Wþ°>þ dÿÀWÿ}ÿ˜’œ œ’’™ž–“Šš d d} ›–Œ‰ž“Šš}‹–’€} œ’’•šœ‹à} œŠšŒ‘Œš d}™ž–“Šššœš–‰š›€} ›–Œ‰ž“ŠšÀ} œ’’•šœ‹à}œŠ™ž–“ŠššžŒ‘ dð^1 dÐW d d d d d  d  d  d €W } šŒ‘Œššœš–‰š›€ } šŒ‘ŒšÐD W  W À>   d ð^  dÐW d d d d d d d€W}™ž–“Šššœš–‰š›€}šŒ‘ŒšÐDW WÀ>À} ™ž–“šžŒ‘ÐD}˜’œ ™ž–“ŠššžŒ‘ dð^ dÐW d d d d d d d d d  d! d" d# d$„d$ ‹“ d% d& d' d( d) d* d+€W+}+ ‹“ž‹‹žœ—€+}+ž‹‹žœ—‹ÐD+à>++ d,ÀW,},’Œ˜ ‹“ ž‹‹žœ— d- d.}.ž‹‹žœ—€.à^.À.}.ž‹‹žœ—‹. d/ÐW/ d0 d1 d2 d3€W3}3 ‹“ž‹‹žœ—š›€3}3 ‘šˆžš‘‹ÐD3à>33 d4ÀW4}4’Œ˜ ‹“ ž‹‹žœ—š› d5 d6 d7}7žš‘‹7}7 ‘šˆžš‘‹ d8}8 ‹“ šŒ–Œ‹€8}8žš‘‹8 d9ÐW9 d: d; d< d= d>€W>}>‹“’‰š€>}>›‡ÐD>€>>À>}>›†ÐD>€>>> d?ÀW?}? ’Œ˜ ‹“ ’‰š d@ dA}A‡ŒA}A‡Œ°A}A›‡ dB}B†ŒB}B†Œ°B}B›† dC}Cš“œž‹š€Cà^CÀC}C‡ŒÀC}C†ŒC dD dE dF}F ‹“ šŒ–Œ‹€F}F‡ŒF dG}G ‹“ šŒ–Œ‹€G}G†ŒG dHÐWH dI dJ dK dL dM dN dO dP dQ dR dS€WS}S‹“˜š‹—ž‘›“šŒ€S}S‡œ›Œ°SÐSÐDSWS WS€>SÀS}T†œ›Œ°TÐTÐDTWT WT€>TÀT}UœŠŒŒ°UÐUÐDUWU WU}U ˜Š–œŠŒŒÀU}Vœ“Œš›ÐDVWV WV°>VV dWÀWW}W’Œ˜ ‹“ ˜š‹—ž‘›“šŒ dX dY dZ d[ d\}\ ‹“˜š‹—ž‘›“šŒ€\}\‡œ›ŒÀ\}\†œ›ŒÀ\}\œŠŒŒÀ\}\œ“Œš›À\}\‡ŒÀ\}\†ŒÀ\}\ˆ–›‹—À\}\—š–˜—‹\ d]ÐW] d^ d_ d` da db dc€Wc}c‹“’‰š—ž‘›“š€c}c —ž‘›“š‘Š’ÐDcWc Wc€>cÀc}c›‡ÐDc€>cÀc}c›†ÐDc€>cc ddÀWd}d’Œ˜ ‹“ ’‰š—ž‘›“š de df dg dh di}i ‹“’‰š—ž‘›“š€i}i —ž‘›“š‘Š’Ài}i›‡Ài}i›†Ài}i‡ŒÀi}i†ŒÀi}iˆ–›‹—Ài}i—š–˜—‹Àià^ii dj dkÐWk dl dm dn do dp dq dr ds dt€Wt}t‹“›ž˜œšž‹š€t}t žš‘‹•ÐDtà>tÀt}t‡ÎÐDt€>tÀt}t†ÎÐDt€>tÀt}u‡ÍÐDu€>uÀu}u†ÍÐDu€>uu dvÀWv}v’Œ˜ ‹“ ›ž˜œšž‹š dw dx dy dz d{}{ ‹“›ž˜œšž‹š€{}{ žš‘‹•À{}{‡ÎÀ{}{†ÎÀ{}{‡ÍÀ{}{†ÍÀ{}{‡ŒÀ{}{†ŒÀ{}{ˆ–›‹—À{}{—š–˜—‹À{}{žš‘‹{ d| d}}} œ’’•šœ‹}}}˜’œ ›š™žŠ“‹œ’’• d~}~ ‹“ šŒ–Œ‹€~}~ œ’’•šœ‹~ d d€ d}Œ‹ž‹Š€ d‚ÐW‚ dƒ d„ d„ d…PK… d† d‡ dˆ d‰ dŠ d‹ dŒ dŒ d dްdŽ Define Area Object type GMCPoll #doc object GMCPoll ~This object polls the controller with an arbitrary command at regular ~intervals. It then displays the controller's response. It is useful ~for displaying values that will change over time, such as the motor ~position. Many properties are provided which contorol the appearance ~of this object, the polling frequency and what is being polled. ~

Note: To enhance performance, this object will only ~poll the controller when it is visible (enabled). dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc dim xPos as integer func xPos(newval as integer) endfunc dim yPos as integer func yPos(newval as integer) endfunc dim width as integer func width(newval as integer) endfunc dim height as integer func height(newval as integer) endfunc dim bgColor as color func bgColor (newVal as color) endfunc dim fgColor as color func fgColor (newVal as color) endfunc #doc prop bevelWidth ~This determines the width (in pixels) of the 3D border surrounding the object dim bevelWidth as integer func bevelWidth (newVal as integer) endfunc #doc prop bevelStyle ~This determines the style of the 3D bevel on this object. Possible values include: ~
GMC_BevelRaised
The bevel will appear to rise out of the background. ~
GMC_BevelSunken
The bevel will appear sunken into the background. ~
GMC_BevelNone
No bevel will be drawn. dim bevelStyle as GMC_BevelStyle func bevelStyle (newVal as GMC_BevelStyle) endfunc #doc prop inset ~This determines how close text is allowed to run to the bevel of this object (or the ~edge of the object if the bevel is turned off). This value must always be at least 1. dim inset as integer func inset (newVal as integer) endfunc dim font as bdffont func font(newVal as bdffont) endfunc #doc prop prefix ~The value defined by prefix will be displayed in front of the responses returned ~from the controller. If no prefix is desired, set this property to the empty string (""). dim prefix as string func prefix (newVal as string) endfunc #doc prop suffix ~The value defined by suffix will be displayed following the responses returned ~from the controller. If no suffix is desired, set this property to the empty string (""). dim suffix as string func suffix (newVal as string) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication #doc prop command ~command defines the command (or series of commands) to execute on the controller ~when this button is pressed. This property can be set to any valid command, or any ~semicolon delimited series of commands. Refer to the Command Reference Manual for your ~controller for a list of valid commands. dim command as string func command (newVal as string) endfunc #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer func pollInterval (newVal as integer) endfunc func StartUp() handles MSG_INIT endfunc func Draw() handles MSG_DRAW endfunc handles MSG_TIMETICK endfunc handles MSG_ZENABLED endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc #doc override ResponseReceived #param response:The data returned from the controller. You may modify this paramater for formatting reasons. Any changes to this paramater will be reflected in the final display. ~This event called whenever this object receives receives a response from the controller as a ~result of a poll. The paramater response contains the string that was returned from ~the controller. You may modify response in order to change the final string which ~will be displayed in this object. func ResponseReceived (response as reference to string) endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as reference to string, failReason as GMC_FailureReason) endfunc func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH endfunc func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED endfunc func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE endfunc func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE endfunc func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE endfunc Enddef #endfile #ifnot Galil_mc_src_GMCCommand #option Galil_mc_src_GMCCommand Define Area Object type GMCCommandDisplay #ToolImage "80013FFC40025EFA5F7A403A5F7A5E7A5EFA5C025EFA5F7A40023FFC8001" '******************************************************************* 'Object: GMCCommandDisplay 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: Executes a command (or series of commands) ' on the motion controller when you push this button ' When the command(s) complete execution, the results ' are optionally displayed. ' 'Version: 1.52 'Copyright 2004 QSI Corporation 'Permission is granted to copy, distribute and modify this code, 'provided that this copyright statement is preserved '******************************************************************* #doc object GMCCommandDisplay ~This object provides a simple interface to execute an arbitray command ~(or series of commands) on your Galil Motion Controller. This object ~appears as a push button which when pushed, executes the commands ~defined by the command property, then optionally displays the ~results in the button. library galil_mc source galilcommunications library standard source ToolMessages library standard source TextMultilineBDF library standard source notes Library Standard Source Draw3DRect dim enabled as boolean init enabled := true func enabled(newval as boolean) enabled := newval Enable (me, enabled) endfunc dim parent as objref init parent := default func parent(newval as objref) parent := newval Attach(me, parent) endfunc dim xPos as integer init xPos := 0 func xPos(newval as integer) xPos := newVal Relocate (me, xPos, yPos) RecalcText() endfunc dim yPos as integer init yPos := 0 func yPos(newval as integer) yPos := newval Relocate (me, xPos, yPos) RecalcText() endfunc dim width as integer init width := 25 func width(newval as integer) width := newval Resize (me, width, height) RecalcText() endfunc dim height as integer init height := 25 func height(newval as integer) height := newval Resize (me, width, height) RecalcText() endfunc dim bgColor as color init bgColor := col_183 func bgColor (newVal as color) bgColor := newVal Rerender(me) endfunc dim fgColor as color init fgColor := rgb_black func fgColor (newVal as color) fgColor := newVal Rerender(me) endfunc #doc prop bevelWidth ~This determines the width (in pixels) of the 3D border surrounding the object dim bevelWidth as integer init bevelWidth := 2 func bevelWidth (newVal as integer) bevelWidth := newVal RecalcText() endfunc #doc prop bevelStyle ~This determines the style of the 3D bevel on this object. Possible values include: ~
GMC_BevelRaised
The bevel will appear to rise out of the background. ~
GMC_BevelSunken
The bevel will appear sunken into the background. ~
GMC_BevelNone
No bevel will be drawn. dim bevelStyle as GMC_BevelStyle init bevelStyle := GMC_BevelRaised func bevelStyle (newVal as GMC_BevelStyle) bevelStyle := newVal RecalcText() endfunc #doc prop inset ~This determines how close text is allowed to run to the bevel of this object (or the ~edge of the object if the bevel is turned off). This value must always be at least 1. dim inset as integer init inset := 1 func inset (newVal as integer) if newval < 1 then newval = 1 endif inset := newVal RecalcText() endfunc dim font as bdffont init font := default func font(newVal as bdffont) font := newVal RecalcText() endfunc #doc prop caption ~Caption defines a string that will be displayed above the prefix, suffix, ~and the result of the most recent command execution. You may set this value to an empty ~string (""), if you do not want to display a caption. dim caption as string init caption := "" func caption (newVal as string) caption := newVal RecalcText() endfunc #doc prop hideResults ~If hideResults is set to true, then any data returned from the controller in ~response to executing is not displayed in this object. Additionally, the prefix and ~suffix properties are hidden. If this property is set to false, ~then any data returned by the controller is displayed on the second line along with ~the prefix and suffix properties dim hideResults as boolean init hideResults := false func hideResults(newVal as boolean) hideResults := newVal RecalcText() endfunc #doc prop prefix ~The value defined by prefix will be displayed in front of any response returned ~from the controller. If no prefix is desired, set this property to the empty string (""). dim prefix as string init prefix := "" func prefix (newVal as string) prefix := newVal RecalcText() endfunc #doc prop suffix ~The value defined by suffix will be displayed following any response returned ~from the controller. If no suffix is desired, set this property to the empty string (""). dim suffix as string init suffix := "" func suffix (newVal as string) suffix := newVal RecalcText() endfunc dim xJustify as HAlign init xJustify := HA_Center func xJustify(newVal as HAlign) xJustify := newVal RecalcText() endfunc dim yJustify as VAlign init yJustify := VA_Center func yJustify (newVal as VAlign) yJustify := newVal RecalcText() endfunc dim Tone as _Note init tone := NOTE_USEDEFAULT #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty #doc prop command ~command defines the command (or series of commands) to execute on the controller ~when this button is pressed. This property can be set to any valid command, or any ~semicolon delimited series of commands. Refer to the Command Reference Manual for your ~controller for a list of valid commands. dim command as string init command := "TPX" func command (newVal as string) command := newVal commandCount := GMC_CountCommands (command) endfunc private dim commandCount as integer func StartUp() handles MSG_INIT Relocate (me, xPos, yPos) Resize (me, width, height) Enable (me, enabled) Attach (me, parent) Command(command) Inset(inset) GMC_VerifyCommObj(commObject) RecalcText() endfunc private func RecalcText() dim bdr as integer if bevelStyle == GMC_BevelNone then bdr = inset else bdr = bevelWidth + inset endif if hideResults then displayString := caption else displayString := caption + "\n" + prefix + lastResponse + suffix endif _TextRectProcess (xPos+bdr, yPos+bdr, width-2*bdr, height-2*bdr, displayString, -> xJustify, yJustify, font, brkInfo, misc) allowReleaseOffset := false Rerender(me) endfunc private dim isPressed as boolean private dim allowReleaseOffset as boolean private dim lastResponse as string private dim displayString as string private dim brkInfo[], misc[] as integer func Draw() handles MSG_DRAW SetBgColor(bgcolor) SetFgColor(bgcolor) DrawBox (xPos, yPos, xPos+width-1, yPos+height-1) _TextRectRender(displayString, font, brkInfo, misc, fgColor, bgColor, true) if isPressed then if bevelStyle == gmc_bevelraised then _3dframe (xpos, ypos, xpos+width-1, ypos+height-1, _shadow3dColors[bgcolor], _highlight3dColors[bgcolor], bevelwidth) elseif bevelStyle == gmc_bevelsunken then _3dframe (xpos, ypos, xpos+width-1, ypos+height-1, _highlight3dcolors[bgcolor], _shadow3dColors[bgcolor], bevelwidth) endif else if bevelStyle == gmc_bevelraised then _3dframe (xpos, ypos, xpos+width-1, ypos+height-1, _highlight3dcolors[bgcolor], _shadow3dColors[bgcolor], bevelwidth) elseif bevelStyle == gmc_bevelsunken then _3dframe (xpos, ypos, xpos+width-1, ypos+height-1, _shadow3dColors[bgcolor], _highlight3dColors[bgcolor], bevelwidth) endif endif endfunc private func SetIsPressed(newState as boolean) if newState == isPressed then return endif 'Note: Changing anything which affects the object text display size while the text is 'depressed can result in slightly offset text. if newState then allowReleaseOffset := true if bevelStyle == GMC_bevelSunken then _TRPQuickOffset(-1, -1, brkInfo, misc) else _TRPQuickOffset(1,1,brkInfo, misc) endif elseif allowReleaseOffset then if bevelStyle == GMC_BevelSunken then _TRPQuickOffset (1,1, brkInfo, misc) else _TRPQuickOffset (-1, -1, brkInfo, misc) endif endif IsPressed := newState Rerender(me) endfunc private func ScreenPress (xdown as integer, ydown as integer) returns boolean handles MSG_SCREEN_PRESS SetIsPressed(true) return true endfunc private func ScreenMove (xto as integer, yto as integer, xfrom as integer, yfrom as integer) returns boolean handles MSG_SCREEN_MOVE if isPressed then if (xto < xPos) or (xto >= xPos+width) or (yto < yPos) or (yto >= yPos+height) then SetIsPressed(false) endif endif return true endfunc private func ScreenRelease (xup as integer, yup as integer) returns boolean handles MSG_SCREEN_RELEASE dim doAction as boolean doAction := isPressed SetIsPressed(false) if doAction then _PlayTone (tone, 100, false) if Click() then commObject.SendAsciiCommandStreamCounted(command, me, 0, commandCount) endif endif return true endfunc #doc prop executeCommand ~executeCommand exists to provide a programatic interface to this object. Set ~this property to true whenever you wish to execute the command (the same as if you had ~pressed then released this object).

~Note: This property is intended to be write only. Reading this property will always ~return false. It is not necessary to set this property for commands to execute when ~you push this object. It is only available to allow you to write Qlarity program code ~to manually execute this object's command. If you intend to use this object exclusively ~programmatically via the executeCommand property rather than touching the object on the ~touch screen, then it is recommended that you use the GMCCommandExec object instead. dim executeCommand as boolean init executeCommand := false func ExecuteCommand(newVal as boolean) if newVal then commObject.SendAsciiCommandStreamCounted(command, me, 0, commandCount) endif executeCommand := false endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess lastResponse := trim(commObject.curResponse) ResponseReceived(lastResponse) RecalcText() return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure lastResponse := trim(commObject.curResponse) FailureReceived(lastResponse, commObject.curFailureReason) RecalcText() return true endfunc #doc override Click ~The Click event is called whenever a user touches then releases this object. ~normally, this will cause the command(s) contained in the command property ~to be executed on the controller. If you handle this event, and return false from it, ~however, you can prevent the commands from being sent to the controller. This allows ~you to only run the commands under certain conditions. Also, if you handle this event, ~you can modify the command property to change which command(s) are about to be ~executed on the controller. By default, this event does nothing and returns true. func Click() returns boolean return true endfunc #doc override ResponseReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications ~This event is triggered after a command has been sent to the controller and a response ~has been received. The paramater response contains the string that the controller ~responded with. You may modify the value of the response property as desired to ~control the display of this object. The object will display whatever is contained ~in the response property after this function executes. By default this event ~does nothing. func ResponseReceived(response as reference to string) return endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as reference to string, failReason as GMC_FailureReason) return endfunc 'The rest of these functions add functionality to the PC development tool. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in the PC development tool. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by the PC development tool, when you change the attachment 'of an object (i.e. in response to dragging it around the object tree). 'Note: the purpose of this function is to allow you to attach to another 'container, you should not change your parent property or call Tool_Persist 'until you receive a MSG_TOOL_ATTACHED. A MSG_TOOL_ATTACHED will be sent 'in response to an Attach API function call. func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH Attach (me, attachTo) endfunc 'This function is called in response to calling Attach (primarily in a 'handler for MSG_TOOL_ATTACH, but possibly in other places as well_. func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED 'Set our parent property to reflect who we are attached to and save parent := newParent Tool_Persist (parent) 'Save parent endfunc 'This function is called when the user drags an object instance with the 'mouse in the PC development tool. dx and dy are relative offsets from the current 'location of the object func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE xPos := xPos + dx yPos := yPos + dy Relocate (me, xPos, yPos) 'Save the changes we just made Tool_Persist (xPos) Tool_Persist (yPos) RecalcText() endfunc 'This function is called by the PC development tool to obtain the coordinates of 'the resize grips. The arrays xCoords, yCoords, and cursors all contain 0 'elements initially. This means that you should either call redim on those 'arrays and set their values, or declare local arrays, set the values of 'the local arrays, and then assign xCoords, yCoords and cursors to those 'local arrays. Closed indicates whether the Foundry should connect the 'first and last grips to make a closed object. xCoords, yCoords, and 'cursors should all contain the same number of elements when this function 'completes func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolGetHandles (xCoords, yCoords, cursors, closed, xPos, yPos, width, height) endfunc 'This function is called in response to a user moving a resize grip within 'the PC development tool. handleNum is the index into the arrays that were returned 'by the handler for MSG_TOOL_GETHANDLES. You should return true from this 'function func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolMoveHandle (handleNum, dx, dy, xPos, yPos, width, height, me) RecalcText() endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. (x1, y1) are the coordinates that the user started his 'drag and (x2, y2) are the coordinates that the mouse was released func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolDragCreate (parentObj, x1, y1, x2, y2, xPos, yPos, width, height, parent) 'Call our MSG_INIT handler StartUp() endfunc #endif Enddef Define Object type GMCCommandExec #ToolImage "FFFFFFFFFFFFFF7FFFBFE01FFFBFFE7FFDFFF807FDFFFEFFFFFFFFFFFFFF" '******************************************************************* 'Object: GMCCommandExec 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: Executes a command on the motion controller and ' presents notification when complete ' 'Version: 1.52 'Copyright 2004 QSI Corporation 'Permission is granted to copy, distribute and modify this code, 'provided that this copyright statement is preserved '******************************************************************* #doc object GMCCommandExec ~This object provides a simple interface to execute an arbitray command ~(or series of commands) on your Galil Motion Controller. Unlike the ~GMCCommandDisplay object, this object has no graphical interface. It is ~used to programmatically execute commands on the controller. The ~ResponseReceived event can be used to process any data returned by the ~controller in response to your commands. dim enabled as boolean init enabled := true func enabled(newval as boolean) enabled := newval Enable (me, enabled) endfunc dim parent as objref init parent := default func parent(newval as objref) parent := newval Attach(me, parent) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty #doc prop command ~command defines the command (or series of commands) to execute on the controller ~when this button is pressed. This property can be set to any valid command, or any ~semicolon delimited series of commands. Refer to the Command Reference Manual for your ~controller for a list of valid commands. dim command as string init command := "TPX" func command (newVal as string) command := newVal commandCount := GMC_CountCommands (command) endfunc private dim commandCount as integer func StartUp() handles MSG_INIT Enable (me, enabled) Attach (me, parent) Command(command) GMC_VerifyCommObj(commObject) endfunc #doc prop executeCommand ~executeCommand exists to provide a programatic interface to this object. Set ~this property to true whenever you wish to execute the command (the same as if you had ~pressed then released this object).

~Note: This property is intended to be write only. Reading this property will always ~return false. As this object contains no graphical interface, setting the ~executeCommand is the only way to cause this object to execute its command. ~

Handle the ResponseReceived event if you want to process the response ~to this command. dim executeCommand as boolean init executeCommand := false func ExecuteCommand(newVal as boolean) if newVal then commObject.SendAsciiCommandStreamCounted(command, me, 0, commandCount) endif endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess ResponseReceived(trim(commObject.curResponse)) return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure FailureReceived(trim(commObject.curResponse), commObject.curFailureReason) return true endfunc #doc override ResponseReceived ~This event is triggered after a command has been sent to the controller and a response ~has been received. The paramater response contains the string that the controller ~responded with. By default this event does nothing. func ResponseReceived(response as string) return endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as string, failReason as GMC_FailureReason) return endfunc 'The rest of these functions add functionality to the PC development tool. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in the PC development tool. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by the PC development tool, when you change the attachment 'of an object (i.e. in response to dragging it around the object tree). 'Note: the purpose of this function is to allow you to attach to another 'container, you should not change your parent property or call Tool_Persist 'until you receive a MSG_TOOL_ATTACHED. A MSG_TOOL_ATTACHED will be sent 'in response to an Attach API function call. func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH Attach (me, attachTo) endfunc 'This function is called in response to calling Attach (primarily in a 'handler for MSG_TOOL_ATTACH, but possibly in other places as well_. func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED 'Set our parent property to reflect who we are attached to and save parent := newParent Tool_Persist (parent) 'Save parent endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. func ToolDragCreate (parentObj as objref) handles MSG_TOOL_DRAGCREATE parent := parentObj Tool_Persist (parent) 'Call our MSG_INIT handler Startup() endfunc #endif Enddef #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œœ’’ž‘› dtd˜ž“–“ ’œ Œœ ˜’œœ’’ž‘› dKK K@K}˜’œœ’’ž‘››–Œ“ž† d@dC<ÇÏÏÎ̹¹ŒËÏÏÍʺ¹ŸÊ¹ÈŸËÏ̟ʹȟʺȟʺ¹ŸÊŒÏÍʺ¹ŸÊ¹ÈŸËÏÏÍ̹¹ŒÇÏÏÎ d d d d d d d d d d d d d d d d d d d d d d d dÀd}˜ž“–“ ’œÐd}˜ž“–“œ’’Š‘–œž‹–‘Œ dÀd}Œ‹ž‘›ž›Ðd} ‹“’šŒŒž˜šŒ dÀd}Œ‹ž‘›ž›Ðd}‹š‡‹’Š“‹–“–‘š›™ dÀd}Œ‹ž‘›ž›Ðd}‘‹šŒ dÀd}Œ‹ž‘›ž›Ðd} ›žˆÌ›šœ‹ d d!ÀD!}!š‘ž“š›ÐD!°>! d"ðD"}"š‘ž“š›"1" d#€W#}#š‘ž“š›€#}#‘šˆ‰ž“ÐD#°>## d$}$š‘ž“š›$}$‘šˆ‰ž“ d%}%š‘ž“š€%à^%À%}%š‘ž“š›% d&ÐW& d' d(ÀD(}(žš‘‹ÐD(à>( d)ðD)})žš‘‹)P) d*€W*}*žš‘‹€*}*‘šˆ‰ž“ÐD*à>** d+}+žš‘‹+}+‘šˆ‰ž“ d,},ž‹‹žœ—€,à^,À,},žš‘‹, d-ÐW- d. d/ÀD/}/‡ŒÐD/€>/ d0ðD0}0‡Œ00 d1€W1}1‡Œ€1}1‘šˆ‰ž“ÐD1€>11 d2}2‡Œ2}2‘šˆ‰ž“ d3}3š“œž‹š€3à^3À3}3‡ŒÀ3}3†Œ3 d4}4 šœž“œ‹š‡‹€44 d5ÐW5 d6 d7ÀD7}7†ŒÐD7€>7 d8ðD8}8†Œ88 d9€W9}9†Œ€9}9‘šˆ‰ž“ÐD9€>99 d:}:†Œ:}:‘šˆ‰ž“ d;};š“œž‹š€;à^;À;};‡ŒÀ;};†Œ; d<}< šœž“œ‹š‡‹€<< d=ÐW= d> d?ÀD?}?ˆ–›‹—ÐD?€>? d@ðD@}@ˆ–›‹—@@ dA€WA}Aˆ–›‹—€A}A‘šˆ‰ž“ÐDA€>AA dB}Bˆ–›‹—B}B‘šˆ‰ž“ dC}CšŒ–…š€Cà^CÀC}Cˆ–›‹—ÀC}C—š–˜—‹C dD}D šœž“œ‹š‡‹€DD dEÐWE dF dGÀDG}G—š–˜—‹ÐDG€>G dHðDH}H—š–˜—‹HH dI€WI}I—š–˜—‹€I}I‘šˆ‰ž“ÐDI€>II dJ}J—š–˜—‹J}J‘šˆ‰ž“ dK}KšŒ–…š€Kà^KÀK}Kˆ–›‹—ÀK}K—š–˜—‹K dL}L šœž“œ‹š‡‹€LL dMÐWM dN dOÀDO}O˜œ“ÐDOð>O dPðDP}P˜œ“P}Pœ“ ÎÇÌ dQ€WQ}Q˜œ“€Q}Q‘šˆ‰ž“ÐDQð>QQ dR}R˜œ“R}R‘šˆ‰ž“ dS}Sšš‘›š€Sà^SS dTÐWT dU dVÀDV}V™˜œ“ÐDVð>V dWðDW}W™˜œ“W}W ˜ “žœ” dX€WX}X™˜œ“€X}X‘šˆ‰ž“ÐDXð>XX dY}Y™˜œ“Y}Y‘šˆ‰ž“ dZ}Zšš‘›š€Zà^ZZ d[ÐW[ d\ d] d^ d_ÀD_}_ š‰š“ˆ–›‹—ÐD_€>_ d`ðD`}` š‰š“ˆ–›‹—`` da€Wa}a š‰š“ˆ–›‹—€a}a‘šˆ‰ž“ÐDa€>aa db}b š‰š“ˆ–›‹—b}b‘šˆ‰ž“ dc}c šœž“œ‹š‡‹€cc ddÐWd de df dg dh di dj dkÀDk}k š‰š“Œ‹†“šÐDk}k˜’œ š‰š“Œ‹†“š dlðDl}l š‰š“Œ‹†“šl}l˜’œ š‰š“ž–Œš› dm€Wm}m š‰š“Œ‹†“š€m}m‘šˆ‰ž“ÐDm}m˜’œ š‰š“Œ‹†“šm dn}n š‰š“Œ‹†“šn}n‘šˆ‰ž“ do}o šœž“œ‹š‡‹€oo dpÐWp dq dr ds dt duÀDu}u–‘Œš‹ÐDu€>u dvðDv}v–‘Œš‹vv dw€Ww}w–‘Œš‹€w}w‘šˆ‰ž“ÐDw€>ww dx^x}x‘šˆ‰ž“Àxx^x dy}y‘šˆ‰ž“Ðyy dz@^z d{}{–‘Œš‹{}{‘šˆ‰ž“ d|}| šœž“œ‹š‡‹€|| d}ÐW} d~ dÀD}™‘‹ÐD? d€ðD€}€™‘‹€P€ d€W}™‘‹€}‘šˆ‰ž“ÐD? d‚}‚™‘‹‚}‚‘šˆ‰ž“ dƒ}ƒ šœž“œ‹š‡‹€ƒƒ d„ÐW„ d… d† d‡ dˆ d‰ dŠÀDŠ}Šœž‹–‘ÐDŠÀ>Š d‹ðD‹}‹œž‹–‘‹C‹ dŒ€WŒ}Œœž‹–‘€Œ}Œ‘šˆ‰ž“ÐDŒÀ>ŒŒ d}œž‹–‘}‘šˆ‰ž“ dŽ}Ž šœž“œ‹š‡‹€ސŽ dÐW d d‘ d’ d“ d” d• d– d—ÀD—}— —–›ššŒŠ“‹ŒÐD—°>— d˜ðD˜}˜ —–›ššŒŠ“‹Œ˜A˜ d™€W™}™ —–›ššŒŠ“‹Œ€™}™‘šˆ‰ž“ÐD™°>™™ dš}š —–›ššŒŠ“‹Œš}š‘šˆ‰ž“ d›}› šœž“œ‹š‡‹€›› dœÐWœ d dž dŸ d  d¡ÀD¡}¡š™–‡ÐD¡À>¡ d¢ðD¢}¢š™–‡¢C¢ d£€W£}£š™–‡€£}£‘šˆ‰ž“ÐD£À>££ d€}€š™–‡€}€‘šˆ‰ž“ d¥}¥ šœž“œ‹š‡‹€¥¥ dŠÐWŠ d§ dš d© dª d«ÀD«}«ŒŠ™™–‡ÐD«À>« d¬ðD¬}¬ŒŠ™™–‡¬C¬ d­€W­}­ŒŠ™™–‡€­}­‘šˆ‰ž“ÐD­À>­­ d®}®ŒŠ™™–‡®}®‘šˆ‰ž“ d¯}¯ šœž“œ‹š‡‹€¯¯ d°ÐW° d± d²ÀD²}²‡•ŠŒ‹–™†ÐD²}²—ž“–˜‘ d³ðD³}³‡•ŠŒ‹–™†³}³ —ž œš‘‹š dŽ€WŽ}އ•ŠŒ‹–™†€Ž}Ž‘šˆ‰ž“ÐDŽ}Ž—ž“–˜‘Ž dµ}µ‡•ŠŒ‹–™†µ}µ‘šˆ‰ž“ d¶}¶ šœž“œ‹š‡‹€¶¶ d·ÐW· dž d¹ÀD¹}¹†•ŠŒ‹–™†ÐD¹}¹‰ž“–˜‘ dºðDº}º†•ŠŒ‹–™†º}º ‰ž œš‘‹š d»€W»}»†•ŠŒ‹–™†€»}»‘šˆ‰ž“ÐD»}»‰ž“–˜‘» dŒ}Œ†•ŠŒ‹–™†Œ}Œ‘šˆ‰ž“ dœ}œ šœž“œ‹š‡‹€œœ dŸÐWŸ d¿ dÀÀDÀ}À‹‘šÐDÀ}À ‘‹š dÁðDÁ}Á‹‘šÁ}Á‘‹š ŠŒš›š™žŠ“‹ d dà dÄ dÅ dÆ dÇ dÈ dÉ dÊÀDÊ}Ê œ’’•šœ‹ÐDÊà>Ê}ʘž“–“œ’’Š‘–œž‹–‘ dËðDË}Ë œ’’•šœ‹Ë}Ëš’‹† dÌ dÍ dÎ dÏ dÐ dÑ dÒÀDÒ}Òœ’’ž‘›ÐDÒÀ>Ò dÓðDÓ}Óœ’’ž‘›ÓCÓ«¯§ dԀWÔ}Ôœ’’ž‘›€Ô}Ô‘šˆ‰ž“ÐDÔÀ>ԐÔ dÕ}Õœ’’ž‘›Õ}Õ‘šˆ‰ž“ dÖ}Ö œ’’ž‘›œŠ‘‹Ö}Ö˜’œ œŠ‘‹œ’’ž‘›Œ€Ö}Öœ’’ž‘›Ö d×ÐW× dØ`KØÀDØ}Ø œ’’ž‘›œŠ‘‹ÐD؀>Ø dÙ dڀWÚ}ÚŒ‹ž‹Š€ڐÚ dÛÀWÛ}Û’Œ˜ –‘–‹ dÜ}Üš“œž‹š€Üà^ÜÀÜ}܇ŒÀÜ}܆ŒÜ dÝ}ÝšŒ–…š€Ýà^ÝÀÝ}݈–›‹—ÀÝ}Ý—š–˜—‹Ý dÞ}Þš‘ž“š€Þà^ÞÀÞ}Þš‘ž“š›Þ dß}ßž‹‹žœ—€ßà^ßÀß}ߏžš‘‹ß dà}àœ’’ž‘›€à}àœ’’ž‘›à dá}á–‘Œš‹€á}á–‘Œš‹á dâ dã}㘒œ ‰š–™†œ’’•€ã}㠜’’•šœ‹ã dä då}å šœž“œ‹š‡‹€åå dæÐWæ dç dè dé`Ké€Wé}é šœž“œ‹š‡‹€éé dêÀDê}ꝛÐDê€>ê dë dì^ì}ì š‰š“Œ‹†“šÐì}ì ˜’œ š‰š“‘‘š^ì dí}흛Ðí}í–‘Œš‹ dî0^î dï}Ðï}ï š‰š“ˆ–›‹—°ï}ï–‘Œš‹ dð@^ð dñ dò^ò}ò —–›ššŒŠ“‹Œ^ò dó}ó ›–Œ“ž†Œ‹–‘˜ó}󜞏‹–‘ dô0^ô dõ}õ ›–Œ“ž†Œ‹–‘˜õ}õœž‹–‘°õCõõ°õ}õš™–‡°õ}õ “žŒ‹šŒ‘Œš°õ}õŒŠ™™–‡ dö@^ö d÷}÷ ‹š‡‹šœ‹œšŒŒ€÷}÷‡Œ°÷}÷›À÷}÷†Œ°÷}÷›À÷}÷ˆ–›‹—Ð÷÷ ÷}÷›À÷}÷—š–˜—‹Ð÷÷ ÷}÷›À÷}÷ ›–Œ“ž†Œ‹–‘˜À÷}ø‡•ŠŒ‹–™†Àø}ø†•ŠŒ‹–™†Àø}ø™‘‹Àø}ø”–‘™Àø}ø’–Œœø dù dú}úž““ˆš“šžŒš™™Œš‹úAú dû}ûšš‘›š€ûà^ûû düÐWü dý dþ`KþÀDþ}þ –ŒšŒŒš›ÐDþ°>þ dÿ`KÿÀDÿ}ÿž““ˆš“šžŒš™™Œš‹ÐDÿ°>ÿ d`KÀD} “žŒ‹šŒ‘ŒšÐDÀ> d`KÀD} ›–Œ“ž†Œ‹–‘˜ÐDÀ> d`KÀD}”–‘™°ÐÀ}’–Œœ°ÐÐD€> d€W}›žˆ€ dÀW}’Œ˜ ›žˆ d d} Œš‹˜œ“€}˜œ“ d} Œš‹™˜œ“€}˜œ“ d}›žˆ‡€}‡ŒÀ}†ŒÀ}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹Ð d  d }  ‹š‡‹šœ‹š‘›š€ }  ›–Œ“ž†Œ‹–‘˜À } ™‘‹À } ”–‘™À } ’–ŒœÀ } ™˜œ“À } ˜œ“À 1   d  d ^ }  –ŒšŒŒš›^  d ^ }  š‰š“Œ‹†“šÐ } ˜’œ š‰š“ž–Œš›^  d} Ì›™ž’š€}‡ŒÀ}†ŒÀ}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ} Œ—ž›ˆÌ›œ“Œ°}˜œ“ÐÀ} —–˜—“–˜—‹Ì›œ“Œ°}˜œ“ÐÀ} š‰š“ˆ–›‹— d ^} š‰š“Œ‹†“šÐ}˜’œ š‰š“ŒŠ‘”š‘^ d} Ì›™ž’š€}‡ŒÀ}†ŒÀ}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ} —–˜—“–˜—‹Ì›œ“Œ°}˜œ“ÐÀ} Œ—ž›ˆÌ›œ“Œ°}˜œ“ÐÀ} š‰š“ˆ–›‹— d@^ d0^ d^} š‰š“Œ‹†“šÐ}˜’œ š‰š“ž–Œš›^ d} Ì›™ž’š€}‡ŒÀ}†ŒÀ}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ} —–˜—“–˜—‹Ì›œ“Œ°}˜œ“ÐÀ} Œ—ž›ˆÌ›œ“Œ°}˜œ“ÐÀ} š‰š“ˆ–›‹— d ^} š‰š“Œ‹†“šÐ}˜’œ š‰š“ŒŠ‘”š‘^ d} Ì›™ž’š€}‡ŒÀ}†ŒÀ}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ} Œ—ž›ˆÌ›œ“Œ°}˜œ“ÐÀ} —–˜—“–˜—‹Ì›œ“Œ°}˜œ“ÐÀ} š‰š“ˆ–›‹— d@^ d@^ dÐW d d`K€W} Œš‹–ŒšŒŒš›€}‘šˆŒ‹ž‹šÐD°> d^}‘šˆŒ‹ž‹šÐ} –ŒšŒŒš›^ dð^ d@^ d d  d! d"^"}"‘šˆŒ‹ž‹š^" d#}#ž““ˆš“šžŒš™™Œš‹#1# d$^$}$ š‰š“Œ‹†“šÐ$}$˜’œ š‰š“ŒŠ‘”š‘^$ d%}% ‹ŽŠ–œ”™™Œš‹€%Ð%%À%Ð%%À%}%”–‘™À%}%’–Œœ% d&0^& d'}' ‹ŽŠ–œ”™™Œš‹€''À''À'}'”–‘™À'}'’–Œœ' d(@^( d) ^)})ž““ˆš“šžŒš™™Œš‹^) d*^*}* š‰š“Œ‹†“šÐ*}*˜’œ š‰š“ŒŠ‘”š‘^* d+}+ ‹ŽŠ–œ”™™Œš‹€++À++À+}+”–‘™À+}+’–Œœ+ d,0^, d-}- ‹ŽŠ–œ”™™Œš‹€-Ð--À-Ð--À-}-”–‘™À-}-’–Œœ- d.@^. d/@^/ d0}0 –ŒšŒŒš›0}0‘šˆŒ‹ž‹š d1}1šš‘›š€1à^11 d2ÐW2 d3 d4`K4€W4}4 Œœšš‘šŒŒ€4}4‡›ˆ‘ÐD4€>4À4}4†›ˆ‘ÐD4€>44°W4°>4 d5ÀW5}5’Œ˜ Œœšš‘ šŒŒ d6 d7}7 Œš‹–ŒšŒŒš›€7177 d8 d9ð^919 d:ÐW: d; d<`K<€W<}< Œœšš‘’‰š€<}<‡‹ÐD<€><À<}<†‹ÐD<€><À<}<‡™’ÐD<€><À<}<†™’ÐD<€><<°W<°>< d=ÀW=}=’Œ˜ Œœšš‘ ’‰š d> d?^?}? –ŒšŒŒš›^? d@^@€@}@‡‹À@}@‡Œ@À@€@}@‡‹ð@}@‡Œ°@}@ˆ–›‹—@À@€@}@†‹À@}@†Œ@À@€@}@†‹ð@}@†Œ°@}@—š–˜—‹@^@ dA}A Œš‹–ŒšŒŒš›€AAAA dB@^B dC@^C dD dEð^E1E dFÐWF dG dH`KH€WH}H Œœšš‘š“šžŒš€H}H‡ŠÐDH€>HÀH}H†ŠÐDH€>HH°WH°>H dIÀWI}I’Œ˜ Œœšš‘ š“šžŒš dJ dKÀDK}K›žœ‹–‘ÐDK°>K dL dM}M›žœ‹–‘M}M –ŒšŒŒš› dN}N Œš‹–ŒšŒŒš›€NANN dO dP^P}P›žœ‹–‘^P dQ}Q  “ž†‹‘š€Q}Q‹‘šÀQQdÀQAQQ dR^R}Rœ“–œ”€RR^R dS}S œ’’•šœ‹àS}SŒš‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€S}Sœ’’ž‘›ÀSà^SÀSSÀS}S œ’’ž‘›œŠ‘‹S dT@^T dU@^U dV dWð^W1W dXÐWX dY dZ d[ d\ d] d^ d_ d` da db dc ddÀDd}dš‡šœŠ‹šœ’’ž‘›ÐDd°>d deðDe}eš‡šœŠ‹šœ’’ž‘›eAe df€Wf}fš‡šœŠ‹šœ’’ž‘›€f}f‘šˆ‰ž“ÐDf°>ff dg^g}g‘šˆ‰ž“^g dh}h œ’’•šœ‹àh}hŒš‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€h}hœ’’ž‘›Àhà^hÀhhÀh}h œ’’ž‘›œŠ‘‹h di@^i dj}jš‡šœŠ‹šœ’’ž‘›jAj dkÐWk dl dm dn`Kn€Wn}nŒŠœœšŒŒ€n}nž’ÐDn€>nn°Wn°>n doÀWo}o˜’œ œ’’ŒŠœœšŒŒ dp dq}q “žŒ‹šŒ‘Œšq}q‹–’€q}q œ’’•šœ‹àq}q œŠšŒ‘Œšq dr}ršŒ‘Œššœš–‰š›€r}r “žŒ‹šŒ‘Œšr ds}s šœž“œ‹š‡‹€ss dtð^t1t duÐWu dv dw`Kw€Ww}w™ž–“Šš€w}wž’ÐDw€>ww°Ww°>w dxÀWx}x˜’œ œ’’™ž–“Šš dy dz}z “žŒ‹šŒ‘Œšz}z‹–’€z}z œ’’•šœ‹àz}z œŠšŒ‘Œšz d{}{™ž–“Šššœš–‰š›€{}{ “žŒ‹šŒ‘ŒšÀ{}{ œ’’•šœ‹à{}{œŠ™ž–“ŠššžŒ‘{ d|}| šœž“œ‹š‡‹€|| d}ð^}1} d~ÐW~ d d€ d d‚ dƒ d„ d… d† d‡ dˆ€Wˆ}ˆœ“–œ”€ˆˆ°Wˆ°>ˆ d‰ð^‰1‰ dŠÐWŠ d‹ dŒ d dŽ d d d‘ d’ d“ d”€W”}”šŒ‘Œššœš–‰š›€”}”šŒ‘ŒšÐD”W” W”À>”” d•ð^• d–ÐW– d— d˜ d™ dš d› dœ d€W}™ž–“Šššœš–‰š›€}šŒ‘ŒšÐDW WÀ>À} ™ž–“šžŒ‘ÐD}˜’œ ™ž–“ŠššžŒ‘ džð^ž dŸÐWŸ d  d¡ d¢ d£ d€ d¥ dŠ d§ dš d© dª d«„d« ‹“ d¬ d­ d® d¯ d° d± d²€W²}² ‹“ž‹‹žœ—€²}²ž‹‹žœ—‹ÐD²à>²² d³ÀW³}³’Œ˜ ‹“ ž‹‹žœ— dŽ dµ}µž‹‹žœ—€µà^µÀµ}µž‹‹žœ—‹µ d¶ÐW¶ d· dž d¹ dº€Wº}º ‹“ž‹‹žœ—š›€º}º ‘šˆžš‘‹ÐDºà>ºº d»ÀW»}»’Œ˜ ‹“ ž‹‹žœ—š› dŒ dœ dŸ}Ÿžš‘‹Ÿ}Ÿ ‘šˆžš‘‹ d¿}¿ ‹“ šŒ–Œ‹€¿}¿žš‘‹¿ dÀÐWÀ dÁ d dà dÄ dÅ€WÅ}Å‹“’‰š€Å}Å›‡ÐDÅ€>ÅÀÅ}Å›†ÐDÅ€>ŐŠdÆÀWÆ}Æ ’Œ˜ ‹“ ’‰š dÇ dÈ}ȇŒÈ}ȇŒ°È}È›‡ dÉ}ɆŒÉ}ɆŒ°É}É›† dÊ}Êš“œž‹š€Êà^ÊÀÊ}ʇŒÀÊ}ʆŒÊ dË dÌ dÍ}Í ‹“ šŒ–Œ‹€Í}͇ŒÍ dÎ}Î ‹“ šŒ–Œ‹€Î}ΆŒÎ dÏ}Ï šœž“œ‹š‡‹€ÏÏ dÐÐWÐ dÑ dÒ dÓ dÔ dÕ dÖ d× dØ dÙ dÚ dÛ€WÛ}Û‹“˜š‹—ž‘›“šŒ€Û}Û‡œ›Œ°ÛÐÛÐDېWÛ WÛ€>ÛÀÛ}܆œ›Œ°ÜÐÜÐDܐWÜ WÜ€>ÜÀÜ}ÝœŠŒŒ°ÝÐÝÐDݐWÝ WÝ}Ý ˜Š–œŠŒŒÀÝ}Þœ“Œš›ÐDސWÞ WÞ°>ÞÞ dßÀWß}ß’Œ˜ ‹“ ˜š‹—ž‘›“šŒ dà dá dâ dã dä}ä ‹“˜š‹—ž‘›“šŒ€ä}䇜›ŒÀä}䆜›ŒÀä}䜊ŒŒÀä}䜓Œš›Àä}䇏ŒÀä}䆏ŒÀä}䈖›‹—Àä}ä—š–˜—‹ä då dæÐWæ dç dè dé dê dë dì€Wì}싐“’‰š—ž‘›“š€ì}ì —ž‘›“š‘Š’ÐDìWì Wì€>ìÀì}웇ÐDì€>ìÀì}웆ÐDì€>ìì díÀWí}í’Œ˜ ‹“ ’‰š—ž‘›“š dî dï dð dñ dò}ò ‹“’‰š—ž‘›“š€ò}ò —ž‘›“š‘Š’Àò}ò›‡Àò}ò›†Àò}ò‡ŒÀò}ò†ŒÀò}òˆ–›‹—Àò}ò—š–˜—‹Àòà^òò dó}ó šœž“œ‹š‡‹€óó dôÐWô dõ dö d÷ dø dù dú dû dü dý€Wý}ý‹“›ž˜œšž‹š€ý}ý žš‘‹•ÐDýà>ýÀý}ý‡ÎÐDý€>ýÀý}ý†ÎÐDý€>ýÀý}þ‡ÍÐDþ€>þÀþ}þ†ÍÐDþ€>þþ dÿÀWÿ}ÿ’Œ˜ ‹“ ›ž˜œšž‹š d d d d d} ‹“›ž˜œšž‹š€} žš‘‹•À}‡ÎÀ}†ÎÀ}‡ÍÀ}†ÍÀ}‡ŒÀ}†ŒÀ}ˆ–›‹—À}—š–˜—‹À}žš‘‹ d d d}Œ‹ž‹Š€ dÐW d  d  d  d PK  d K  K @K } ˜’œœ’’ž‘›š‡šœ d @d C <¹¹¹¹¹¹¹¹¹¹¹¹¹¹È¹¹¹œ¹ºÏι¹¹œ¹¹ºÈ¹¹»¹¹¹ÇÏȹ»¹¹¹º¹¹¹¹¹¹¹¹¹¹¹¹¹¹ d d d d d d d d d d d d d d d d d d d  d! d" d# d$ÀD$}$š‘ž“š›ÐD$°>$ d%ðD%}%š‘ž“š›%1% d&€W&}&š‘ž“š›€&}&‘šˆ‰ž“ÐD&°>&& d'}'š‘ž“š›'}'‘šˆ‰ž“ d(}(š‘ž“š€(à^(À(}(š‘ž“š›( d)ÐW) d* d+ÀD+}+žš‘‹ÐD+à>+ d,ðD,},žš‘‹,P, d-€W-}-žš‘‹€-}-‘šˆ‰ž“ÐD-à>-- d.}.žš‘‹.}.‘šˆ‰ž“ d/}/ž‹‹žœ—€/à^/À/}/žš‘‹/ d0ÐW0 d1 d2 d3 d4 d5 d6 d7 d8 d9ÀD9}9 œ’’•šœ‹ÐD9à>9}9˜ž“–“œ’’Š‘–œž‹–‘ d:ðD:}: œ’’•šœ‹:}:š’‹† d; d< d= d> d? d@ dAÀDA}Aœ’’ž‘›ÐDAÀ>A dBðDB}Bœ’’ž‘›BCB«¯§ dC€WC}Cœ’’ž‘›€C}C‘šˆ‰ž“ÐDCÀ>CC dD}Dœ’’ž‘›D}D‘šˆ‰ž“ dE}E œ’’ž‘›œŠ‘‹E}E˜’œ œŠ‘‹œ’’ž‘›Œ€E}Eœ’’ž‘›E dFÐWF dG`KGÀDG}G œ’’ž‘›œŠ‘‹ÐDG€>G dH dI€WI}IŒ‹ž‹Š€II dJÀWJ}J’Œ˜ –‘–‹ dK dL}Lš‘ž“š€Là^LÀL}Lš‘ž“š›L dM}Mž‹‹žœ—€Mà^MÀM}Mžš‘‹M dN}Nœ’’ž‘›€N}Nœ’’ž‘›N dO dP}P˜’œ ‰š–™†œ’’•€P}P œ’’•šœ‹P dQ dRÐWR dS dT dU dV dW dX dY dZ d[ d\ d]ÀD]}]š‡šœŠ‹šœ’’ž‘›ÐD]°>] d^ðD^}^š‡šœŠ‹šœ’’ž‘›^A^ d_€W_}_š‡šœŠ‹šœ’’ž‘›€_}_‘šˆ‰ž“ÐD_°>__ d`^`}`‘šˆ‰ž“^` da}a œ’’•šœ‹àa}aŒš‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€a}aœ’’ž‘›Àaà^aÀaaÀa}a œ’’ž‘›œŠ‘‹a db@^b dcÐWc dd de`Ke€We}eŒŠœœšŒŒ€e}ež’ÐDe€>ee°We°>e dfÀWf}f˜’œ œ’’ŒŠœœšŒŒ dg dh}hšŒ‘Œššœš–‰š›€h}h‹–’€h}h œ’’•šœ‹àh}h œŠšŒ‘Œšhh dið^i1i djÐWj dk dl`Kl€Wl}l™ž–“Šš€l}lž’ÐDl€>ll°Wl°>l dmÀWm}m˜’œ œ’’™ž–“Šš dn do}o™ž–“Šššœš–‰š›€o}o‹–’€o}o œ’’•šœ‹ào}o œŠšŒ‘ŒšoÀo}o œ’’•šœ‹ào}oœŠ™ž–“ŠššžŒ‘o dpð^p1p dqÐWq dr ds dt du dv dw€Ww}wšŒ‘Œššœš–‰š›€w}wšŒ‘ŒšÐDwÀ>ww dxð^x dyÐWy dz d{ d| d} d~ d d€€W€}€™ž–“Šššœš–‰š›€€}€šŒ‘ŒšÐD€À>€À€}€ ™ž–“šžŒ‘ÐD€}€˜’œ ™ž–“ŠššžŒ‘€ dð^ d‚ÐW‚ dƒ d„ d… d† d‡ dˆ d‰ dŠ d‹ dŒ d dŽ„dŽ ‹“ d d d‘ d’ d“ d” d•€W•}• ‹“ž‹‹žœ—€•}•ž‹‹žœ—‹ÐD•à>•• d–ÀW–}–’Œ˜ ‹“ ž‹‹žœ— d— d˜}˜ž‹‹žœ—€˜à^˜À˜}˜ž‹‹žœ—‹˜ d™ÐW™ dš d› dœ d€W} ‹“ž‹‹žœ—š›€} ‘šˆžš‘‹ÐDà> džÀWž}ž’Œ˜ ‹“ ž‹‹žœ—š› dŸ d  d¡}¡žš‘‹¡}¡ ‘šˆžš‘‹ d¢}¢ ‹“ šŒ–Œ‹€¢}¢žš‘‹¢ d£ÐW£ d€ d¥ dŠ d§ dš d© dª d« d¬ d­€W­}­‹“›ž˜œšž‹š€­}­ žš‘‹•ÐD­à>­­ d®ÀW®}®’Œ˜ ‹“ ›ž˜œšž‹š d¯ d°}°žš‘‹°}° žš‘‹• d±}± ‹“ šŒ–Œ‹€±}±žš‘‹± d² d³ dŽ}ŽŒ‹ž‹Š€ŽŽ dµÐWµ d¶ d· d· džPKž d¹ dº d» dŒ dœ dŸ d¿ dÀ dÁ d dà dÄ dÅ dÆ dÆ dÇ dȰdÈ Define Area Object type GMCCommandDisplay #doc object GMCCommandDisplay ~This object provides a simple interface to execute an arbitray command ~(or series of commands) on your Galil Motion Controller. This object ~appears as a push button which when pushed, executes the commands ~defined by the command property, then optionally displays the ~results in the button. dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc dim xPos as integer func xPos(newval as integer) endfunc dim yPos as integer func yPos(newval as integer) endfunc dim width as integer func width(newval as integer) endfunc dim height as integer func height(newval as integer) endfunc dim bgColor as color func bgColor (newVal as color) endfunc dim fgColor as color func fgColor (newVal as color) endfunc #doc prop bevelWidth ~This determines the width (in pixels) of the 3D border surrounding the object dim bevelWidth as integer func bevelWidth (newVal as integer) endfunc #doc prop bevelStyle ~This determines the style of the 3D bevel on this object. Possible values include: ~
GMC_BevelRaised
The bevel will appear to rise out of the background. ~
GMC_BevelSunken
The bevel will appear sunken into the background. ~
GMC_BevelNone
No bevel will be drawn. dim bevelStyle as GMC_BevelStyle func bevelStyle (newVal as GMC_BevelStyle) endfunc #doc prop inset ~This determines how close text is allowed to run to the bevel of this object (or the ~edge of the object if the bevel is turned off). This value must always be at least 1. dim inset as integer func inset (newVal as integer) endfunc dim font as bdffont func font(newVal as bdffont) endfunc #doc prop caption ~Caption defines a string that will be displayed above the prefix, suffix, ~and the result of the most recent command execution. You may set this value to an empty ~string (""), if you do not want to display a caption. dim caption as string func caption (newVal as string) endfunc #doc prop hideResults ~If hideResults is set to true, then any data returned from the controller in ~response to executing is not displayed in this object. Additionally, the prefix and ~suffix properties are hidden. If this property is set to false, ~then any data returned by the controller is displayed on the second line along with ~the prefix and suffix properties dim hideResults as boolean func hideResults(newVal as boolean) endfunc #doc prop prefix ~The value defined by prefix will be displayed in front of any response returned ~from the controller. If no prefix is desired, set this property to the empty string (""). dim prefix as string func prefix (newVal as string) endfunc #doc prop suffix ~The value defined by suffix will be displayed following any response returned ~from the controller. If no suffix is desired, set this property to the empty string (""). dim suffix as string func suffix (newVal as string) endfunc dim xJustify as HAlign func xJustify(newVal as HAlign) endfunc dim yJustify as VAlign func yJustify (newVal as VAlign) endfunc dim Tone as _Note #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication #doc prop command ~command defines the command (or series of commands) to execute on the controller ~when this button is pressed. This property can be set to any valid command, or any ~semicolon delimited series of commands. Refer to the Command Reference Manual for your ~controller for a list of valid commands. dim command as string func command (newVal as string) endfunc func StartUp() handles MSG_INIT endfunc endfunc func Draw() handles MSG_DRAW endfunc endfunc handles MSG_SCREEN_PRESS endfunc handles MSG_SCREEN_MOVE endfunc handles MSG_SCREEN_RELEASE endfunc #doc prop executeCommand ~executeCommand exists to provide a programatic interface to this object. Set ~this property to true whenever you wish to execute the command (the same as if you had ~pressed then released this object).

~Note: This property is intended to be write only. Reading this property will always ~return false. It is not necessary to set this property for commands to execute when ~you push this object. It is only available to allow you to write Qlarity program code ~to manually execute this object's command. If you intend to use this object exclusively ~programmatically via the executeCommand property rather than touching the object on the ~touch screen, then it is recommended that you use the GMCCommandExec object instead. dim executeCommand as boolean func ExecuteCommand(newVal as boolean) endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc #doc override Click ~The Click event is called whenever a user touches then releases this object. ~normally, this will cause the command(s) contained in the command property ~to be executed on the controller. If you handle this event, and return false from it, ~however, you can prevent the commands from being sent to the controller. This allows ~you to only run the commands under certain conditions. Also, if you handle this event, ~you can modify the command property to change which command(s) are about to be ~executed on the controller. By default, this event does nothing and returns true. func Click() returns boolean endfunc #doc override ResponseReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications ~This event is triggered after a command has been sent to the controller and a response ~has been received. The paramater response contains the string that the controller ~responded with. You may modify the value of the response property as desired to ~control the display of this object. The object will display whatever is contained ~in the response property after this function executes. By default this event ~does nothing. func ResponseReceived(response as reference to string) endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as reference to string, failReason as GMC_FailureReason) endfunc func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH endfunc func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED endfunc func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE endfunc func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE endfunc func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE endfunc Enddef Define Object type GMCCommandExec #doc object GMCCommandExec ~This object provides a simple interface to execute an arbitray command ~(or series of commands) on your Galil Motion Controller. Unlike the ~GMCCommandDisplay object, this object has no graphical interface. It is ~used to programmatically execute commands on the controller. The ~ResponseReceived event can be used to process any data returned by the ~controller in response to your commands. dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication #doc prop command ~command defines the command (or series of commands) to execute on the controller ~when this button is pressed. This property can be set to any valid command, or any ~semicolon delimited series of commands. Refer to the Command Reference Manual for your ~controller for a list of valid commands. dim command as string func command (newVal as string) endfunc func StartUp() handles MSG_INIT endfunc #doc prop executeCommand ~executeCommand exists to provide a programatic interface to this object. Set ~this property to true whenever you wish to execute the command (the same as if you had ~pressed then released this object).

~Note: This property is intended to be write only. Reading this property will always ~return false. As this object contains no graphical interface, setting the ~executeCommand is the only way to cause this object to execute its command. ~

Handle the ResponseReceived event if you want to process the response ~to this command. dim executeCommand as boolean func ExecuteCommand(newVal as boolean) endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc #doc override ResponseReceived ~This event is triggered after a command has been sent to the controller and a response ~has been received. The paramater response contains the string that the controller ~responded with. By default this event does nothing. func ResponseReceived(response as string) endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as string, failReason as GMC_FailureReason) endfunc func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH endfunc func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED endfunc func ToolDragCreate (parentObj as objref) handles MSG_TOOL_DRAGCREATE endfunc Enddef #endfile #ifnot Galil_mc_src_GMCGauge #option Galil_mc_src_GMCGauge #ifnot gradientconstant$ constant gradient_green_mask := 28 as byte constant gradient_blue_mask := 3 as byte #option gradientconstant$ #endif #ifnot gaugesliderconstant$ enumerate HVorientation as horizontal, vertical #option gaugesliderconstant$ #endif Define Area Object type GMCGauge #ToolImage "FFF0FE16FFF6FF96FFF6FF96FFF6FE16FFF0FF90FFF0FF90FFF0FE10FFF0" '*********************************************************** 'Object: gaugeobj 'Author: J. Cody Stockwell / Jeremy Richards 'Date: 27 May 2004 'Description: a vertical/horizontal bar gauge for visual representation 'Version: 1.52 ' 'Copyright 2004 QSI Corporation 'Permission is granted to copy, distribute and modify this code, 'provided that this copyright statement is preserved. '*********************************************************** #doc object Gauge ~This object implements a flexible bar graph to graphically ~indicate the value of a paramater on the motion controller ~The object supports user-defined start and endpoints and an ~optional color gradient across the length of the bar. library standard source toolmessages library galil_mc source GalilCommunications library galil_mc source GMCAutoScale dim enabled as boolean init enabled := true func enabled(newval as boolean) enable(me, newval) enabled := newval Zenabled(enabled) if scaleObj <> empty then scaleObj.enabled = enabled endif endfunc dim parent as objref init parent := default func parent(newval as objref) attach(me, newval) parent := newval endfunc dim xpos as integer func xpos(newval as integer) xpos := newval precalc() relocate(me, xpos, ypos) endfunc dim ypos as integer func ypos(newval as integer) ypos := newval DoBuddyAttach() precalc() relocate(me, xpos, ypos) endfunc dim width as integer func width(newval as integer) if newval < 0 then width := 0 else width := newval endif precalc() resize(me, width, height) endfunc dim height as integer func height(newval as integer) if newval < 0 then height := 0 else height := newval endif precalc() resize(me, width, height) endfunc dim bgcolor as color init bgcolor := rgb_white func bgcolor(newval as color) bgcolor := newval rerender(me) endfunc dim bordercolor as color init bordercolor := rgb_gray func bordercolor(newval as color) bordercolor := newval rerender(me) endfunc dim transparent as boolean func transparent(newval as boolean) transparent := newval rerender(me) endfunc #doc property StartRange ~On horizontal gauges, this sets the value at the far left of ~gauge. On vertical gauges, this sets the value at the bottom. dim startrange as float init startrange := 0 func startrange(newval as float) startrange := newval if startrange < endrange then if value < startrange then value := startrange elseif value > endrange then value := endrange endif elseif startrange == endrange then endrange := endrange+1 if value < startrange then value := startrange elseif value > endrange then value := endrange endif else if value > startrange then value := startrange elseif value < endrange then value := endrange endif endif precalc() rerender(me) endfunc #doc prop EndRange ~On horizontal gauges, this sets the value at the far right of ~the gauge. On vertical gauges, this sets the value at the top ~of the gauge. dim endrange as float init endrange := 100 func endrange(newval as float) endrange := newval if startrange < endrange then if value < startrange then value := startrange elseif value > endrange then value := endrange endif elseif startrange == endrange then endrange := endrange+1 #if _TOOL tool_persist(endRange) #endif if value < startrange then value := startrange elseif value > endrange then value := endrange endif else if value > startrange then value := startrange elseif value < endrange then value := endrange endif endif precalc() rerender(me) endfunc private dim value as float init value := 100 private func value(newval as float) return 'In this scheme, value is non-settable endfunc private func SetValue(newVal as float) if startrange <= endrange then if newval < startrange then value := startrange elseif newval > endrange then value := endrange else value := newval endif else if newval > startrange then value := startrange elseif newval < endrange then value := endrange else value := newval endif endif calcvaluesandrerender() endfunc private func calcvaluesandrerender() dim i as integer dim j,k as float range=abs(endrange-startrange) if range == 0 then range = 1 endif if direction == horizontal then if mirror == false then filllimit = xpos+(width-2)*abs(value-startrange)/range j=xpos+1 k=xpos+lowsteplength highbands = 0 for i=0 to lowsteps if k >= filllimit then lowbarx0[i] = j lowbarx1[i] = filllimit if filllimit < j then lowbands = i-1 else lowbands = i endif j = j+lowsteplength k = k+highsteplength highbands = -1 break else lowbarx0[i] = j lowbarx1[i] = k j = j+lowsteplength k = k+lowsteplength lowbands = i endif next if highbands == -1 then rerender(me) return endif k=j-1+highsteplength for i=0 to highsteps if k >= filllimit then highbarx0[i] = j highbarx1[i] = filllimit highbands = i break else highbarx0[i] = j highbarx1[i] = k j = j+highsteplength k = k+highsteplength highbands = i endif next else 'mirror == true filllimit = xpos+(width-1)-(width-2)*abs(value-startrange)/range j=xpos+width-2 k=xpos+width-1-lowsteplength highbands = 0 for i=0 to lowsteps if k <= filllimit then lowbarx0[i] = j lowbarx1[i] = filllimit if filllimit > j then lowbands = i-1 else lowbands = i endif j = j-lowsteplength k = k-highsteplength highbands = -1 break else lowbarx0[i] = j lowbarx1[i] = k j = j-lowsteplength k = k-lowsteplength lowbands = i endif next if highbands == -1 then rerender(me) return endif k=j+1-highsteplength for i=0 to highsteps if k <= filllimit then highbarx0[i] = j highbarx1[i] = filllimit highbands = i break else highbarx0[i] = j highbarx1[i] = k j = j-highsteplength k = k-highsteplength highbands = i endif next endif else 'direction == vertical if mirror == false then filllimit = ypos+(height-1)-(height-2)*abs(value-startrange)/range j=ypos+height-2 k=ypos+height-1-lowsteplength highbands = 0 for i=0 to lowsteps if k <= filllimit then lowbary0[i] = j lowbary1[i] = filllimit if filllimit > j then lowbands = i-1 else lowbands = i endif j = j-lowsteplength k = k-highsteplength highbands = -1 break else lowbary0[i] = j lowbary1[i] = k j = j-lowsteplength k = k-lowsteplength lowbands = i endif next if highbands == -1 then rerender(me) return endif k=j+1-highsteplength for i=0 to highsteps if k <= filllimit then highbary0[i] = j highbary1[i] = filllimit highbands = i break else highbary0[i] = j highbary1[i] = k j = j-highsteplength k = k-highsteplength highbands = i endif next else 'mirror == true filllimit = ypos+(height-2)*abs(value-startrange)/range j=ypos+1 k=ypos+lowsteplength highbands = 0 for i=0 to lowsteps if k >= filllimit then lowbary0[i] = j lowbary1[i] = filllimit if filllimit < j then lowbands = i-1 else lowbands = i endif j = j+lowsteplength k = k+highsteplength highbands = -1 break else lowbary0[i] = j lowbary1[i] = k j = j+lowsteplength k = k+lowsteplength lowbands = i endif next if highbands == -1 then rerender(me) return endif k=j-1+highsteplength for i=0 to highsteps if k >= filllimit then highbary0[i] = j highbary1[i] = filllimit highbands = i break else highbary0[i] = j highbary1[i] = k j = j+highsteplength k = k+highsteplength highbands = i endif next endif endif rerender(me) endfunc #doc prop Color1 ~The color displayed near the low end of the gauge (for values ~near startrange). dim color1 as color init color1 := rgb_green func color1(newval as color) color1 := newval colorprecalc() precalc() rerender(me) endfunc #doc prop Color2 ~The color displayed near the middle of the gauge. dim color2 as color init color2 := rgb_yellow func color2(newval as color) color2 := newval colorprecalc() precalc() rerender(me) endfunc #doc prop Color3 ~The color displayed near the high end of the gauge (for values ~near endrange). dim color3 as color init color3 := rgb_red func color3(newval as color) color3 := newval colorprecalc() precalc() rerender(me) endfunc #doc prop Direction ~The direction (HORIZONTAL or VERTICAL) in which the ~gauge grows and shrinks as the value is changed. dim direction as HVorientation func direction(newval as hvorientation) dim i as integer dim j,k as float direction := newval if direction == horizontal then j=ypos+1 k=ypos+height-2 for i=0 to 7 lowbary0[i] = j lowbary1[i] = k next for i=0 to 7 highbary0[i] = j highbary1[i] = k next else j=xpos+1 k=xpos+width-2 for i=0 to 7 lowbarx0[i] = j lowbarx1[i] = k next for i=0 to 7 highbarx0[i] = j highbarx1[i] = k next endif rerender(me) endfunc #doc prop Mirror ~By default, the gauge grows from left to right or bottom to ~top. Setting this property to true will flip the grow directions ~to right, to left and top to bottom as well as reversing the ~startrange/endrange positions. dim mirror as boolean func mirror(newval as boolean) mirror := newval precalc() rerender(me) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty #doc prop inputType ~InputType determines which property of the motion controller will be reflected in the ~gauge. Select an appropriate type from the drop down list. If you need to poll data ~that is not in the dropdown list, then set the customCommand property to query the ~information and useCustomCommand property to true. dim inputType as GMC_DataType init inputType := GMC_Position func inputType(newVal as GMC_DataType) inputType := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc #doc prop inputSource ~If the inputType property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSource property to select which axis to query. dim inputSource as GMC_Axis init inputSource := GMC_Axis_X func inputSource (newVal as GMC_Axis) inputSource := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc private dim command as string #doc prop useCustomCommand ~Set this value to true if you will be using a custom command to poll the controller.

If this ~value is true, then this object will poll the controller using the information in the ~customCommand property rather than the values of the inputType and ~inputSource properties.

If this value is false, then the customCommand ~property is ingored and the inputType and inputSource properties are used instead. dim useCustomCommand as boolean init useCustomCommand := false func useCustomCommand (newVal as boolean) useCustomCommand := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc #doc prop customCommand ~Use this property to send a custom polling command to the controller. You should use this ~property only if you cannot obtain the information you need by using the inputType and ~inputSource properties. The controller should return a single numeric value in decimal ~format in response to the custom command that you define.

Note: The customCommand ~property is ignored unless the useCustomCommand property is set to true. dim customCommand as string init customCommand := "" func CustomCommand (newval as string) customCommand := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer init pollInterval := 1000 func pollInterval (newVal as integer) if newVal <= 0 then pollInterval := 0 UnregisterMsgHandler (me, msg_timetick, 0) else pollInterval := newVal RegisterMsghandler (me, msg_timetick, newVal/20) endif endfunc #doc prop scaleObj ~If you want a scale displayed next to this object, create a GMCAutoScale object, set its ~properties, then set the scaleObj to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObj as objref GMCAutoScale init scaleObj := empty func scaleObj(newVal as GMCAutoScale) if scaleObj <> empty then scaleObj.enabled = false endif scaleObj := newVal DoBuddyAttach() endfunc private dim lowbarx0[8] as integer private dim lowbarx1[8] as integer private dim lowbary0[8] as integer private dim lowbary1[8] as integer private dim highbarx0[8] as integer private dim highbarx1[8] as integer private dim highbary0[8] as integer private dim highbary1[8] as integer private dim objx1 as integer private dim objy1 as integer private dim lowbands as integer private dim highbands as integer private dim lowsteps as integer private dim highsteps as integer private dim lowcolors[] as byte private dim highcolors[] as byte private dim lowlength, highlength as integer private dim lowsteplength, highsteplength as float private dim filllimit as integer private dim range as float func StartUp() handles MSG_INIT endrange(endrange) range=abs(endrange-startrange) calcvaluesandrerender() colorprecalc() precalc() resize(me, width, height) relocate(me, xpos, ypos) enable(me, enabled) attach(me, parent) PollInterval(pollInterval) GMC_VerifyCommObj(commObject) InputType(inputType) endfunc fixed func Draw() handles MSG_DRAW dim i as integer setfgcolor(bordercolor) setbgcolor(bgcolor) settransparent(bgcolor) usetransparent(transparent) drawbox( xpos, ypos, objx1, objy1) for i=0 to lowbands setfgcolor(lowcolors[i]) setbgcolor(lowcolors[i]) drawbox( lowbarx0[i], lowbary0[i], lowbarx1[i], lowbary1[i] ) next for i=0 to highbands setfgcolor(highcolors[i]) setbgcolor(highcolors[i]) drawbox( highbarx0[i], highbary0[i], highbarx1[i], highbary1[i] ) next endfunc #undoc func ColorPrecalc fixed func colorprecalc() calcgradient(color1, color2, lowsteps, lowcolors) calcgradient(color2, color3, highsteps, highcolors) endfunc #undoc func Precalc fixed func precalc() dim i as integer dim j,k as float 'Make sure that our scale is inline with everything else DoBuddyAttach() objx1 = xpos + width-1 objy1 = ypos + height-1 range = abs(endrange-startrange) if range == 0 then range = 1 endif if direction == horizontal then j=ypos+1 k=ypos+height-2 for i=0 to lowsteps lowbary0[i] = j lowbary1[i] = k next for i=0 to highsteps highbary0[i] = j highbary1[i] = k next highlength = (width-2)/2 if (width-2) mod 2 == 1 then lowlength = highlength+1 else lowlength = highlength endif lowsteplength = (lowlength-0.0) / (lowsteps+1) highsteplength = (highlength-0.0) / (highsteps+1) if mirror == false then filllimit = xpos+(width-2)*abs(value-startrange)/range j=xpos+1 k=xpos+lowsteplength highbands = 0 for i=0 to lowsteps if k >= filllimit then lowbarx0[i] = j lowbarx1[i] = filllimit if filllimit < j then lowbands = i-1 else lowbands = i endif j = j+lowsteplength k = k+highsteplength highbands = -1 break else lowbarx0[i] = j lowbarx1[i] = k j = j+lowsteplength k = k+lowsteplength lowbands = i endif next if highbands == -1 then return endif k=j-1+highsteplength for i=0 to highsteps if k >= filllimit then highbarx0[i] = j highbarx1[i] = filllimit highbands = i break else highbarx0[i] = j highbarx1[i] = k j = j+highsteplength k = k+highsteplength highbands = i endif next else 'mirror == true filllimit = xpos+(width-1)-(width-2)*abs(value-startrange)/range j=xpos+width-2 k=xpos+width-1-lowsteplength highbands = 0 for i=0 to lowsteps if k <= filllimit then lowbarx0[i] = j lowbarx1[i] = filllimit if filllimit > j then lowbands = i-1 else lowbands = i endif j = j-lowsteplength k = k-highsteplength highbands = -1 break else lowbarx0[i] = j lowbarx1[i] = k j = j-lowsteplength k = k-lowsteplength lowbands = i endif next if highbands == -1 then return endif k=j+1-highsteplength for i=0 to highsteps if k <= filllimit then highbarx0[i] = j highbarx1[i] = filllimit highbands = i break else highbarx0[i] = j highbarx1[i] = k j = j-highsteplength k = k-highsteplength highbands = i endif next endif else 'direction == vertical j=xpos+1 k=xpos+width-2 for i=0 to lowsteps lowbarx0[i] = j lowbarx1[i] = k next for i=0 to highsteps highbarx0[i] = j highbarx1[i] = k next highlength = (height-2)/2 if (height-2) mod 2 == 1 then lowlength = highlength+1 else lowlength = highlength endif lowsteplength = (lowlength-0.0) / (lowsteps+1) highsteplength = (highlength-0.0) / (highsteps+1) if mirror == false then filllimit = ypos+(height-1)-(height-2)*abs(value-startrange)/range j=ypos+height-2 k=ypos+height-1-lowsteplength highbands = 0 for i=0 to lowsteps if k <= filllimit then lowbary0[i] = j lowbary1[i] = filllimit if filllimit > j then lowbands = i-1 else lowbands = i endif j = j-lowsteplength k = k-highsteplength highbands = -1 break else lowbary0[i] = j lowbary1[i] = k j = j-lowsteplength k = k-lowsteplength lowbands = i endif next if highbands == -1 then return endif k=j+1-highsteplength for i=0 to highsteps if k <= filllimit then highbary0[i] = j highbary1[i] = filllimit highbands = i break else highbary0[i] = j highbary1[i] = k j = j-highsteplength k = k-highsteplength highbands = i endif next else 'mirror == true filllimit = ypos+(height-2)*abs(value-startrange)/range j=ypos+1 k=ypos+lowsteplength highbands = 0 for i=0 to lowsteps if k >= filllimit then lowbary0[i] = j lowbary1[i] = filllimit if filllimit < j then lowbands = i-1 else lowbands = i endif j = j+lowsteplength k = k+highsteplength highbands = -1 break else lowbary0[i] = j lowbary1[i] = k j = j+lowsteplength k = k+lowsteplength lowbands = i endif next if highbands == -1 then return endif k=j-1+highsteplength for i=0 to highsteps if k >= filllimit then highbary0[i] = j highbary1[i] = filllimit highbands = i break else highbary0[i] = j highbary1[i] = k j = j+highsteplength k = k+highsteplength highbands = i endif next endif endif endfunc #undoc func abs fixed func abs( newval as float ) returns float if newval < 0 then return -newval else return newval endif endfunc #undoc func calcgradient fixed func calcgradient( color0 as color, color1 as color, steps as reference to integer, bandcolors[] as reference to byte ) dim i as integer dim rsteps as integer dim gsteps as integer dim bsteps as integer dim rstep as integer dim gstep as integer dim bstep as integer ' / 1 converts a byte to an integer ' the following lines determine significant steps between the two colors in each of the color channels rsteps= (color1 / 32) / 1 - (color0 / 32) / 1 gsteps= (color1 & gradient_green_mask) / 4 - (color0 & gradient_green_mask) / 4 bsteps= (color1 & gradient_blue_mask) / 1 - (color0 & gradient_blue_mask) / 1 'we determine the number of gradient steps by the maximum color channel steps = abs(rsteps) if steps < abs(gsteps) then steps = abs(gsteps) endif if steps < abs(bsteps) then steps = abs(bsteps) endif redim(bandcolors, steps+1) ' dividing/multiplying by 1.0 or adding/subtracting 0.0 converts to a float ' here we determine based on the number of steps how much we add or subtract to each channel on each pass for i = 0 to steps if rsteps < 0 then rstep = i*rsteps*1.0/steps - 0.5 rstep = rstep * 32 elseif rsteps > 0 then rstep = i*rsteps*1.0/steps + 0.5 rstep = rstep * 32 else rstep = 0 endif if gsteps < 0 then gstep = i*gsteps*1.0/steps - 0.5 gstep = gstep * 4 elseif gsteps > 0 then gstep = i*gsteps*1.0/steps + 0.5 gstep = gstep * 4 else gstep = 0 endif if bsteps < 0 then bstep = i*bsteps*1.0/steps - 0.5 elseif bsteps > 0 then bstep = i*bsteps*1.0/steps + 0.5 else bstep = 0 endif bandcolors[i] = color0 + rstep + gstep + bstep next endfunc '----------------------------------------------------------------------------------------- 'The actual communications stuff private func Timetick () handles MSG_TIMETICK commObject.SendAsciiCommandStreamCounted(command, me, 0, 1) return endfunc private func Zenabled (status as boolean) handles MSG_ZENABLED if status and enabled then TimeTick() endif endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess dim tmpValue as float check error val(tmpValue, trim(commObject.curResponse)) on error tmpValue := startrange GMC_ClearException() enderr ResponseReceived(tmpValue) if tmpValue <> value then SetValue(tmpValue) endif Rerender(me) return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure ResponseFailure(trim(commObject.curResponse), commObject.curFailureReason) return true endfunc #doc override ResponseReceived #param response:The response received from the controller as a floating point value. Change response, if necessary, to translate the final value shown in the gauge ~This event called whenever this object receives receives a response from the controller as a ~result of a poll. The paramater response contains the value that was returned from ~the controller. You may modify response in order to change the final value which ~will be displayed in this object. func ResponseReceived (response as reference to float) return endfunc #doc override ResponseFailure #param responseText:The response returned by the controller minus the final colon terminator. #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered whenever the controller fails to respond to a command or responds in ~an incorrect manner. Add any necessary error handling code in this event. func ResponseFailure(responseText as string, failReason as GMC_FailureReason) return endfunc 'The rest of these functions add functionality to Qlarity Foundry. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in Qlarity Foundry. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by Qlarity Foundry, when you change the attachment 'of an object (i.e. in response to dragging it around the object tree). 'Note: the purpose of this function is to allow you to attach to another 'container, you should not change your parent property or call Tool_Persist 'until you receive a MSG_TOOL_ATTACHED. A MSG_TOOL_ATTACHED will be sent 'in response to an Attach API function call. func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH Attach (me, attachTo) endfunc 'This function is called in response to calling Attach (primarily in a 'handler for MSG_TOOL_ATTACH, but possibly in other places as well_. func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED 'Set our parent property to reflect who we are attached to and save parent := newParent Tool_Persist (parent) 'Save parent DoBuddyAttach() endfunc 'This function is called when the user drags an object instance with the 'mouse in QlarityFoundry. dx and dy are relative offsets from the current 'location of the object func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE xPos := xPos + dx yPos := yPos + dy Relocate (me, xPos, yPos) 'Save the changes we just made Tool_Persist (xPos) Tool_Persist (yPos) precalc() rerender(me) endfunc 'This function is called by Qlarity Foundry to obtain the coordinates of 'the resize grips. The arrays xCoords, yCoords, and cursors all contain 0 'elements initially. This means that you should either call redim on those 'arrays and set their values, or declare local arrays, set the values of 'the local arrays, and then assign xCoords, yCoords and cursors to those 'local arrays. Closed indicates whether the Foundry should connect the 'first and last grips to make a closed object. xCoords, yCoords, and 'cursors should all contain the same number of elements when this function 'completes func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolGetHandles (xCoords, yCoords, cursors, closed, xPos, yPos, width, height) endfunc 'This function is called in response to a user moving a resize grip within 'Qlarity Foundry. handleNum is the index into the arrays that were returned 'by the handler for MSG_TOOL_GETHANDLES. You should return true from this 'function func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolMoveHandle (handleNum, dx, dy, xPos, yPos, width, height, me) precalc() endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. (x1, y1) are the coordinates that the user started his 'drag and (x2, y2) are the coordinates that the mouse was released func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolDragCreate (parentObj, x1, y1, x2, y2, xPos, yPos, width, height, parent) if width < height then direction := vertical endif tool_persist(direction) 'Call our MSG_INIT handler StartUp() endfunc #endif private func ScaleResize(newLeng as integer) returns boolean handles AutoScale_ResizeRequest if (GMC_BuddyRequest == scaleObj) then newLeng = newLeng + 2 if direction ==horizontal then if newLeng <> width then width = newLeng #if _tool tool_persist(width) #endif endif else if newLeng <> height then height = newLeng #if _tool tool_persist(height) #endif endif endif endif return true endfunc private func BuddyReinit(parm as integer) returns boolean handles AutoScale_BuddyReinit if (scaleObj == GMC_BuddyRequest) and initialAttachRequest then DoBuddyAttach() return true endif return false endfunc private dim initialAttachRequest as boolean private func DoBuddyAttach() if scaleObj <> empty then initialAttachRequest := true if not mirror then if direction == horizontal then scaleObj.AttachTo (xPos+1, yPos, xPos+width-2, yPos+height-1, startRange, -> endRange, direction==horizontal, me, parent, enabled) else scaleObj.AttachTo (xPos, yPos+1, xPos+width-1, yPos+height-2, endRange, -> startRange, direction==horizontal, me, parent, enabled) endif else if direction == horizontal then scaleObj.AttachTo (xPos+1, yPos, xPos+width-2, yPos+height-1, endRange, -> startRange, direction==horizontal, me, parent, enabled) else scaleObj.AttachTo (xPos, yPos+1, xPos+width-1, yPos+height-2, startRange, -> endRange, direction==horizontal, me, parent, enabled) endif endif endif endfunc Enddef #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œ˜žŠ˜š dtd˜ž“–“ ’œ Œœ ˜’œ˜žŠ˜š d dTe˜ž›–š‘‹œ‘Œ‹ž‘‹Û dàD}˜ž›–š‘‹ ˜šš‘ ’žŒ”ÐD > dàD}˜ž›–š‘‹ “Šš ’žŒ”ÐD > dtd˜ž›–š‘‹œ‘Œ‹ž‘‹Û d d d d Te ˜žŠ˜šŒ“–›šœ‘Œ‹ž‘‹Û d d } —‰–š‘‹ž‹–‘ÐD } —–…‘‹ž“À } ‰š‹–œž“ d td ˜žŠ˜šŒ“–›šœ‘Œ‹ž‘‹Û d  d d K K K @K } ˜’œ˜žŠ˜š d@dC<¹¹¹Ï¹ºÎɹ¹¹É¹¹ÆÉ¹¹¹É¹¹ÆÉ¹¹¹É¹ºÎɹ¹¹Ï¹¹ÆÏ¹¹¹Ï¹¹ÆÏ¹¹¹Ï¹ºÎϹ¹¹Ï d d d d d d d d d d d d d d d d d d d!Àd!}!Œ‹ž‘›ž›Ðd!}! ‹“’šŒŒž˜šŒ d"Àd"}"˜ž“–“ ’œÐd"}"˜ž“–“œ’’Š‘–œž‹–‘Œ d#Àd#}#˜ž“–“ ’œÐd#}# ˜’œžŠ‹Œœž“š d$ d%ÀD%}%š‘ž“š›ÐD%°>% d&ðD&}&š‘ž“š›&1& d'€W'}'š‘ž“š›€'}'‘šˆ‰ž“ÐD'°>'' d(}(š‘ž“š€(à^(À(}(‘šˆ‰ž“( d)})š‘ž“š›)})‘šˆ‰ž“ d*}*…š‘ž“š›€*}*š‘ž“š›* d+^+}+Œœž“š•à+}+š’‹†^+ d,},Œœž“š•à,},š‘ž“š›Ð,},š‘ž“š› d-@^- d.ÐW. d/ d0ÀD0}0žš‘‹ÐD0à>0 d1ðD1}1žš‘‹1P1 d2€W2}2žš‘‹€2}2‘šˆ‰ž“ÐD2à>22 d3}3ž‹‹žœ—€3à^3À3}3‘šˆ‰ž“3 d4}4žš‘‹4}4‘šˆ‰ž“ d5ÐW5 d6 d7ÀD7}7‡ŒÐD7€>7 d8€W8}8‡Œ€8}8‘šˆ‰ž“ÐD8€>88 d9}9‡Œ9}9‘šˆ‰ž“ d:}:šœž“œ€:: d;};š“œž‹š€;à^;À;};‡ŒÀ;};†Œ; d<ÐW< d= d>ÀD>}>†ŒÐD>€>> d?€W?}?†Œ€?}?‘šˆ‰ž“ÐD?€>?? d@}@†Œ@}@‘šˆ‰ž“ dA}A ›Š››†ž‹‹žœ—€AA dB}Bšœž“œ€BB dC}Cš“œž‹š€Cà^CÀC}C‡ŒÀC}C†ŒC dDÐWD dE dFÀDF}Fˆ–›‹—ÐDF€>F dG€WG}Gˆ–›‹—€G}G‘šˆ‰ž“ÐDG€>GG dH^H}H‘šˆ‰ž“ÀHH^H dI}Iˆ–›‹—II dJ0^J dK}Kˆ–›‹—K}K‘šˆ‰ž“ dL@^L dM}Mšœž“œ€MM dN}NšŒ–…š€Nà^NÀN}Nˆ–›‹—ÀN}N—š–˜—‹N dOÐWO dP dQÀDQ}Q—š–˜—‹ÐDQ€>Q dR€WR}R—š–˜—‹€R}R‘šˆ‰ž“ÐDR€>RR dS^S}S‘šˆ‰ž“ÀSS^S dT}T—š–˜—‹TT dU0^U dV}V—š–˜—‹V}V‘šˆ‰ž“ dW@^W dX}Xšœž“œ€XX dY}YšŒ–…š€Yà^YÀY}Yˆ–›‹—ÀY}Y—š–˜—‹Y dZÐWZ d[ d\ÀD\}\˜œ“ÐD\ð>\ d]ðD]}]˜œ“]}] ˜ ˆ—–‹š d^€W^}^˜œ“€^}^‘šˆ‰ž“ÐD^ð>^^ d_}_˜œ“_}_‘šˆ‰ž“ d`}`šš‘›š€`à^`` daÐWa db dcÀDc}c ›šœ“ÐDcð>c ddðDd}d ›šœ“d}d˜ ˜ž† de€We}e ›šœ“€e}e‘šˆ‰ž“ÐDeð>ee df}f ›šœ“f}f‘šˆ‰ž“ dg}gšš‘›š€gà^gg dhÐWh di djÀDj}j ‹ž‘Œžš‘‹ÐDj°>j dk€Wk}k ‹ž‘Œžš‘‹€k}k‘šˆ‰ž“ÐDk°>kk dl}l ‹ž‘Œžš‘‹l}l‘šˆ‰ž“ dm}mšš‘›š€mà^mm dnÐWn do dp dq dr dsÀDs}s Œ‹ž‹ž‘˜šÐDs>s dtðDt}t Œ‹ž‹ž‘˜štt du€Wu}u Œ‹ž‹ž‘˜š€u}u‘šˆ‰ž“ÐDu>uu dv}v Œ‹ž‹ž‘˜šv}v‘šˆ‰ž“ dw^w}w Œ‹ž‹ž‘˜šÀw}wš‘›ž‘˜š^w dx^x}x‰ž“ŠšÀx}x Œ‹ž‹ž‘˜š^x dy}y‰ž“Ššy}y Œ‹ž‹ž‘˜š dz ^z}z‰ž“Ššàz}zš‘›ž‘˜š^z d{}{‰ž“Šš{}{š‘›ž‘˜š d|@^| d} ^}}} Œ‹ž‹ž‘˜šÐ}}}š‘›ž‘˜š^} d~}~š‘›ž‘˜š~}~š‘›ž‘˜š°~~ d^}‰ž“ŠšÀ} Œ‹ž‹ž‘˜š^ d€}€‰ž“Šš€}€ Œ‹ž‹ž‘˜š d ^}‰ž“Ššà}š‘›ž‘˜š^ d‚}‚‰ž“Šš‚}‚š‘›ž‘˜š dƒ@^ƒ d„0^„ d…^…}…‰ž“Ššà…}… Œ‹ž‹ž‘˜š^… d†}†‰ž“Šš†}† Œ‹ž‹ž‘˜š d‡ ^‡}‡‰ž“ŠšÀ‡}‡š‘›ž‘˜š^‡ dˆ}ˆ‰ž“Ššˆ}ˆš‘›ž‘˜š d‰@^‰ dŠ@^Š d‹}‹šœž“œ€‹‹ dŒ}Œšš‘›š€Œà^ŒŒ dÐW dŽ d d d‘ d’ d“ÀD“}“š‘›ž‘˜šÐD“>“ d”ðD”}”š‘›ž‘˜š””d d•€W•}•š‘›ž‘˜š€•}•‘šˆ‰ž“ÐD•>•• d–}–š‘›ž‘˜š–}–‘šˆ‰ž“ d—^—}— Œ‹ž‹ž‘˜šÀ—}—š‘›ž‘˜š^— d˜^˜}˜‰ž“ŠšÀ˜}˜ Œ‹ž‹ž‘˜š^˜ d™}™‰ž“Šš™}™ Œ‹ž‹ž‘˜š dš ^š}š‰ž“Ššàš}šš‘›ž‘˜š^š d›}›‰ž“Šš›}›š‘›ž‘˜š dœ@^œ d ^} Œ‹ž‹ž‘˜šÐ}š‘›ž‘˜š^ dž}žš‘›ž‘˜šž}žš‘›ž‘˜š°žž dŸ„dŸ ‹“}Ÿ ‹“ šŒ–Œ‹€Ÿ}Ÿš‘›ž‘˜šŸ dŸ d ^ } ‰ž“ŠšÀ }  Œ‹ž‹ž‘˜š^  d¡}¡‰ž“Šš¡}¡ Œ‹ž‹ž‘˜š d¢ ^¢}¢‰ž“Ššà¢}¢š‘›ž‘˜š^¢ d£}£‰ž“Šš£}£š‘›ž‘˜š d€@^€ d¥0^¥ dŠ^Š}Љž“ŠšàŠ}Š Œ‹ž‹ž‘˜š^Š d§}§‰ž“Šš§}§ Œ‹ž‹ž‘˜š dš ^š}š‰ž“ŠšÀš}šš‘›ž‘˜š^š d©}©‰ž“Šš©}©š‘›ž‘˜š dª@^ª d«@^« d¬}¬šœž“œ€¬¬ d­}­šš‘›š€­à^­­ d®ÐW® d¯ d°`K°ÀD°}°‰ž“ŠšÐD°>° d±ðD±}±‰ž“Šš±±d d²`K²€W²}²‰ž“Šš€²}²‘šˆ‰ž“ÐD²>²² d³ð^³ dŽÐWŽ dµ d¶`K¶€W¶}¶Œš‹‰ž“Šš€¶}¶‘šˆ‰ž“ÐD¶>¶¶ d·^·}· Œ‹ž‹ž‘˜š·}·š‘›ž‘˜š^· dž^ž}ž‘šˆ‰ž“Àž}ž Œ‹ž‹ž‘˜š^ž d¹}¹‰ž“Šš¹}¹ Œ‹ž‹ž‘˜š dº ^º}º‘šˆ‰ž“àº}ºš‘›ž‘˜š^º d»}»‰ž“Šš»}»š‘›ž‘˜š dŒ0^Œ dœ}œ‰ž“Ššœ}œ‘šˆ‰ž“ dŸ@^Ÿ d¿0^¿ dÀ^À}À‘šˆ‰ž“àÀ}À Œ‹ž‹ž‘˜š^À dÁ}Á‰ž“ŠšÁ}Á Œ‹ž‹ž‘˜š d ^Â}Â‘šˆ‰ž“ÀÂ}š‘›ž‘˜š^ dÃ}Éž“ŠšÃ}Ú‘›ž‘˜š dÄ0^Ä dÅ}ʼnž“ŠšÅ}Å‘šˆ‰ž“ dÆ@^Æ dÇ@^Ç dÈ}Èœž“œ‰ž“ŠšŒž‘›šš‘›š€ȐÈ dÉÐWÉ dÊ dË`KˀWË}Ëœž“œ‰ž“ŠšŒž‘›šš‘›š€ːË dÌÀDÌ}Ì–ÐD̀>Ì dÍÀDÍ}Í•ÀÍ}Í”ÐD͐>Í dÎ dÏ}ύž‘˜šÐÏ}ÏžŒ€Ï}Ïš‘›ž‘˜šÐÏ}Ï Œ‹ž‹ž‘˜šÏ dÐ^Ð}Ѝž‘˜šÐÐÐ^Ð dÑ}эž‘˜šÐÑÑ dÒ@^Ò dÓ dÔ^Ô}Ô ›–šœ‹–‘ÐÔ}Ô —–…‘‹ž“^Ô dÕ^Õ}Õ’–ÐÕAÕ^Õ dÖ}Ö ™–“““–’–‹ÐÖ}Ö‡Œ°րÖ}Öˆ–›‹—ÐÖ֐֠Ö}ÖžŒ€Ö}Ö‰ž“ŠšÐÖ}Ö Œ‹ž‹ž‘˜šÖðÖ}֍ž‘˜š d× dØ}Ø•ÐØ}؇Œ°ØØ dÙ}Ù”ÐÙ}Ù‡Œ°Ù}Ù “ˆŒ‹š“š‘˜‹— dÚ}Ú —–˜—ž‘›ŒÐÚÚ dÛP^Û}Û–ÐÛÛ WÛ}Û“ˆŒ‹šŒ dÜ^Ü}Ü”ðÜ}Ü ™–“““–’–‹^Ü dÝ}Ý“ˆž‡Ï°Ý}Ý–ÐÝÐÝ}Ý• dÞ}Þ“ˆž‡Î°Þ}Þ–ÐÞÐÞ}Þ ™–“““–’–‹ dß dà^à}à ™–“““–’–‹Àà}à•^à dá}ᓐˆž‘›ŒÐá}á–Ðáá dâ0^â dã}㓐ˆž‘›ŒÐã}ã– dä@^ä då dæ}æ•Ðæ}æ•°æ}æ “ˆŒ‹š“š‘˜‹— dç}ç”Ðç}ç”°ç}ç—–˜—Œ‹š“š‘˜‹— dè}è —–˜—ž‘›ŒÐèÐèè déÀ]é dê0^ê dë}듐ˆž‡Ï°ë}ë–ÐëÐë}ë• dì}쓐ˆž‡Î°ì}ì–ÐìÐì}ì” dí dî}î•Ðî}î•°î}î “ˆŒ‹š“š‘˜‹— dï}ï”Ðï}ï”°ï}ï “ˆŒ‹š“š‘˜‹— dð}𓐈ž‘›ŒÐð}ð– dñ@^ñ dò`^ò dó dô^ô}ô —–˜—ž‘›ŒÐôÐôô^ô dõ}õšš‘›š€õà^õõ döð^ö d÷@^÷ dø dù}ù”Ðù}ù•Ðùù°ù}ù—–˜—Œ‹š“š‘˜‹— dúP^ú}ú–Ðúú Wú}ú —–˜—Œ‹šŒ dû^û}û”ðû}û ™–“““–’–‹^û dü}ü —–˜—ž‡Ï°ü}ü–ÐüÐü}ü• dý}ý —–˜—ž‡Î°ý}ý–ÐýÐý}ý ™–“““–’–‹ dþ}þ —–˜—ž‘›ŒÐþ}þ– dÿÀ]ÿ d0^ d} —–˜—ž‡Ï°}–ÐÐ}• d} —–˜—ž‡Î°}–ÐÐ}” d d}•Ð}•°}—–˜—Œ‹š“š‘˜‹— d}”Ð}”°}—–˜—Œ‹š“š‘˜‹— d} —–˜—ž‘›ŒÐ}– d@^ d`^ d 0^  d }  ™–“““–’–‹Ð } ‡Œ° € } ˆ–›‹—Ð   Ð € } ˆ–›‹—Ð     } žŒ€ } ‰ž“ŠšÐ }  Œ‹ž‹ž‘˜š ð } ž‘˜š d  d } •Ð } ‡Œ° } ˆ–›‹—Ð   d } ”Ð } ‡Œ° } ˆ–›‹—Ð  Ð }  “ˆŒ‹š“š‘˜‹— d} —–˜—ž‘›ŒÐ dP^}–РW}“ˆŒ‹šŒ d^}”} ™–“““–’–‹^ d}“ˆž‡Ï°}–ÐÐ}• d}“ˆž‡Î°}–ÐÐ} ™–“““–’–‹ d d^} ™–“““–’–‹à}•^ d}“ˆž‘›ŒÐ}–Ð d0^ d}“ˆž‘›ŒÐ}– d@^ d d}•Ð}•Ð} “ˆŒ‹š“š‘˜‹— d}”Ð}”Ð}—–˜—Œ‹š“š‘˜‹— d} —–˜—ž‘›ŒÐÐ dÀ] d0^ d}“ˆž‡Ï°}–ÐÐ}• d } “ˆž‡Î° } –Ð Ð } ” d! d"}"•Ð"}"•Ð"}" “ˆŒ‹š“š‘˜‹— d#}#”Ð#}#”Ð#}# “ˆŒ‹š“š‘˜‹— d$}$“ˆž‘›ŒÐ$}$– d%@^% d&`^& d' d(^(}( —–˜—ž‘›ŒÐ(Ð((^( d)})šš‘›š€)à^)) d*ð^* d+@^+ d, d-}-”Ð-}-•°--Ð-}-—–˜—Œ‹š“š‘˜‹— d.P^.}.–Ð.. W.}. —–˜—Œ‹šŒ d/^/}/”/}/ ™–“““–’–‹^/ d0}0 —–˜—ž‡Ï°0}0–Ð0Ð0}0• d1}1 —–˜—ž‡Î°1}1–Ð1Ð1}1 ™–“““–’–‹ d2}2 —–˜—ž‘›ŒÐ2}2– d3À]3 d40^4 d5}5 —–˜—ž‡Ï°5}5–Ð5Ð5}5• d6}6 —–˜—ž‡Î°6}6–Ð6Ð6}6” d7 d8}8•Ð8}8•Ð8}8—–˜—Œ‹š“š‘˜‹— d9}9”Ð9}9”Ð9}9—–˜—Œ‹š“š‘˜‹— d:}: —–˜—ž‘›ŒÐ:}:– d;@^; d<`^< d=@^= d>0^> d?^?}?’–Ð?A?^? d@}@ ™–“““–’–‹Ð@}@†Œ°@€@}@—š–˜—‹Ð@@@Ð@€@}@—š–˜—‹Ð@@@ @}@žŒ€@}@‰ž“ŠšÐ@}@ Œ‹ž‹ž‘˜š@ð@}@ž‘˜š dA dB}B•ÐB}B†Œ°B}B—š–˜—‹ÐBB dC}C”ÐC}C†Œ°C}C—š–˜—‹ÐCCÐC}C “ˆŒ‹š“š‘˜‹— dD}D —–˜—ž‘›ŒÐDD dEP^E}E–ÐEE WE}E“ˆŒ‹šŒ dF^F}F”F}F ™–“““–’–‹^F dG}G“ˆž†Ï°G}G–ÐGÐG}G• dH}H“ˆž†Î°H}H–ÐHÐH}H ™–“““–’–‹ dI dJ^J}J ™–“““–’–‹àJ}J•^J dK}K“ˆž‘›ŒÐK}K–ÐKK dL0^L dM}M“ˆž‘›ŒÐM}M– dN@^N dO dP}P•ÐP}P•ÐP}P “ˆŒ‹š“š‘˜‹— dQ}Q”ÐQ}Q”ÐQ}Q—–˜—Œ‹š“š‘˜‹— dR}R —–˜—ž‘›ŒÐRÐRR dSÀ]S dT0^T dU}U“ˆž†Ï°U}U–ÐUÐU}U• dV}V“ˆž†Î°V}V–ÐVÐV}V” dW dX}X•ÐX}X•ÐX}X “ˆŒ‹š“š‘˜‹— dY}Y”ÐY}Y”ÐY}Y “ˆŒ‹š“š‘˜‹— dZ}Z“ˆž‘›ŒÐZ}Z– d[@^[ d\`^\ d] d^^^}^ —–˜—ž‘›ŒÐ^Ð^^^^ d_}_šš‘›š€_à^__ d`ð^` da@^a db dc}c”Ðc}c•°ccÐc}c—–˜—Œ‹š“š‘˜‹— ddP^d}d–Ðdd Wd}d —–˜—Œ‹šŒ de^e}e”e}e ™–“““–’–‹^e df}f —–˜—ž†Ï°f}f–ÐfÐf}f• dg}g —–˜—ž†Î°g}g–ÐgÐg}g ™–“““–’–‹ dh}h —–˜—ž‘›ŒÐh}h– diÀ]i dj0^j dk}k —–˜—ž†Ï°k}k–ÐkÐk}k• dl}l —–˜—ž†Î°l}l–ÐlÐl}l” dm dn}n•Ðn}n•Ðn}n—–˜—Œ‹š“š‘˜‹— do}o”Ðo}o”Ðo}o—–˜—Œ‹š“š‘˜‹— dp}p —–˜—ž‘›ŒÐp}p– dq@^q dr`^r ds0^s dt}t ™–“““–’–‹Ðt}t†Œ°t€t}t—š–˜—‹Ðttt t}tžŒ€t}t‰ž“ŠšÐt}t Œ‹ž‹ž‘˜štðt}tž‘˜š du dv}v•Ðv}v†Œ°vv dw}w”Ðw}w†Œ°w}w “ˆŒ‹š“š‘˜‹— dx}x —–˜—ž‘›ŒÐxx dyP^y}y–Ðyy Wy}y“ˆŒ‹šŒ dz^z}z”ðz}z ™–“““–’–‹^z d{}{“ˆž†Ï°{}{–Ð{Ð{}{• d|}|“ˆž†Î°|}|–Ð|Ð|}| ™–“““–’–‹ d} d~^~}~ ™–“““–’–‹À~}~•^~ d}“ˆž‘›ŒÐ}–Ð d€0^€ d}“ˆž‘›ŒÐ}– d‚@^‚ dƒ d„}„•Є}„•°„}„ “ˆŒ‹š“š‘˜‹— d…}…”Ð…}…”°…}…—–˜—Œ‹š“š‘˜‹— d†}† —–˜—ž‘›ŒÐ†Ð†† d‡À]‡ dˆ0^ˆ d‰}‰“ˆž†Ï°‰}‰–ЉЉ}‰• dŠ}Š“ˆž†Î°Š}Š–ÐŠÐŠ}Š” d‹ dŒ}Œ•ÐŒ}Œ•°Œ}Œ “ˆŒ‹š“š‘˜‹— d}”Ѝ}”°} “ˆŒ‹š“š‘˜‹— dŽ}Ž“ˆž‘›ŒÐŽ}Ž– d@^ d`^ d‘ d’^’}’ —–˜—ž‘›ŒÐ’Ð’’^’ d“}“šš‘›š€“à^““ d”ð^” d•@^• d– d—}—”З}—•З—°—}——–˜—Œ‹š“š‘˜‹— d˜P^˜}˜–И˜ W˜}˜ —–˜—Œ‹šŒ d™^™}™”ð™}™ ™–“““–’–‹^™ dš}š —–˜—ž†Ï°š}š–КК}š• d›}› —–˜—ž†Î°›}›–ЛЛ}› ™–“““–’–‹ dœ}œ —–˜—ž‘›ŒÐœ}œ– dÀ] dž0^ž dŸ}Ÿ —–˜—ž†Ï°Ÿ}Ÿ–ПП}Ÿ• d }  —–˜—ž†Î° } –РР} ” d¡ d¢}¢•Т}¢•°¢}¢—–˜—Œ‹š“š‘˜‹— d£}£”У}£”°£}£—–˜—Œ‹š“š‘˜‹— d€}€ —–˜—ž‘›ŒÐ€}€– d¥@^¥ dŠ`^Š d§@^§ dš@^š d©}©šš‘›š€©à^©© dªÐWª d« d¬ d­ d® d¯ÀD¯}¯œ“ÎÐD¯ð>¯ d°ðD°}°œ“Î°}° ˜ ˜šš‘ d±€W±}±œ“Î€±}±‘šˆ‰ž“ÐD±ð>±± d²}²œ“Î²}²‘šˆ‰ž“ d³}³ œ“šœž“œ€³³ dŽ}Žšœž“œ€ŽŽ dµ}µšš‘›š€µà^µµ d¶ÐW¶ d· dž d¹ dºÀDº}ºœ“ÍÐDºð>º d»ðD»}»œ“Í»}» ˜ †š““ˆ dŒ€WŒ}Œœ“Í€Œ}Œ‘šˆ‰ž“ÐDŒð>ŒŒ dœ}œœ“Íœ}œ‘šˆ‰ž“ dŸ}Ÿ œ“šœž“œ€ŸŸ d¿}¿šœž“œ€¿¿ dÀ}Àšš‘›š€Àà^ÀÀ dÁÐWÁ d dà dÄ dÅ dÆÀDÆ}Æœ“ÌÐDÆð>Æ dÇðDÇ}Çœ“ÌÇ}Ǎ˜ š› dÈ€WÈ}Èœ“Ì€È}È‘šˆ‰ž“ÐDÈð>ÈÈ dÉ}Éœ“ÌÉ}É‘šˆ‰ž“ dÊ}Ê œ“šœž“œ€ÊÊ dË}ˏšœž“œ€ËË dÌ}Ìšš‘›š€Ìà^ÌÌ dÍÐWÍ dÎ dÏ dÐ dÑ dÒÀDÒ}Ò ›–šœ‹–‘ÐDÒ}Ò —‰–š‘‹ž‹–‘ dÓ€WÓ}Ó ›–šœ‹–‘€Ó}Ó‘šˆ‰ž“ÐDÓ}Ó —‰–š‘‹ž‹–‘Ó dÔÀDÔ}Ô–ÐDÔ€>Ô dÕÀDÕ}Õ•ÀÕ}Õ”ÐDՐ>Õ dÖ d×}× ›–šœ‹–‘×}×‘šˆ‰ž“ dØ^Ø}Ø ›–šœ‹–‘ÐØ}Ø —–…‘‹ž“^Ø dÙ}Ù•ÐÙ}Ù†Œ°ÙÙ dÚ}Ú”ÐÚ}Ú†Œ°Ú}Ú—š–˜—‹ÐÚÚ dÛP^Û}Û–ÐÛÛ WÛÛ dÜ}Ü“ˆž†Ï°Ü}Ü–ÐÜÐÜ}Ü• dÝ}Ý“ˆž†Î°Ý}Ý–ÐÝÐÝ}Ý” dÞ`^Þ dßP^ß}ß–Ðßß Wßß dà}à —–˜—ž†Ï°à}à–ÐàÐà}à• dá}á —–˜—ž†Î°á}á–ÐáÐá}á” dâ`^â dã0^ã dä}ä•Ðä}䇏Œ°ää då}å”Ðå}减Œ°å}刖›‹—Ðåå dæP^æ}æ–Ðææ Wææ dç}瓐ˆž‡Ï°ç}ç–ÐçÐç}ç• dè}蓐ˆž‡Î°è}è–ÐèÐè}è” dé`^é dêP^ê}ê–Ðêê Wêê dë}ë —–˜—ž‡Ï°ë}ë–ÐëÐë}ë• dì}ì —–˜—ž‡Î°ì}ì–ÐìÐì}ì” dí`^í dî@^î dï dð}ðšš‘›š€ðà^ðð dñÐWñ dò dó dô dõ dö d÷ døÀDø}ø’–ÐDø°>ø dù€Wù}ù’–€ù}ù‘šˆ‰ž“ÐDù°>ùù dú}ú’–ú}ú‘šˆ‰ž“ dû}ûšœž“œ€ûû dü}üšš‘›š€üà^üü dýÐWý dþ dÿ d d d d d d dÀD} œ’’•šœ‹ÐDà>}˜ž“–“œ’’Š‘–œž‹–‘ dðD} œ’’•šœ‹}š’‹† d d  d  d  d  d  dÀD} –‘Š‹‹†šÐD} ˜’œ ›ž‹ž‹†š dðD} –‘Š‹‹†š} ˜’œ Œ–‹–‘ d€W} –‘Š‹‹†š€}‘šˆ‰ž“ÐD} ˜’œ ›ž‹ž‹†š d} –‘Š‹‹†š}‘šˆ‰ž“ d}œ’’ž‘›}˜’œ›ž‹ž‹†š‹œ’’ž‘›€} –‘Š‹‹†šÀ} –‘Š‹ŒŠœšÀ}ŠŒšœŠŒ‹’œ’’ž‘›À} œŠŒ‹’œ’’ž‘› dÐW d d d d dÀD} –‘Š‹ŒŠœšÐD}˜’œ ž‡–Œ dðD} –‘Š‹ŒŠœš} ˜’œ ž‡–Œ ‡ d€W} –‘Š‹ŒŠœš€}‘šˆ‰ž“ÐD}˜’œ ž‡–Œ d} –‘Š‹ŒŠœš}‘šˆ‰ž“ d}œ’’ž‘›}˜’œ›ž‹ž‹†š‹œ’’ž‘›€} –‘Š‹‹†šÀ} –‘Š‹ŒŠœšÀ}ŠŒšœŠŒ‹’œ’’ž‘›À} œŠŒ‹’œ’’ž‘› dÐW d`KÀD}œ’’ž‘›ÐDÀ> d d  d! d" d# d$ d% d&ÀD&}&ŠŒšœŠŒ‹’œ’’ž‘›ÐD&°>& d'ðD'}'ŠŒšœŠŒ‹’œ’’ž‘›'A' d(€W(}(ŠŒšœŠŒ‹’œ’’ž‘›€(}(‘šˆ‰ž“ÐD(°>(( d)})ŠŒšœŠŒ‹’œ’’ž‘›)})‘šˆ‰ž“ d*}*œ’’ž‘›*}*˜’œ›ž‹ž‹†š‹œ’’ž‘›€*}* –‘Š‹‹†šÀ*}* –‘Š‹ŒŠœšÀ*}*ŠŒšœŠŒ‹’œ’’ž‘›À*}* œŠŒ‹’œ’’ž‘›* d+ÐW+ d, d- d. d/ d0 d1 d2 d3ÀD3}3 œŠŒ‹’œ’’ž‘›ÐD3À>3 d4ðD4}4 œŠŒ‹’œ’’ž‘›4C4 d5€W5}5 œŠŒ‹’œ’’ž‘›€5}5‘šˆ‰ž“ÐD5À>55 d6}6 œŠŒ‹’œ’’ž‘›6}6‘šˆ‰ž“ d7}7œ’’ž‘›7}7˜’œ›ž‹ž‹†š‹œ’’ž‘›€7}7 –‘Š‹‹†šÀ7}7 –‘Š‹ŒŠœšÀ7}7ŠŒšœŠŒ‹’œ’’ž‘›À7}7 œŠŒ‹’œ’’ž‘›7 d8ÐW8 d9 d: d; d< d= d> d? d@ dA dB dCÀDC}C ““–‘‹š‰ž“ÐDC€>C dDðDD}D ““–‘‹š‰ž“DDè dE€WE}E ““–‘‹š‰ž“€E}E‘šˆ‰ž“ÐDE€>EE dF^F}F‘šˆ‰ž“FF^F dG}G ““–‘‹š‰ž“GG dH}HŠ‘š˜–Œ‹š’Œ˜—ž‘›“š€Hà^HÀH}H ’Œ˜ ‹–’š‹–œ”ÀHHH dI0^I dJ}J ““–‘‹š‰ž“J}J‘šˆ‰ž“ dK}Kš˜–Œ‹š’Œ˜—ž‘›“š€Kà^KÀK}K ’Œ˜ ‹–’š‹–œ”ÀK}K‘šˆ‰ž“ðKKK dL@^L dMÐWM dN dO dP dQ dR dSÀDS}SŒœž“š•ÐDSà>S}S ˜’œžŠ‹Œœž“š dTðDT}TŒœž“š•T}Tš’‹† dU€WU}UŒœž“š•€U}U‘šˆ‰ž“ÐDU}U ˜’œžŠ‹Œœž“šU dV^V}VŒœž“š•àV}Vš’‹†^V dW}WŒœž“š•àW}Wš‘ž“š›ÐWAW dX@^X dY dZ}ZŒœž“š•Z}Z‘šˆ‰ž“ d[}[ ›Š››†ž‹‹žœ—€[[ d\ÐW\ d] d^ d_`K_ÀD_}_“ˆž‡Ï°__Ð_ÐD_€>_ d``K`ÀD`}`“ˆž‡Î°``Ð`ÐD`€>` da`KaÀDa}a“ˆž†Ï°aaÐaÐDa€>a db`KbÀDb}b“ˆž†Î°bbÐbÐDb€>b dc`KcÀDc}c —–˜—ž‡Ï°ccÐcÐDc€>c dd`KdÀDd}d —–˜—ž‡Î°ddÐdÐDd€>d de`KeÀDe}e —–˜—ž†Ï°eeÐeÐDe€>e df`KfÀDf}f —–˜—ž†Î°ffÐfÐDf€>f dg`KgÀDg}g•‡ÎÐDg€>g dh`KhÀDh}h•†ÎÐDh€>h di`KiÀDi}i“ˆž‘›ŒÐDi€>i dj`KjÀDj}j —–˜—ž‘›ŒÐDj€>j dk`KkÀDk}k“ˆŒ‹šŒÐDk€>k dl`KlÀDl}l —–˜—Œ‹šŒÐDl€>l dm`KmÀDm}m “ˆœ“Œ°mÐmÐDm >m dn`KnÀDn}n —–˜—œ“Œ°nÐnÐDn >n do`KoÀDo}o “ˆ“š‘˜‹—Ào}o —–˜—“š‘˜‹—ÐDo€>o dp`KpÀDp}p “ˆŒ‹š“š‘˜‹—Àp}p—–˜—Œ‹š“š‘˜‹—ÐDp>p dq`KqÀDq}q ™–“““–’–‹ÐDq€>q dr`KrÀDr}rž‘˜šÐDr>r ds dt du€Wu}uŒ‹ž‹Š€uu dvÀWv}v’Œ˜ –‘–‹ dw}wš‘›ž‘˜š€w}wš‘›ž‘˜šw dx dy}yž‘˜šÐy}yžŒ€y}yš‘›ž‘˜šÐy}y Œ‹ž‹ž‘˜šy dz}zœž“œ‰ž“ŠšŒž‘›šš‘›š€zz d{}{ œ“šœž“œ€{{ d|}|šœž“œ€|| d} d~}~šŒ–…š€~à^~À~}~ˆ–›‹—À~}~—š–˜—‹~ d}š“œž‹š€à^À}‡ŒÀ}†Œ d€}€š‘ž“š€€à^€À€}€š‘ž“𛐀 d}ž‹‹žœ—€à^À}žš‘‹ d‚ dƒ}ƒ ““–‘‹š‰ž“€ƒ}ƒ ““–‘‹š‰ž“ƒ d„}„˜’œ ‰š–™†œ’’•€„}„ œ’’•šœ‹„ d…}… –‘Š‹‹†š€…}… –‘Š‹‹†š… d†ÐW† d‡ dˆ€Kˆ€Wˆ}ˆ›žˆ€ˆˆ d‰ÀW‰}‰’Œ˜ ›žˆ dŠÀDŠ}Š–ÐDŠ€>Š d‹}‹ Œš‹™˜œ“€‹}‹ ›šœ“‹ dŒ}Œ Œš‹˜œ“€Œ}Œ˜œ“Œ d}Œš‹‹ž‘Œžš‘‹€}˜œ“ dŽ}ŽŠŒš‹ž‘Œžš‘‹€Ž}Ž ‹ž‘Œžš‘‹Ž d}›žˆ‡€}‡ŒÀ}†ŒÀ}•‡ÎÀ}•†Î d d‘P^‘}‘–Б‘ W‘}‘“ˆž‘›Œ d’}’ Œš‹™˜œ“€’}’ “ˆœ“Œ°’}’–Ð’’ d“}“ Œš‹˜œ“€“}“ “ˆœ“Œ°“}“–Г“ d”}”›žˆ‡€”}”“ˆž‡Ï°”}”–ДÀ”}”“ˆž†Ï°”}”–ДÀ”}”“ˆž‡Î°”}”–ДÀ”}”“ˆž†Î°”}”–Д” d•`^• d–P^–}––Ж– W–}– —–˜—ž‘›Œ d—}— Œš‹™˜œ“€—}— —–˜—œ“Œ°—}—–З— d˜}˜ Œš‹˜œ“€˜}˜ —–˜—œ“Œ°˜}˜–И˜ d™}™›žˆ‡€™}™ —–˜—ž‡Ï°™}™–ЙÀ™}™ —–˜—ž†Ï°™}™–ЙÀ™}™ —–˜—ž‡Î°™}™–ЙÀ™}™ —–˜—ž†Î°™}™–Й™ dš`^š d›ÐW› dœ d dž€Kž€Wž}ž œ“šœž“œ€žž dŸ}Ÿ œž“œ˜ž›–š‘‹€Ÿ}Ÿœ“ÎÀŸ}Ÿœ“ÍÀŸ}Ÿ“ˆŒ‹šŒÀŸ}Ÿ “ˆœ“ŒŸ d }  œž“œ˜ž›–š‘‹€ } œ“ÍÀ } œ“ÌÀ }  —–˜—Œ‹šŒÀ }  —–˜—œ“Œ  d¡ÐW¡ d¢ d£ d€€K€€W€}€šœž“œ€€€ d¥ÀD¥}¥–ÐD¥€>¥ dŠÀDŠ}Š•ÀŠ}Š”ÐDА>Š d§ dš d©}© ›Š››†ž‹‹žœ—€©© dª d«}«•‡ÎЫ}«‡Œ°«}«ˆ–›‹—Ы« d¬}¬•†ÎЬ}¬†Œ°¬}¬—š–˜—‹Ð¬¬ d­}­ž‘˜šÐ­}­žŒ€­}­š‘›ž‘˜šÐ­}­ Œ‹ž‹ž‘˜š­ d®^®}®ž‘˜šÐ®®^® d¯}¯ž‘˜šÐ¯¯ d°@^° d± d²^²}² ›–šœ‹–‘в}² —–…‘‹ž“^² d³}³•г}³†Œ°³³ dŽ}Ž”ÐŽ}ކŒ°Ž}Ž—š–˜—‹ÐŽŽ dµP^µ}µ–еµ Wµ}µ“ˆŒ‹šŒ d¶}¶“ˆž†Ï°¶}¶–жж}¶• d·}·“ˆž†Î°·}·–зз}·” dž`^ž d¹P^¹}¹–й¹ W¹}¹ —–˜—Œ‹šŒ dº}º —–˜—ž†Ï°º}º–кк}º• d»}» —–˜—ž†Î°»}»–лл}»” dŒ`^Œ dœ dŸ}Ÿ —–˜—“š‘˜‹—П€Ÿ}Ÿˆ–›‹—ПŸŸðŸŸ d¿^¿€¿}¿ˆ–›‹—п¿¿À¿¿Ð¿¿^¿ dÀ}À “ˆ“š‘˜‹—ÐÀ}À —–˜—“š‘˜‹—°ÀÀ dÁ0^Á dÂ} “ˆ“š‘˜‹—ÐÂ} —–˜—“š‘˜‹— dÃ@^à dÄ dÅ}Å “ˆŒ‹š“š‘˜‹—ÐÅ€Å}Å “ˆ“š‘˜‹—ÐÅŐÅðÅ€Å}Å“ˆŒ‹šŒ°ÅŐŠdÆ}Æ—–˜—Œ‹š“š‘˜‹—ÐÆ€Æ}Æ —–˜—“š‘˜‹—ÐÆÆÆðÆ€Æ}Æ —–˜—Œ‹šŒ°ÆÆÆ dÇ dÈ^È}È’–ÐÈAÈ^È dÉ}É ™–“““–’–‹ÐÉ}ɇŒ°É€É}Ɉ–›‹—ÐÉɐɠÉ}ÉžŒ€É}ɉž“ŠšÐÉ}É Œ‹ž‹ž‘˜šÉðÉ}ɍž‘˜š dÊ dË}Ë•ÐË}ˇŒ°ËË dÌ}Ì”ÐÌ}̇Œ°Ì}Ì “ˆŒ‹š“š‘˜‹— dÍ}Í —–˜—ž‘›ŒÐÍÍ dÎP^Î}ΖÐÎΠWÎ}ЈŒ‹šŒ dÏ^Ï}Ï”ðÏ}Ï ™–“““–’–‹^Ï dÐ}Гˆž‡Ï°Ð}ЖÐÐÐÐ}Е dÑ}Ñ“ˆž‡Î°Ñ}Ñ–ÐÑÐÑ}Ñ ™–“““–’–‹ dÒ dÓ^Ó}Ó ™–“““–’–‹ÀÓ}Ó•^Ó dÔ}Ô“ˆž‘›ŒÐÔ}Ô–ÐÔÔ dÕ0^Õ dÖ}Ö“ˆž‘›ŒÐÖ}Ö– d×@^× dØ dÙ}Ù•ÐÙ}Ù•°Ù}Ù “ˆŒ‹š“š‘˜‹— dÚ}Ú”ÐÚ}Ú”°Ú}Ú—–˜—Œ‹š“š‘˜‹— dÛ}Û —–˜—ž‘›ŒÐÛÐÛÛ dÜÀ]Ü dÝ0^Ý dÞ}Þ“ˆž‡Ï°Þ}Þ–ÐÞÐÞ}Þ• dß}ß“ˆž‡Î°ß}ß–ÐßÐß}ß” dà dá}á•Ðá}á•°á}á “ˆŒ‹š“š‘˜‹— dâ}â”Ðâ}â”°â}â “ˆŒ‹š“š‘˜‹— dã}㓐ˆž‘›ŒÐã}ã– dä@^ä då`^å dæ dç^ç}ç —–˜—ž‘›ŒÐçÐçç^ç dèð^è dé@^é dê dë}ë”Ðë}ë•Ðëë°ë}ë—–˜—Œ‹š“š‘˜‹— dìP^ì}ì–Ðìì Wì}ì —–˜—Œ‹šŒ dí^í}í”ðí}í ™–“““–’–‹^í dî}î —–˜—ž‡Ï°î}î–ÐîÐî}î• dï}ï —–˜—ž‡Î°ï}ï–ÐïÐï}ï ™–“““–’–‹ dð}ð —–˜—ž‘›ŒÐð}ð– dñÀ]ñ dò0^ò dó}ó —–˜—ž‡Ï°ó}ó–ÐóÐó}ó• dô}ô —–˜—ž‡Î°ô}ô–ÐôÐô}ô” dõ dö}ö•Ðö}ö•°ö}ö—–˜—Œ‹š“š‘˜‹— d÷}÷”Ð÷}÷”°÷}÷—–˜—Œ‹š“š‘˜‹— dø}ø —–˜—ž‘›ŒÐø}ø– dù@^ù dú`^ú dû0^û dü}ü ™–“““–’–‹Ðü}ü‡Œ°ü€ü}üˆ–›‹—ÐüüüÐü€ü}üˆ–›‹—Ðüüü ü}üžŒ€ü}ü‰ž“ŠšÐü}ü Œ‹ž‹ž‘˜šüðü}üž‘˜š dý dþ}þ•Ðþ}þ‡Œ°þ}þˆ–›‹—Ðþþ dÿ}ÿ”Ðÿ}ÿ‡Œ°ÿ}ÿˆ–›‹—ÐÿÿÐÿ}ÿ “ˆŒ‹š“š‘˜‹— d} —–˜—ž‘›ŒÐ dP^}–РW}“ˆŒ‹šŒ d^}”} ™–“““–’–‹^ d}“ˆž‡Ï°}–ÐÐ}• d}“ˆž‡Î°}–ÐÐ} ™–“““–’–‹ d d^} ™–“““–’–‹à}•^ d}“ˆž‘›ŒÐ}–Ð d0^ d } “ˆž‘›ŒÐ } – d @^  d  d } •Ð } •Ð }  “ˆŒ‹š“š‘˜‹— d } ”Ð } ”Ð } —–˜—Œ‹š“š‘˜‹— d} —–˜—ž‘›ŒÐÐ dÀ] d0^ d}“ˆž‡Ï°}–ÐÐ}• d}“ˆž‡Î°}–ÐÐ}” d d}•Ð}•Ð} “ˆŒ‹š“š‘˜‹— d}”Ð}”Ð} “ˆŒ‹š“š‘˜‹— d}“ˆž‘›ŒÐ}– d@^ d`^ d d^} —–˜—ž‘›ŒÐÐ^ dð^ d@^ d d}”Ð}•°Ð}—–˜—Œ‹š“š‘˜‹— dP^}–РW} —–˜—Œ‹šŒ d ^ } ” }  ™–“““–’–‹^  d!}! —–˜—ž‡Ï°!}!–Ð!Ð!}!• d"}" —–˜—ž‡Î°"}"–Ð"Ð"}" ™–“““–’–‹ d#}# —–˜—ž‘›ŒÐ#}#– d$À]$ d%0^% d&}& —–˜—ž‡Ï°&}&–Ð&Ð&}&• d'}' —–˜—ž‡Î°'}'–Ð'Ð'}'” d( d)})•Ð)})•Ð)})—–˜—Œ‹š“š‘˜‹— d*}*”Ð*}*”Ð*}*—–˜—Œ‹š“š‘˜‹— d+}+ —–˜—ž‘›ŒÐ+}+– d,@^, d-`^- d.@^. d/0^/ d0}0•Ð0}0‡Œ°00 d1}1”Ð1}1‡Œ°1}1ˆ–›‹—Ð11 d2P^2}2–Ð22 W2}2“ˆŒ‹šŒ d3}3“ˆž‡Ï°3}3–Ð3Ð3}3• d4}4“ˆž‡Î°4}4–Ð4Ð4}4” d5`^5 d6P^6}6–Ð66 W6}6 —–˜—Œ‹šŒ d7}7 —–˜—ž‡Ï°7}7–Ð7Ð7}7• d8}8 —–˜—ž‡Î°8}8–Ð8Ð8}8” d9`^9 d: d;}; —–˜—“š‘˜‹—Ð;€;};—š–˜—‹Ð;;;ð;; d<^<€<}<—š–˜—‹Ð<<<À<<Ð<<^< d=}= “ˆ“š‘˜‹—Ð=}= —–˜—“š‘˜‹—°== d>0^> d?}? “ˆ“š‘˜‹—Ð?}? —–˜—“š‘˜‹— d@@^@ dA dB}B “ˆŒ‹š“š‘˜‹—ÐB€B}B “ˆ“š‘˜‹—ÐBBBðB€B}B“ˆŒ‹šŒ°BBB dC}C—–˜—Œ‹š“š‘˜‹—ÐC€C}C —–˜—“š‘˜‹—ÐCCCðC€C}C —–˜—Œ‹šŒ°CCC dD dE^E}E’–ÐEAE^E dF}F ™–“““–’–‹ÐF}F†Œ°F€F}F—š–˜—‹ÐFFFÐF€F}F—š–˜—‹ÐFFF F}FžŒ€F}F‰ž“ŠšÐF}F Œ‹ž‹ž‘˜šFðF}Fž‘˜š dG dH}H•ÐH}H†Œ°H}H—š–˜—‹ÐHH dI}I”ÐI}I†Œ°I}I—š–˜—‹ÐIIÐI}I “ˆŒ‹š“š‘˜‹— dJ}J —–˜—ž‘›ŒÐJJ dKP^K}K–ÐKK WK}K“ˆŒ‹šŒ dL^L}L”L}L ™–“““–’–‹^L dM}M“ˆž†Ï°M}M–ÐMÐM}M• dN}N“ˆž†Î°N}N–ÐNÐN}N ™–“““–’–‹ dO dP^P}P ™–“““–’–‹àP}P•^P dQ}Q“ˆž‘›ŒÐQ}Q–ÐQQ dR0^R dS}S“ˆž‘›ŒÐS}S– dT@^T dU dV}V•ÐV}V•ÐV}V “ˆŒ‹š“š‘˜‹— dW}W”ÐW}W”ÐW}W—–˜—Œ‹š“š‘˜‹— dX}X —–˜—ž‘›ŒÐXÐXX dYÀ]Y dZ0^Z d[}[“ˆž†Ï°[}[–Ð[Ð[}[• d\}\“ˆž†Î°\}\–Ð\Ð\}\” d] d^}^•Ð^}^•Ð^}^ “ˆŒ‹š“š‘˜‹— d_}_”Ð_}_”Ð_}_ “ˆŒ‹š“š‘˜‹— d`}`“ˆž‘›ŒÐ`}`– da@^a db`^b dc dd^d}d —–˜—ž‘›ŒÐdÐdd^d deð^e df@^f dg dh}h”Ðh}h•°hhÐh}h—–˜—Œ‹š“š‘˜‹— diP^i}i–Ðii Wi}i —–˜—Œ‹šŒ dj^j}j”j}j ™–“““–’–‹^j dk}k —–˜—ž†Ï°k}k–ÐkÐk}k• dl}l —–˜—ž†Î°l}l–ÐlÐl}l ™–“““–’–‹ dm}m —–˜—ž‘›ŒÐm}m– dnÀ]n do0^o dp}p —–˜—ž†Ï°p}p–ÐpÐp}p• dq}q —–˜—ž†Î°q}q–ÐqÐq}q” dr ds}s•Ðs}s•Ðs}s—–˜—Œ‹š“š‘˜‹— dt}t”Ðt}t”Ðt}t—–˜—Œ‹š“š‘˜‹— du}u —–˜—ž‘›ŒÐu}u– dv@^v dw`^w dx0^x dy}y ™–“““–’–‹Ðy}y†Œ°y€y}y—š–˜—‹Ðyyy y}yžŒ€y}y‰ž“ŠšÐy}y Œ‹ž‹ž‘˜šyðy}yž‘˜š dz d{}{•Ð{}{†Œ°{{ d|}|”Ð|}|†Œ°|}| “ˆŒ‹š“š‘˜‹— d}}} —–˜—ž‘›ŒÐ}} d~P^~}~–Ð~~ W~}~“ˆŒ‹šŒ d^}”ð} ™–“““–’–‹^ d€}€“ˆž†Ï°€}€–ЀЀ}€• d}“ˆž†Î°}–ЁЁ} ™–“““–’–‹ d‚ dƒ^ƒ}ƒ ™–“““–’–‹Àƒ}ƒ•^ƒ d„}„“ˆž‘›ŒÐ„}„–Є„ d…0^… d†}†“ˆž‘›ŒÐ†}†– d‡@^‡ dˆ d‰}‰•Љ}‰•°‰}‰ “ˆŒ‹š“š‘˜‹— dŠ}Š”ÐŠ}Š”°Š}Š—–˜—Œ‹š“š‘˜‹— d‹}‹ —–˜—ž‘›ŒÐ‹Ð‹‹ dŒÀ]Œ d0^ dŽ}Ž“ˆž†Ï°Ž}Ž–ÐŽÐŽ}Ž• d}“ˆž†Î°}–ЏЏ}” d d‘}‘•Б}‘•°‘}‘ “ˆŒ‹š“š‘˜‹— d’}’”Ð’}’”°’}’ “ˆŒ‹š“š‘˜‹— d“}““ˆž‘›ŒÐ“}“– d”@^” d•`^• d– d—^—}— —–˜—ž‘›ŒÐ—З—^— d˜ð^˜ d™@^™ dš d›}›”Л}›•Л›°›}›—–˜—Œ‹š“š‘˜‹— dœP^œ}œ–Мœ Wœ}œ —–˜—Œ‹šŒ d^}”ð} ™–“““–’–‹^ dž}ž —–˜—ž†Ï°ž}ž–ОО}ž• dŸ}Ÿ —–˜—ž†Î°Ÿ}Ÿ–ПП}Ÿ ™–“““–’–‹ d }  —–˜—ž‘›ŒÐ } – d¡À]¡ d¢0^¢ d£}£ —–˜—ž†Ï°£}£–УУ}£• d€}€ —–˜—ž†Î°€}€–ЀЀ}€” d¥ dŠ}Š•ÐŠ}Š•°Š}Š—–˜—Œ‹š“š‘˜‹— d§}§”Ч}§”°§}§—–˜—Œ‹š“š‘˜‹— dš}š —–˜—ž‘›ŒÐš}š– d©@^© dª`^ª d«@^« d¬@^¬ d­ÐW­ d® d¯ d° d± d²€K²€W²}²žŒ€²}²‘šˆ‰ž“ÐD²>²²°W²>² d³^³}³‘šˆ‰ž“À³³^³ dŽð^ŽÐŽ}Ž‘šˆ‰ž“ dµ0^µ d¶ð^¶}¶‘šˆ‰ž“ d·@^· džÐWž d¹ dº d»€K»€W»}» œž“œ˜ž›–š‘‹€»}»œ“ÏÐD»ð>»À»}»œ“ÎÐD»ð>»À»}»Œ‹šŒÐD»W» W»€>»À»}» ž‘›œ“Œ°»Ð»ÐD»W» W» >»» dŒÀDŒ}Œ–ÐDŒ€>Œ dœ dŸÀDŸ}ŸŒ‹šŒÐDŸ€>Ÿ d¿ÀD¿}¿˜Œ‹šŒÐD¿€>¿ dÀÀDÀ}ÀŒ‹šŒÐDÀ€>À dÁ dÂÀDÂ}Œ‹šÐD€> dÃÀDÃ}ØŒ‹šÐDÀ>à dÄÀDÄ}ĝŒ‹šÐDÄ€>Ä dÅ dÆ dÇ dÈ}ȍŒ‹šŒÐÈ€È}Èœ“ÎðÈÈ ÈðÈÈÐÈ€È}Èœ“ÏðÈÈ ÈðÈÈ dÉ}ɘŒ‹šŒÐÉ€É}Éœ“Î`É}ɘž›–š‘‹ ˜šš‘ ’žŒ”ÉðÉÉÐÉ€É}Éœ“Ï`É}ɘž›–š‘‹ ˜šš‘ ’žŒ”ÉðÉÉ dÊ}ʝŒ‹šŒÐÊ€Ê}Êœ“Î`Ê}ʘž›–š‘‹ “Šš ’žŒ”ÊðÊÊÐÊ€Ê}Êœ“Ï`Ê}ʘž›–š‘‹ “Šš ’žŒ”ÊðÊÊ dË dÌ dÍ}ÍŒ‹šŒÐÍ}ÍžŒ€Í}͍Œ‹šŒÍ dÎ^Î}ÎŒ‹šŒÀÎ}ΝŒ€Î}ΘŒ‹šŒÎ^Î dÏ}ÏŒ‹šŒÐÏ}ÏžŒ€Ï}ϘŒ‹šŒÏ dÐ@^Ð dÑ^Ñ}ÑŒ‹šŒÀÑ}ÑžŒ€Ñ}ѝŒ‹šŒÑ^Ñ dÒ}ÒŒ‹šŒÐÒ}ÒžŒ€Ò}ҝŒ‹šŒÒ dÓ@^Ó dÔ dÕ}Õš›–’€Õ}Õ ž‘›œ“ŒÀÕ}ÕŒ‹šŒ°ÕÕÕ dÖ d× dØ dÙP^Ù}Ù–ÐÙÙ WÙ}ÙŒ‹šŒ dÚ^Ú}ڍŒ‹šŒÀÚÚ^Ú dÛ}ۍŒ‹šÐÛ}Û– Û}ۍŒ‹šŒ ÛÛ€?ðÛ}ÛŒ‹šŒÐÛÛ? dÜ}܍Œ‹šÐÜ}܍Œ‹š ÜÜ dÝ ^Ý}ݍŒ‹šŒàÝÝ^Ý dÞ}ލŒ‹šÐÞ}Þ– Þ}ލŒ‹šŒ ÞÞ€?ðÞ}ÞŒ‹šŒ°ÞÞ? dß}ߍŒ‹šÐß}ߍŒ‹š ßß dà0^à dá}ፌ‹šÐáá dâ@^â dã^ã}㘌‹šŒÀãã^ã dä}䘌‹šÐä}ä– ä}䘌‹šŒ ää€?ðä}䌋šŒÐää? då}嘌‹šÐå}嘌‹š åå dæ ^æ}昌‹šŒàææ^æ dç}瘌‹šÐç}ç– ç}瘌‹šŒ çç€?ðç}çŒ‹šŒ°çç? dè}蘌‹šÐè}蘌‹š èè dé0^é dê}ꘌ‹šÐêê dë@^ë dì^ì}음‹šŒÀìì^ì dí}흌‹šÐí}í– í}흌‹šŒ íí€?ðí}팋šŒÐíí? dî ^î}‹šŒàîî^î dï}‹šÐï}ï– ï}‹šŒ ïï€?ðï}ïŒ‹šŒ°ïï? dð0^ð dñ}ñŒ‹šÐññ dò@^ò dó dô}ô ž‘›œ“Œ°ô}ô–ÐôÐô}ôœ“Ï°ô}ôŒ‹š°ô}ô˜Œ‹š°ô}ôŒ‹š dõ`^õ dö d÷ÐW÷ dø dù dú dû`Kû€Wû}û‹–’š‹–œ”€ûû düÀWü}ü ’Œ˜ ‹–’š‹–œ” dý dþ}þ œ’’•šœ‹àþ}þŒš‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€þ}þœ’’ž‘›Àþà^þÀþþÀþþþ dÿð^ÿ dÐW d d`K€W}…š‘ž“š›€}Œ‹ž‹ŠŒÐD°> dÀW} ’Œ˜ …š‘ž“š› d d^}Œ‹ž‹ŠŒ`}š‘ž“š›^ d}‹–’š‹–œ”€ d@^ dÐW d  d `K €W } ŒŠœœšŒŒ€ } ž’ÐD €>  °W °>  d ÀW } ˜’œ œ’’ŒŠœœšŒŒ d  d ÀD } ‹’‰ž“ŠšÐD >  d d°^_ d}‰ž“€}‹’‰ž“ŠšÀ}‹–’€} œ’’•šœ‹à} œŠšŒ‘Œš dÀ^_ d}‹’‰ž“Šš} Œ‹ž‹ž‘˜š d}˜’œ œ“šžš‡œš‹–‘€ dÐ^ d d}šŒ‘Œššœš–‰š›€}‹’‰ž“Šš d^}‹’‰ž“Ššà}‰ž“Šš^ d}Œš‹‰ž“Šš€}‹’‰ž“Šš d@^ d}šš‘›š€à^ dð^1 dÐW d d`K€W}™ž–“Šš€}ž’ÐD€>°W°> dÀW}˜’œ œ’’™ž–“Šš d  d!}!šŒ‘Œš™ž–“Šš€!}!‹–’€!}! œ’’•šœ‹à!}! œŠšŒ‘Œš!À!}! œ’’•šœ‹à!}!œŠ™ž–“ŠššžŒ‘! d"ð^"1" d#ÐW# d$ d% d& d' d( d) d* d+€W+}+šŒ‘Œššœš–‰š›€+}+šŒ‘ŒšÐD+W+ W+>++ d,ð^, d-ÐW- d. d/ d0 d1 d2 d3 d4€W4}4šŒ‘Œš™ž–“Šš€4}4 šŒ‘Œš‹š‡‹ÐD4À>4À4}4 ™ž–“šžŒ‘ÐD4}4˜’œ ™ž–“ŠššžŒ‘4 d5ð^5 d6ÐW6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD„dD ‹“ dE dF dG dH dI dJ dK€WK}K ‹“ž‹‹žœ—€K}Kž‹‹žœ—‹ÐDKà>KK dLÀWL}L’Œ˜ ‹“ ž‹‹žœ— dM dN}Nž‹‹žœ—€Nà^NÀN}Nž‹‹žœ—‹N dOÐWO dP dQ dR dS€WS}S ‹“ž‹‹žœ—š›€S}S ‘šˆžš‘‹ÐDSà>SS dTÀWT}T’Œ˜ ‹“ ž‹‹žœ—š› dU dV dW}Wžš‘‹W}W ‘šˆžš‘‹ dX}X ‹“ šŒ–Œ‹€X}Xžš‘‹X dY}Y ›Š››†ž‹‹žœ—€YY dZÐWZ d[ d\ d] d^ d_€W_}_‹“’‰š€_}_›‡ÐD_€>_À_}_›†ÐD_€>__ d`ÀW`}` ’Œ˜ ‹“ ’‰š da db}b‡Œb}b‡Œ°b}b›‡ dc}c†Œc}c†Œ°c}c›† dd}dš“œž‹š€dà^dÀd}d‡ŒÀd}d†Œd de df dg}g ‹“ šŒ–Œ‹€g}g‡Œg dh}h ‹“ šŒ–Œ‹€h}h†Œh di}išœž“œ€ii dj}jšš‘›š€jà^jj dkÐWk dl dm dn do dp dq dr ds dt du dv€Wv}v‹“˜š‹—ž‘›“šŒ€v}v‡œ›Œ°vÐvÐDvWv Wv€>vÀv}w†œ›Œ°wÐwÐDwWw Ww€>wÀw}xœŠŒŒ°xÐxÐDxWx Wx}x ˜Š–œŠŒŒÀx}yœ“Œš›ÐDyWy Wy°>yy dzÀWz}z’Œ˜ ‹“ ˜š‹—ž‘›“šŒ d{ d| d} d~ d} ‹“˜š‹—ž‘›“šŒ€}‡œ›ŒÀ}†œ›ŒÀ}œŠŒŒÀ}œ“Œš›À}‡ŒÀ}†ŒÀ}ˆ–›‹—À}—š–˜—‹ d€ dÐW d‚ dƒ d„ d… d† d‡€W‡}‡‹“’‰š—ž‘›“š€‡}‡ —ž‘›“š‘Š’ÐD‡W‡ W‡€>‡À‡}‡›‡ÐD‡€>‡À‡}‡›†ÐD‡€>‡‡ dˆÀWˆ}ˆ’Œ˜ ‹“ ’‰š—ž‘›“š d‰ dŠ d‹ dŒ d} ‹“’‰š—ž‘›“š€} —ž‘›“š‘Š’À}›‡À}›†À}‡ŒÀ}†ŒÀ}ˆ–›‹—À}—š–˜—‹Àà^ dŽ d}šœž“œ€ dÐW d‘ d’ d“ d” d• d– d— d˜ d™€W™}™‹“›ž˜œšž‹š€™}™ žš‘‹•ÐD™à>™À™}™‡ÎÐD™€>™À™}™†ÎÐD™€>™À™}š‡ÍÐDš€>šÀš}š†ÍÐDš€>šš d›ÀW›}›’Œ˜ ‹“ ›ž˜œšž‹š dœ d dž dŸ d }  ‹“›ž˜œšž‹š€ }  žš‘‹•À } ‡ÎÀ } †ÎÀ } ‡ÍÀ } †ÍÀ } ‡ŒÀ } †ŒÀ } ˆ–›‹—À } —š–˜—‹À } žš‘‹  d¡ d¢^¢}¢ˆ–›‹—À¢}¢—š–˜—‹^¢ d£}£ ›–šœ‹–‘£}£‰š‹–œž“ d€@^€ d¥}¥ ‹“ šŒ–Œ‹€¥}¥ ›–šœ‹–‘¥ dŠ d§ dš d©}©Œ‹ž‹Š€©© dªÐWª d« d¬ d¬ d­ d® d¯`K¯€W¯}¯ Œœž“ššŒ–…š€¯}¯‘šˆ“š‘˜ÐD¯€>¯¯°W¯°>¯ d°ÀW°}°žŠ‹Œœž“š šŒ–…ššŽŠšŒ‹ d± d²^²€²}²˜’œ Š››†šŽŠšŒ‹Ð²}²Œœž“š•²^² d³}³‘šˆ“š‘˜Ð³}³‘šˆ“š‘˜°³³ dŽ^Ž}Ž ›–šœ‹–‘ÐŽ}Ž —–…‘‹ž“^Ž dµ^µ}µ‘šˆ“š‘˜àµ}µˆ–›‹—^µ d¶}¶ˆ–›‹—ж}¶‘šˆ“š‘˜ d·„d· ‹“}· ‹“ šŒ–Œ‹€·}·ˆ–›‹—· d· dž@^ž d¹0^¹ dº^º}º‘šˆ“š‘˜àº}º—š–˜—‹^º d»}»—š–˜—‹Ð»}»‘šˆ“š‘˜ dŒ„dŒ ‹“}Œ ‹“ šŒ–Œ‹€Œ}Œ—š–˜—‹Œ dŒ dœ@^œ dŸ@^Ÿ d¿@^¿ dÀ dÁð^Á1Á dÂÐW dà dÄ`KÄ€WÄ}Ä Š››†š–‘–‹€Ä}ヘ’ÐDÄ€>ĐİWİ>Ä dÅÀWÅ}ÅžŠ‹Œœž“š Š››†š–‘–‹ dÆ dÇ^Ç€Ç}ÇŒœž“š•ÐÇ}ǘ’œ Š››†šŽŠšŒ‹Ç`Ç}Ç–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹^Ç dÈ}È ›Š››†ž‹‹žœ—€ÈÈ dÉð^É1É dÊ@^Ê dËð^ËAË dÌÐWÌ dÍ dÎ`KÎÀDÎ}Ζ‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹ÐDΰ>Î dÏ`KÏ€WÏ}Ï ›Š››†ž‹‹žœ—€ÏÏ dÐ^Ð}ÐŒœž“š•àÐ}К’‹†^Ð dÑ}Ñ–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹Ñ1Ñ dÒ^ÒÒ}Ò’–^Ò dÓ^Ó}Ó ›–šœ‹–‘ÐÓ}Ó —–…‘‹ž“^Ó dÔ}ÔŒœž“š•àÔ}Ôž‹‹žœ—‹€Ô}Ô‡Œ°ÔÔÀÔ}Ô†ŒÀÔ}Ô‡Œ°Ô}Ôˆ–›‹—ÐÔÔÀÔ}Ô†Œ°Ô}Ô—š–˜—‹ÐÔÔÀÔ}Ô Œ‹ž‹ž‘˜šÀÔ}Õš‘›ž‘˜šÀÕ}Õ ›–šœ‹–‘ÐÕ}Õ —–…‘‹ž“ÀÕà^ÕÀÕ}Տžš‘‹ÀÕ}Õš‘ž“š›Õ dÖ0^Ö d×}׌œž“š•à×}מ‹‹žœ—‹€×}ׇŒÀ×}׆Œ°××À×}ׇŒ°×}׈–›‹—Ð××À×}׆Œ°×}×—š–˜—‹Ð××À×}ך‘›ž‘˜šÀ×}Ø Œ‹ž‹ž‘˜šÀØ}Ø ›–šœ‹–‘ÐØ}Ø —–…‘‹ž“ÀØà^ØÀØ}؏žš‘‹ÀØ}Øš‘ž“𛐨 dÙ@^Ù dÚ0^Ú dÛ^Û}Û ›–šœ‹–‘ÐÛ}Û —–…‘‹ž“^Û dÜ}ÜŒœž“š•àÜ}Üž‹‹žœ—‹€Ü}܇Œ°ÜÜÀÜ}܆ŒÀÜ}܇Œ°Ü}܈–›‹—ÐÜÜÀÜ}܆Œ°Ü}Ü—š–˜—‹ÐÜÜÀÜ}Üš‘›ž‘˜šÀÜ}Ý Œ‹ž‹ž‘˜šÀÝ}Ý ›–šœ‹–‘ÐÝ}Ý —–…‘‹ž“ÀÝà^ÝÀÝ}ݏžš‘‹ÀÝ}Ýš‘ž“š›Ý dÞ0^Þ dß}ߌœž“š•àß}ßž‹‹žœ—‹€ß}߇ŒÀß}߆Œ°ßßÀß}߇Œ°ß}߈–›‹—ÐßßÀß}߆Œ°ß}ß—š–˜—‹ÐßßÀß}ß Œ‹ž‹ž‘˜šÀß}àš‘›ž‘˜šÀà}à ›–šœ‹–‘Ðà}à —–…‘‹ž“Ààà^àÀà}àžš‘‹Àà}àš‘ž“š›à dá@^á dâ@^â dã@^ã däÐWä dåPKå dæ dç dè dé dê dë dì dí dî dï dð dñ dò dó dô dõ dö d÷ dø dø dù dú°dú Define Area Object type GMCGauge #doc object Gauge ~This object implements a flexible bar graph to graphically ~indicate the value of a paramater on the motion controller ~The object supports user-defined start and endpoints and an ~optional color gradient across the length of the bar. dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc dim xpos as integer func xpos(newval as integer) endfunc dim ypos as integer func ypos(newval as integer) endfunc dim width as integer func width(newval as integer) endfunc dim height as integer func height(newval as integer) endfunc dim bgcolor as color func bgcolor(newval as color) endfunc dim bordercolor as color func bordercolor(newval as color) endfunc dim transparent as boolean func transparent(newval as boolean) endfunc #doc property StartRange ~On horizontal gauges, this sets the value at the far left of ~gauge. On vertical gauges, this sets the value at the bottom. dim startrange as float func startrange(newval as float) endfunc #doc prop EndRange ~On horizontal gauges, this sets the value at the far right of ~the gauge. On vertical gauges, this sets the value at the top ~of the gauge. dim endrange as float func endrange(newval as float) endfunc endfunc endfunc endfunc #doc prop Color1 ~The color displayed near the low end of the gauge (for values ~near startrange). dim color1 as color func color1(newval as color) endfunc #doc prop Color2 ~The color displayed near the middle of the gauge. dim color2 as color func color2(newval as color) endfunc #doc prop Color3 ~The color displayed near the high end of the gauge (for values ~near endrange). dim color3 as color func color3(newval as color) endfunc #doc prop Direction ~The direction (HORIZONTAL or VERTICAL) in which the ~gauge grows and shrinks as the value is changed. dim direction as HVorientation func direction(newval as hvorientation) endfunc #doc prop Mirror ~By default, the gauge grows from left to right or bottom to ~top. Setting this property to true will flip the grow directions ~to right, to left and top to bottom as well as reversing the ~startrange/endrange positions. dim mirror as boolean func mirror(newval as boolean) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication #doc prop inputType ~InputType determines which property of the motion controller will be reflected in the ~gauge. Select an appropriate type from the drop down list. If you need to poll data ~that is not in the dropdown list, then set the customCommand property to query the ~information and useCustomCommand property to true. dim inputType as GMC_DataType func inputType(newVal as GMC_DataType) endfunc #doc prop inputSource ~If the inputType property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSource property to select which axis to query. dim inputSource as GMC_Axis func inputSource (newVal as GMC_Axis) endfunc #doc prop useCustomCommand ~Set this value to true if you will be using a custom command to poll the controller.

If this ~value is true, then this object will poll the controller using the information in the ~customCommand property rather than the values of the inputType and ~inputSource properties.

If this value is false, then the customCommand ~property is ingored and the inputType and inputSource properties are used instead. dim useCustomCommand as boolean func useCustomCommand (newVal as boolean) endfunc #doc prop customCommand ~Use this property to send a custom polling command to the controller. You should use this ~property only if you cannot obtain the information you need by using the inputType and ~inputSource properties. The controller should return a single numeric value in decimal ~format in response to the custom command that you define.

Note: The customCommand ~property is ignored unless the useCustomCommand property is set to true. dim customCommand as string func CustomCommand (newval as string) endfunc #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer func pollInterval (newVal as integer) endfunc #doc prop scaleObj ~If you want a scale displayed next to this object, create a GMCAutoScale object, set its ~properties, then set the scaleObj to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObj as objref GMCAutoScale func scaleObj(newVal as GMCAutoScale) endfunc func StartUp() handles MSG_INIT endfunc fixed func Draw() handles MSG_DRAW endfunc #undoc func ColorPrecalc fixed func colorprecalc() endfunc #undoc func Precalc fixed func precalc() endfunc #undoc func abs fixed func abs( newval as float ) returns float endfunc #undoc func calcgradient fixed func calcgradient( color0 as color, color1 as color, steps as reference to integer, bandcolors[] as reference to byte ) endfunc handles MSG_TIMETICK endfunc handles MSG_ZENABLED endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc #doc override ResponseReceived #param response:The response received from the controller as a floating point value. Change response, if necessary, to translate the final value shown in the gauge ~This event called whenever this object receives receives a response from the controller as a ~result of a poll. The paramater response contains the value that was returned from ~the controller. You may modify response in order to change the final value which ~will be displayed in this object. func ResponseReceived (response as reference to float) endfunc #doc override ResponseFailure #param responseText:The response returned by the controller minus the final colon terminator. #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered whenever the controller fails to respond to a command or responds in ~an incorrect manner. Add any necessary error handling code in this event. func ResponseFailure(responseText as string, failReason as GMC_FailureReason) endfunc func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH endfunc func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED endfunc func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE endfunc func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE endfunc func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE endfunc handles AutoScale_ResizeRequest endfunc handles AutoScale_BuddyReinit endfunc endfunc Enddef #endfile #ifnot Galil_mc_src_GMCPathTrace #option Galil_mc_src_GMCPathTrace library galil_mc source galilcommunications Define Area Object type GMCPathTrace #ToolImage "3FFF73E76DDB6C1B31C77BEF77F777F737F77BEF7DDF7E3F3FFF6EEE0000" '******************************************************************* 'Object: GMCPathTrace 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: Galil motion controller Path tracing object ' 'Version: 1.52 'Copyright: 2004 QSI Corporation. Permission to modify and ' distribute this object is granted provided this ' copyright notice remains in tact. '******************************************************************* #doc object GMCPathTrace ~This object implements a type of 2D graph that can be used to ~plot the recent positions of the motor. To use this object, simply ~set up its properties, especially the startRangeHorz, endRangeHorz, ~startRangeVert, endRangeVert, commObject, inputTypeHorz, ~inputSourceHorz, inputTypeVert, inputSourceVert, and ~pollInterval properties. ~Generally you would be interested in polling the motor position along two of the ~motor axis (such as the X and the Y axis). This object is robust object ~and can consume a lot of the processing power available on the QTERM-G70. ~As such, you should minimize the use of other polling type objects on the ~same screen as you place this GMCPathTrace object. You can also improve ~performance, if necessary, by increasing pollInterval, and decreasing ~numTracePoints. library standard source ToolMessages library galil_mc source GMCAutoScale dim enabled as boolean init enabled := true func enabled(newval as boolean) enabled := newval Enable (me, enabled) Zenabled(enabled) if scaleObjHorz <> empty then scaleObjHorz.enabled = enabled endif if scaleObjVert <> empty then scaleObjVert.enabled = enabled endif endfunc dim parent as objref init parent := default func parent(newval as objref) parent := newval Attach(me, parent) endfunc dim xPos as integer init xPos := 0 func xPos(newval as integer) xPos := newVal Relocate (me, xPos, yPos) Clear() DoBuddyAttachHorz() DoBuddyAttachVert() endfunc dim yPos as integer init yPos := 0 func yPos(newval as integer) yPos := newval Relocate (me, xPos, yPos) Clear() DoBuddyAttachHorz() DoBuddyAttachVert() endfunc dim width as integer init width := 25 func width(newval as integer) width := newval Resize (me, width, height) Clear() DoBuddyAttachHorz() DoBuddyAttachVert() endfunc dim height as integer init height := 25 func height(newval as integer) height := newval Resize (me, width, height) Clear() DoBuddyAttachHorz() DoBuddyAttachVert() endfunc dim borderColor as color init borderColor := RGB_WHITE func bordercolor (newVal as color) borderColor := newVal Rerender(me) endfunc #doc prop TraceColor1 ~This color is used to draw the the most recent positions that have been plotted. If ~fastDraw is set to true, then this color is used for the entire plot. dim TraceColor1 as color init traceColor1 := rgb_green func traceColor1 (newVal as color) traceColor1 := newVal RecalcColors() endfunc #doc prop TraceColor2 ~As positions that have been logged age, the fade in to this color. This color ~is used to represent trace positions that are in the middle of the log. This color ~is not used if fastDraw is set to true. dim TraceColor2 as color init traceColor2 := rgb_yellow func traceColor2 (newVal as color) traceColor2 := newVal RecalcColors() endfunc #doc prop TraceColor3 ~The oldest positions in the trace log are drawn in this color. This color in not ~used if fastDraw is set to true. dim traceColor3 as color init traceColor3 := rgb_navy func traceColor3 (newVal as color) tracecolor3 := newVal RecalcColors() endfunc #doc prop curPosColor ~If showCurPos is true, then the current position of on the plot will be drawn in this color dim curPosColor as color init curPosColor := RGB_Red func curPosColor (newVal as color) curPosColor := newVal Rerender(me) endfunc #doc prop showCurPos ~If true, the current position will be shown as a small box on the plot dim showCurPos as boolean init showCurPos := false func showCurPos (newVal as boolean) showCurPos := newVal Rerender(me) endfunc dim bgColor as color init bgColor := RGB_Black func bgColor (newVal as color) bgColor := newVal Rerender(me) endfunc dim transparent as boolean init transparent := false func transparent (newVal as boolean) transparent := newVal Rerender(me) endfunc #doc prop fastDraw ~When fastDraw is set to true, this object displays itself much, much faster. As a ~result it can log many more trace points than it otherwise could. When this property is ~set to true, the trace line is drawn in a single solid color (TraceColor1). On ~older versions of firmware, the beginning and end of the trace line will be connected. ~When fastDraw is false, the trace line is drawn in a gradient that fades between ~the various trace colors. As the gradient takes time to draw, you should limit the ~numTracePoints property to values of 100 or less when this property is true. dim fastDraw as boolean init fastDraw := false func fastDraw (newVal as boolean) fastDraw := newVal Rerender(me) endfunc #doc prop NumTracePoints ~This is the number of points that the this object will log. Increasing this this number ~will allow for a longer log, but decreased performance of the terminal. If you increase ~this value above 100, you should generally also set fastDraw to true. dim NumTracePoints as integer init numTracePoints := 100 func numTracePoints (newVal as integer) Clear() endfunc #doc prop startRangeHorz ~This defines the lower limit to be displayed on this object. The value of this property ~corresponts to a point along the left of this object. This object will display ~values between startRangeHorz and endRangeHorz within its extents. If ~startRangeHorz is greater than endRangeHorz then the graph is flipped ~horizontally. dim startRangeHorz as float init startRangeHorz := 0 func startRangeHorz (newVal as float) startRangeHorz := newVal VerifyLimits() Clear() endfunc #doc prop endRangeHorz ~This defines the upper limit to be displayed on this object. The value of this property ~corresponts to a point along the right of this object. This object will display ~values between startRangeHorz and endRangeHorz within its extents. If ~startRangeHorz is greater than endRangeHorz then the graph is flipped ~horizontally. dim endRangeHorz as float init endRangeHorz := 100 func endRangeHorz (newVal as float) endRangeHorz := newVal VerifyLimits() Clear() endfunc #doc prop startRangeVert ~This defines the lower limit to be displayed on this object. The value of this property ~corresponts to a point along the bottom of this object. This object will display ~values between startRangeVert and endRangeVert within its extents. If ~startRangeVert is greater than endRangeVert then the graph is flipped ~vertically. dim startRangeVert as float init startRangeVert := 0 func startRangeVert (newVal as float) startRangeVert := newVal VerifyLimits() Clear() endfunc #doc prop endRangeVert ~This defines the upper limit to be displayed on this object. The value of this property ~corresponts to a point along the top of this object. This object will display ~values between startRangeVert and endRangeVert within its extents. If ~startRangeVert is greater than endRangeVert then the graph is flipped ~vertically. dim endRangeVert as float init endRangeVert := 100 func endRangeVert (newVal as float) endRangeVert := newVal VerifyLimits() Clear() endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty #doc prop inputTypeHorz ~InputType determines which property of the motion controller will be used to plot the ~horizontal axis of this control. Select an appropriate type from the drop down list. dim inputTypeHorz as GMC_DataType init inputTypeHorz := GMC_Position func inputTypeHorz(newVal as GMC_DataType) inputTypeHorz := newVal commandHorz := GMCDataTypeToCommand(inputTypeHorz, inputSourceHorz, false, "") endfunc #doc prop inputSourceHorz ~If the inputTypeHorz property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSourceHorz property to select which axis to query. dim inputSourceHorz as GMC_Axis init inputSourceHorz := GMC_Axis_X func inputSourceHorz (newVal as GMC_Axis) inputSourceHorz := newVal commandHorz := GMCDataTypeToCommand(inputTypeHorz, inputSourceHorz, false, "") endfunc private dim commandHorz as string #doc prop inputTypeVert ~InputType determines which property of the motion controller will be used to plot the ~horizontal axis of this control. Select an appropriate type from the drop down list. dim inputTypeVert as GMC_DataType init inputTypeVert := GMC_Position func inputTypeVert(newVal as GMC_DataType) inputTypeVert := newVal commandVert := GMCDataTypeToCommand(inputTypeVert, inputSourceVert, false, "") endfunc #doc prop inputSourceVert ~If the inputTypeVert property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSourceVert property to select which axis to query. dim inputSourceVert as GMC_Axis init inputSourceVert := GMC_Axis_Y func inputSourceVert (newVal as GMC_Axis) inputSourceVert := newVal commandVert := GMCDataTypeToCommand(inputTypeVert, inputSourceVert, false, "") endfunc private dim commandVert as string #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer init pollInterval := 1000 func pollInterval (newVal as integer) if newVal <= 0 then pollInterval := 0 UnregisterMsgHandler (me, msg_timetick, 0) else pollInterval := newVal RegisterMsghandler (me, msg_timetick, newVal/20) endif endfunc #doc prop scaleObjHorz ~If you want a scale displayed along the horizontal axis, create a GMCAutoScale object, set its ~properties, then set the scaleObjHorz to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObjHorz as objref GMCAutoScale init scaleObjHorz := empty func scaleObjHorz(newVal as GMCAutoScale) if scaleObjHorz <> empty then scaleObjHorz.enabled = false endif scaleObjHorz := newVal DoBuddyAttachHorz() endfunc #doc prop scaleObjVert ~If you want a scale displayed along the horizontal axis, create a GMCAutoScale object, set its ~properties, then set the scaleObjHorz to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObjVert as objref GMCAutoScale init scaleObjVert := empty func scaleObjVert(newVal as GMCAutoScale) if scaleObjVert <> empty then scaleObjVert.enabled = false endif scaleObjVert := newVal DoBuddyAttachVert() endfunc func StartUp() handles MSG_INIT Relocate (me, xPos, yPos) Resize (me, width, height) Enable (me, enabled) Attach (me, parent) GMC_VerifyCommObj(commObject) VerifyLimits() DimArrays() PollInterval(pollInterval) InputTypeHorz(inputTypeHorz) InputTypeVert(inputTypeVert) DoBuddyAttachHorz() DoBuddyAttachVert() endfunc func Draw() handles MSG_DRAW dim i, i2, max as integer setfgcolor(bordercolor) setbgcolor (bgcolor) settransparent(bgcolor) usetransparent (transparent) drawbox (xpos, ypos, xpos+width-1, ypos+height-1) if fastDraw then Setfgcolor(Tracecolor1) DrawPolygon (left(xpts, insertIdx), left(ypts, insertIdx), POLY_NOCONNECT) else max = insertIdx-1 for i = 1 to max i2 := i-1 SetFgColor (clrs[max-i2]) DrawLine (xpts[i], ypts[i], xpts[i2], ypts[i2]) next endif if showCurPos then SetFgColor (curPosColor) if insertIdx > 0 then i := insertIdx-1 DrawBox (xPts[i]-1, yPts[i]-1, xPts[i]+1, yPts[i]+1) endif endif endfunc private dim xPts[], yPts[] as integer private dim clrs[] as color private dim insertIdx as integer private func Clear() redim(xPts, 0) redim(yPts, 0) redim(clrs, 0) insertIdx := 0 DimArrays() endfunc private func VerifyLimits() if startRangeHorz == endRangeHorz then endRangeHorz := startRangeHorz+1 endif if startRangeVert == endRangeVert then endRangeVert := startRangeVert+1 endif endfunc private func DimArrays() redim(xPts, numTracePoints) redim(yPts, numTracePoints) redim(clrs, numTracePoints) if insertIdx > numTracePoints then insertIdx := numTracePoints endif #if _tool PopulateForLayoutView() #endif RecalcColors() endfunc #if _tool private func PopulateForLayoutView() dim t as float dim i as integer dim stp, stp2 as float dim radius as float dim cx, cy as float if numTracePoints > 0 then stp = (6*pi)/(numTracePoints) insertIdx := 0 cx = xPos+width/2 cy = yPos+height/2 if width< height then radius = (width-2)/2 else radius = (height-2)/2 endif stp2 = radius*(1.0/numTracePoints) radius := 0 for t = 0 to 6*pi step stp xpts[insertIdx] = cx + (radius*cos(t)) ypts[insertIdx] = cy + (radius*sin(t)) insertIdx := insertIdx + 1 if (insertIdx >= numTracePoints) then break endif radius := radius + stp2 next endif endfunc #endif private func RecalcColors() dim r1, g1, b1 as integer dim r2, g2, b2 as integer dim r3, g3, b3 as integer dim dr, dg, db as float dim i, max as integer dim tmpFlt as float dim sr, sg, sb as float r1 = TraceColor1/32 r2 = TraceColor2/32 r3 = TraceColor3/32 g1 = (traceColor1 and unibyte(0x1C))/4 g2 = (traceColor2 and unibyte(0x1C))/4 g3 = (traceColor3 and unibyte(0x1C))/4 b1 = traceColor1 and unibyte(0x03) b2 = traceColor2 and unibyte(0x03) b3 = traceColor3 and unibyte(0x03) max = (numTracePoints-1)/2 if max > 0 then tmpFlt = 1.0/max dr = (r2-r1)*tmpFlt dg = (g2-g1)*tmpFlt db = (b2-b1)*tmpFlt sr = r1+.5 sg = g1+.5 sb = b1+.5 for i = 0 to max clrs[i] = 32*integer(sr) + 4*integer(sg) + integer(sb) sr = sr + dr sg = sg + dg sb = sb + db next endif max = numTracePoints - max if max > 0 then tmpFlt = 1.0/max dr = (r3-r2)*tmpFlt dg = (g3-g2)*tmpFlt db = (b3-b2)*tmpFlt sr = r2+.5 sg = g2+.5 sb = b2+.5 max = numTracePoints-1 for i = i to max clrs[i] = 32*integer(sr) + 4*integer(sg) + integer(sb) sr = sr + dr sg = sg + dg sb = sb + db next endif Rerender(me) endfunc private func AddPoint(x as float, y as float) dim scrX, scrY as integer #if _tool return #endif scrX = xPos+1+ ((width-2) * (x-startRangeHorz)/(endRangeHorz-startRangeHorz)) 'scrY = yPos+height-2- ((height-2)* (y-startRangeVert)/(endRangeVert-startRangeVert)) 'scrY = yPos+1+ ((height-2) * (y-startRangeHorz)/(endRangeHorz-startRangeHorz)) scrY = yPos+height-1 - ((height-2) * (y-startRangeHorz)/(endRangeHorz-startRangeHorz)) if insertIdx == numTracePoints then SetArrayData (xPts, 0, xPts, 1, -1) SetArrayData (yPts, 0, yPts, 1, -1) xPts[numTracePoints-1] = scrX yPts[numTracePoints-1] = scrY else xPts[insertIdx] = scrX yPts[insertIdx] = scrY insertIdx := insertIdx + 1 endif Rerender(me) endfunc '----------------------------------------------------------------------------------------- 'The actual communications stuff private func Timetick () handles MSG_TIMETICK commObject.SendAsciiCommandStreamCounted(commandHorz+commandVert, me, 0, 2) return endfunc private func Zenabled (status as boolean) handles MSG_ZENABLED if status and enabled then TimeTick() else Clear() endif endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess dim tmpValueHorz, tmpValueVert as float dim pos as integer pos = find(commObject.curResponse, 0, -1, ":") if pos > 0 then check error val(tmpValueHorz, trim(left(commObject.curResponse, pos))) val(tmpValueVert, trim(mid(commObject.curResponse, pos+1, -1))) on error tmpValueHorz := startRangeHorz tmpValueVert := startRangeVert GMC_ClearException() enderr AddPoint (tmpValueHorz, tmpValueVert) else FailureReceived(trim(commObject.curResponse), GMC_FailUnexpectedData) endif return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure FailureReceived(trim(commObject.curResponse), commObject.curFailureReason) return true endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications, GMC_FailBadCommand or GMC_FailUnexpectedData ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as string, failReason as GMC_FailureReason) return endfunc 'The rest of these functions add functionality to the PC development tool. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in the PC development tool. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by the PC development tool, when you change the attachment 'of an object (i.e. in response to dragging it around the object tree). 'Note: the purpose of this function is to allow you to attach to another 'container, you should not change your parent property or call Tool_Persist 'until you receive a MSG_TOOL_ATTACHED. A MSG_TOOL_ATTACHED will be sent 'in response to an Attach API function call. func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH Attach (me, attachTo) endfunc 'This function is called in response to calling Attach (primarily in a 'handler for MSG_TOOL_ATTACH, but possibly in other places as well_. func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED 'Set our parent property to reflect who we are attached to and save parent := newParent Tool_Persist (parent) 'Save parent DoBuddyAttachHorz() DoBuddyAttachVert() endfunc 'This function is called when the user drags an object instance with the 'mouse in the PC development tool. dx and dy are relative offsets from the current 'location of the object func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE xPos := xPos + dx yPos := yPos + dy Relocate (me, xPos, yPos) 'Save the changes we just made Tool_Persist (xPos) Tool_Persist (yPos) Clear() DoBuddyAttachHorz() DoBuddyAttachVert() endfunc 'This function is called by the PC development tool to obtain the coordinates of 'the resize grips. The arrays xCoords, yCoords, and cursors all contain 0 'elements initially. This means that you should either call redim on those 'arrays and set their values, or declare local arrays, set the values of 'the local arrays, and then assign xCoords, yCoords and cursors to those 'local arrays. Closed indicates whether the Foundry should connect the 'first and last grips to make a closed object. xCoords, yCoords, and 'cursors should all contain the same number of elements when this function 'completes func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolGetHandles (xCoords, yCoords, cursors, closed, xPos, yPos, width, height) endfunc 'This function is called in response to a user moving a resize grip within 'the PC development tool. handleNum is the index into the arrays that were returned 'by the handler for MSG_TOOL_GETHANDLES. You should return true from this 'function func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolMoveHandle (handleNum, dx, dy, xPos, yPos, width, height, me) Clear() DoBuddyAttachHorz() DoBuddyAttachVert() endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. (x1, y1) are the coordinates that the user started his 'drag and (x2, y2) are the coordinates that the mouse was released func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolDragCreate (parentObj, x1, y1, x2, y2, xPos, yPos, width, height, parent) 'Call our MSG_INIT handler StartUp() endfunc #endif private func ScaleResize(newLeng as integer) returns boolean handles AutoScale_ResizeRequest newLeng := newLeng + 2 if (scaleObjHorz == GMC_BuddyRequest) then if newLeng <> width then width := newLeng #if _tool tool_persist(width) #endif Resize (me, width, height) Clear() DoBuddyAttachVert() endif elseif (scaleObjVert == GMC_BuddyRequest) then if newLeng <> height then height := newLeng #if _tool tool_persist(height) #endif Resize (me, width, height) Clear() DoBuddyAttachHorz() endif endif return true endfunc private func BuddyReinit(parm as integer) returns boolean handles AutoScale_BuddyReinit if (scaleObjHorz == GMC_BuddyRequest) and initialAttachRequestHorz then DoBuddyAttachHorz() return true endif if (scaleObjVert == GMC_BuddyRequest) and initialAttachRequestVert then DoBuddyAttachVert() return true endif return false endfunc private dim initialAttachRequestHorz, initialAttachRequestVert as boolean private func DoBuddyAttachHorz() if scaleObjHorz <> empty then initialAttachRequestHorz := true scaleObjHorz.AttachTo (xPos+1, yPos, xPos+width-2, yPos+height-1, startRangeHorz, -> endRangeHorz, true, me, parent, enabled) endif endfunc private func DoBuddyAttachVert() if scaleObjVert <> empty then initialAttachRequestVert := true scaleObjVert.AttachTo (xPos, yPos+1, xPos+width-1, yPos+height-2, endRangeVert, -> startRangeVert, false, me, parent, enabled) endif endfunc Enddef #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œž‹—‹žœš dtd˜ž“–“ ’œ Œœ ˜’œž‹—‹žœš dÀd}˜ž“–“ ’œÐd}˜ž“–“œ’’Š‘–œž‹–‘Œ d dKK K@K} ˜’œž‹—‹žœš d@dC<̹¹¹È̺ÈÉ»»œÉŒÎœÌÎŒÈÈœº¹ÈȹÈÈȹÈÌȹÈÈœº¹È»»¹ÈºÌ¹Ì¹¹¹ÉºººÏÏÏÏ d d d d d d d d d d d d d d d d d d d d d d d d d d d d! d"Àd"}"Œ‹ž‘›ž›Ðd"}" ‹“’šŒŒž˜šŒ d#Àd#}#˜ž“–“ ’œÐd#}# ˜’œžŠ‹Œœž“š d$ d%ÀD%}%š‘ž“š›ÐD%°>% d&ðD&}&š‘ž“š›&1& d'€W'}'š‘ž“š›€'}'‘šˆ‰ž“ÐD'°>'' d(}(š‘ž“š›(}(‘šˆ‰ž“ d)})š‘ž“š€)à^)À)})š‘ž“š›) d*}*…š‘ž“š›€*}*š‘ž“š›* d+ d,^,}, Œœž“š•—…à,},š’‹†^, d-}- Œœž“š•—…à-}-š‘ž“š›Ð-}-š‘ž“š› d.@^. d/^/}/ Œœž“š•‰š‹à/}/š’‹†^/ d0}0 Œœž“š•‰š‹à0}0š‘ž“š›Ð0}0š‘ž“š› d1@^1 d2ÐW2 d3 d4ÀD4}4žš‘‹ÐD4à>4 d5ðD5}5žš‘‹5P5 d6€W6}6žš‘‹€6}6‘šˆ‰ž“ÐD6à>66 d7}7žš‘‹7}7‘šˆ‰ž“ d8}8ž‹‹žœ—€8à^8À8}8žš‘‹8 d9ÐW9 d: d;ÀD;};‡ŒÐD;€>; d<ðD<}<‡Œ<< d=€W=}=‡Œ€=}=‘šˆ‰ž“ÐD=€>== d>}>‡Œ>}>‘šˆ‰ž“ d?}?š“œž‹š€?à^?À?}?‡ŒÀ?}?†Œ? d@}@œ“šž€@@ dA}A›Š››†ž‹‹žœ——…€AA dB}B›Š››†ž‹‹žœ—‰š‹€BB dCÐWC dD dEÀDE}E†ŒÐDE€>E dFðDF}F†ŒFF dG€WG}G†Œ€G}G‘šˆ‰ž“ÐDG€>GG dH}H†ŒH}H‘šˆ‰ž“ dI}Iš“œž‹š€Ià^IÀI}I‡ŒÀI}I†ŒI dJ}Jœ“šž€JJ dK}K›Š››†ž‹‹žœ——…€KK dL}L›Š››†ž‹‹žœ—‰š‹€LL dMÐWM dN dOÀDO}Oˆ–›‹—ÐDO€>O dPðDP}Pˆ–›‹—PP dQ€WQ}Qˆ–›‹—€Q}Q‘šˆ‰ž“ÐDQ€>QQ dR}Rˆ–›‹—R}R‘šˆ‰ž“ dS}SšŒ–…š€Sà^SÀS}Sˆ–›‹—ÀS}S—š–˜—‹S dT}Tœ“šž€TT dU}U›Š››†ž‹‹žœ——…€UU dV}V›Š››†ž‹‹žœ—‰š‹€VV dWÐWW dX dYÀDY}Y—š–˜—‹ÐDY€>Y dZðDZ}Z—š–˜—‹ZZ d[€W[}[—š–˜—‹€[}[‘šˆ‰ž“ÐD[€>[[ d\}\—š–˜—‹\}\‘šˆ‰ž“ d]}]šŒ–…š€]à^]À]}]ˆ–›‹—À]}]—š–˜—‹] d^}^œ“šž€^^ d_}_›Š››†ž‹‹žœ——…€__ d`}`›Š››†ž‹‹žœ—‰š‹€`` daÐWa db dcÀDc}c ›šœ“ÐDcð>c ddðDd}d ›šœ“d}d ˜ ˆ—–‹š de€We}e ›šœ“€e}e‘šˆ‰ž“ÐDeð>ee df}f ›šœ“f}f‘šˆ‰ž“ dg}gšš‘›š€gà^gg dhÐWh di dj dk dl dmÀDm}m ‹žœšœ“ÎÐDmð>m dnðDn}n ‹žœšœ“În}n ˜ ˜šš‘ do€Wo}o ‹žœšœ“Î€o}o‘šˆ‰ž“ÐDoð>oo dp}p ‹žœšœ“Îp}p‘šˆ‰ž“ dq}q šœž“œœ“Œ€qq drÐWr ds dt du dv dw dxÀDx}x ‹žœšœ“ÍÐDxð>x dyðDy}y ‹žœšœ“Íy}y ˜ †š““ˆ dz€Wz}z ‹žœšœ“Í€z}z‘šˆ‰ž“ÐDzð>zz d{}{ ‹žœšœ“Í{}{‘šˆ‰ž“ d|}| šœž“œœ“Œ€|| d}ÐW} d~ d d€ d d‚ÀD‚}‚ ‹žœšœ“ÌÐD‚ð>‚ dƒðDƒ}ƒ ‹žœšœ“Ìƒ}ƒ˜ ‘ž‰† d„€W„}„ ‹žœšœ“Ì€„}„‘šˆ‰ž“ÐD„ð>„„ d…}… ‹žœšœ“Ì…}…‘šˆ‰ž“ d†}† šœž“œœ“Œ€†† d‡ÐW‡ dˆ d‰ dŠ d‹ÀD‹}‹ œŠŒœ“ÐD‹ð>‹ dŒðDŒ}Œ œŠŒœ“Œ}Œ˜ š› d€W} œŠŒœ“€}‘šˆ‰ž“ÐDð> dŽ}Ž œŠŒœ“Ž}Ž‘šˆ‰ž“ d}šš‘›š€à^ dÐW d‘ d’ d“ d”ÀD”}” Œ—ˆœŠŒÐD”°>” d•ðD•}• Œ—ˆœŠŒ•A• d–€W–}– Œ—ˆœŠŒ€–}–‘šˆ‰ž“ÐD–°>–– d—}— Œ—ˆœŠŒ—}—‘šˆ‰ž“ d˜}˜šš‘›š€˜à^˜˜ d™ÐW™ dš d›ÀD›}›˜œ“ÐD›ð>› dœðDœ}œ˜œ“œ}œ ˜ “žœ” d€W}˜œ“€}‘šˆ‰ž“ÐDð> dž}ž˜œ“ž}ž‘šˆ‰ž“ dŸ}Ÿšš‘›š€Ÿà^ŸŸ d ÐW  d¡ d¢ d£ÀD£}£ ‹ž‘Œžš‘‹ÐD£°>£ d€ðD€}€ ‹ž‘Œžš‘‹€A€ d¥€W¥}¥ ‹ž‘Œžš‘‹€¥}¥‘šˆ‰ž“ÐD¥°>¥¥ dŠ}Š ‹ž‘Œžš‘‹Š}Š‘šˆ‰ž“ d§}§šš‘›š€§à^§§ dšÐWš d© dª d« d¬ d­ d® d¯ d° d± d²ÀD²}²™žŒ‹›žˆÐD²°>² d³ðD³}³™žŒ‹›žˆ³A³ dŽ€WŽ}Ž™žŒ‹›žˆ€Ž}Ž‘šˆ‰ž“ÐDް>ސŽ dµ}µ™žŒ‹›žˆµ}µ‘šˆ‰ž“ d¶}¶šš‘›š€¶à^¶¶ d·ÐW· dž d¹ dº d» dŒ dœÀDœ}œ‘Š’‹žœš–‘‹ŒÐDœ€>œ dŸðDŸ}Ÿ‘Š’‹žœš–‘‹ŒŸŸd d¿€W¿}¿‘Š’‹žœš–‘‹Œ€¿}¿‘šˆ‰ž“ÐD¿€>¿¿ dÀ}Àœ“šž€ÀÀ dÁÐWÁ d dà dÄ dÅ dÆ dÇ dÈ dÉÀDÉ}ÉŒ‹ž‹ž‘˜š—…ÐDɐ>É dÊðDÊ}ÊŒ‹ž‹ž‘˜š—…ÊÊ dˀWË}ËŒ‹ž‹ž‘˜š—…€Ë}Ë‘šˆ‰ž“ÐDː>ːË dÌ}ÌŒ‹ž‹ž‘˜š—…Ì}Ì‘šˆ‰ž“ dÍ}Í ‰š–™†“–’–‹Œ€͐Í dÎ}Μ“šž€ΐÎ dÏÐWÏ dÐ dÑ dÒ dÓ dÔ dÕ dÖ d×ÀD×}× š‘›ž‘˜š—…ÐDא>× dØðDØ}Ø š‘›ž‘˜š—…ØØd dـWÙ}Ù š‘›ž‘˜š—…€Ù}Ù‘šˆ‰ž“ÐDِ>ِÙ dÚ}Ú š‘›ž‘˜š—…Ú}Ú‘šˆ‰ž“ dÛ}Û ‰š–™†“–’–‹Œ€ېÛ dÜ}Üœ“šž€ܐÜ dÝÐWÝ dÞ dß dà dá dâ dã dä dåÀDå}匋ž‹ž‘˜š‰š‹ÐDå>å dæðDæ}挋ž‹ž‘˜š‰š‹ææ dç€Wç}猋ž‹ž‘˜š‰š‹€ç}瑚ˆ‰ž“ÐDç>çç dè}茋ž‹ž‘˜š‰š‹è}葚ˆ‰ž“ dé}é ‰š–™†“–’–‹Œ€éé dê}êœ“šž€êê dëÐWë dì dí dî dï dð dñ dò dóÀDó}ó š‘›ž‘˜š‰š‹ÐDó>ó dôðDô}ô š‘›ž‘˜š‰š‹ôôd dõ€Wõ}õ š‘›ž‘˜š‰š‹€õ}õ‘šˆ‰ž“ÐDõ>õõ dö}ö š‘›ž‘˜š‰š‹ö}ö‘šˆ‰ž“ d÷}÷ ‰š–™†“–’–‹Œ€÷÷ dø}øœ“šž€øø dùÐWù dú dû dü dý dþ dÿ d d dÀD} œ’’•šœ‹ÐDà>}˜ž“–“œ’’Š‘–œž‹–‘ dðD} œ’’•šœ‹}š’‹† d d d d dÀD} –‘Š‹‹†š—…ÐD} ˜’œ ›ž‹ž‹†š d ðD }  –‘Š‹‹†š—… }  ˜’œ Œ–‹–‘ d €W }  –‘Š‹‹†š—…€ } ‘šˆ‰ž“ÐD }  ˜’œ ›ž‹ž‹†š  d }  –‘Š‹‹†š—… } ‘šˆ‰ž“ d }  œ’’ž‘›—… } ˜’œ›ž‹ž‹†š‹œ’’ž‘›€ }  –‘Š‹‹†š—…À } –‘Š‹ŒŠœš—…À A À C   d ÐW  d d d d dÀD}–‘Š‹ŒŠœš—…ÐD}˜’œ ž‡–Œ dðD}–‘Š‹ŒŠœš—…} ˜’œ ž‡–Œ ‡ d€W}–‘Š‹ŒŠœš—…€}‘šˆ‰ž“ÐD}˜’œ ž‡–Œ d}–‘Š‹ŒŠœš—…}‘šˆ‰ž“ d} œ’’ž‘›—…}˜’œ›ž‹ž‹†š‹œ’’ž‘›€} –‘Š‹‹†š—…À}–‘Š‹ŒŠœš—…ÀAÀC dÐW d`KÀD} œ’’ž‘›—…ÐDÀ> d d d d dÀD} –‘Š‹‹†š‰š‹ÐD} ˜’œ ›ž‹ž‹†š dðD} –‘Š‹‹†š‰š‹} ˜’œ Œ–‹–‘ d€W} –‘Š‹‹†š‰š‹€}‘šˆ‰ž“ÐD} ˜’œ ›ž‹ž‹†š d }  –‘Š‹‹†š‰š‹ } ‘šˆ‰ž“ d!}! œ’’ž‘›‰š‹!}!˜’œ›ž‹ž‹†š‹œ’’ž‘›€!}! –‘Š‹‹†š‰š‹À!}!–‘Š‹ŒŠœš‰š‹À!A!À!C!! d"ÐW" d# d$ d% d& d'ÀD'}'–‘Š‹ŒŠœš‰š‹ÐD'}'˜’œ ž‡–Œ d(ðD(}(–‘Š‹ŒŠœš‰š‹(}( ˜’œ ž‡–Œ † d)€W)})–‘Š‹ŒŠœš‰š‹€)})‘šˆ‰ž“ÐD)})˜’œ ž‡–Œ) d*}*–‘Š‹ŒŠœš‰š‹*}*‘šˆ‰ž“ d+}+ œ’’ž‘›‰š‹+}+˜’œ›ž‹ž‹†š‹œ’’ž‘›€+}+ –‘Š‹‹†š‰š‹À+}+–‘Š‹ŒŠœš‰š‹À+A+À+C++ d,ÐW, d-`K-ÀD-}- œ’’ž‘›‰š‹ÐD-À>- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9ÀD9}9 ““–‘‹š‰ž“ÐD9€>9 d:ðD:}: ““–‘‹š‰ž“::è d;€W;}; ““–‘‹š‰ž“€;};‘šˆ‰ž“ÐD;€>;; d<^<}<‘šˆ‰ž“<<^< d=}= ““–‘‹š‰ž“== d>}>Š‘š˜–Œ‹š’Œ˜—ž‘›“š€>à^>À>}> ’Œ˜ ‹–’š‹–œ”À>>> d?0^? d@}@ ““–‘‹š‰ž“@}@‘šˆ‰ž“ dA}Aš˜–Œ‹š’Œ˜—ž‘›“š€Aà^AÀA}A ’Œ˜ ‹–’š‹–œ”ÀA}A‘šˆ‰ž“ðAAA dB@^B dCÐWC dD dE dF dG dH dIÀDI}I Œœž“š•—…ÐDIà>I}I ˜’œžŠ‹Œœž“š dJðDJ}J Œœž“š•—…J}Jš’‹† dK€WK}K Œœž“š•—…€K}K‘šˆ‰ž“ÐDK}K ˜’œžŠ‹Œœž“šK dL^L}L Œœž“š•—…àL}Lš’‹†^L dM}M Œœž“š•—…àM}Mš‘ž“š›ÐMAM dN@^N dO dP}P Œœž“š•—…P}P‘šˆ‰ž“ dQ}Q›Š››†ž‹‹žœ——…€QQ dRÐWR dS dT dU dV dW dXÀDX}X Œœž“š•‰š‹ÐDXà>X}X ˜’œžŠ‹Œœž“š dYðDY}Y Œœž“š•‰š‹Y}Yš’‹† dZ€WZ}Z Œœž“š•‰š‹€Z}Z‘šˆ‰ž“ÐDZ}Z ˜’œžŠ‹Œœž“šZ d[^[}[ Œœž“š•‰š‹à[}[š’‹†^[ d\}\ Œœž“š•‰š‹à\}\š‘ž“š›Ð\A\ d]@^] d^ d_}_ Œœž“š•‰š‹_}_‘šˆ‰ž“ d`}`›Š››†ž‹‹žœ—‰š‹€`` daÐWa db dc dd€Wd}dŒ‹ž‹Š€dd deÀWe}e’Œ˜ –‘–‹ df}fš“œž‹š€fà^fÀf}f‡ŒÀf}f†Œf dg}gšŒ–…š€gà^gÀg}gˆ–›‹—Àg}g—š–˜—‹g dh}hš‘ž“š€hà^hÀh}hš‘ž“š›h di}iž‹‹žœ—€ià^iÀi}ižš‘‹i dj}j˜’œ ‰š–™†œ’’•€j}j œ’’•šœ‹j dk dl}l ‰š–™†“–’–‹Œ€ll dm}m ›–’žž†Œ€mm dn}n ““–‘‹š‰ž“€n}n ““–‘‹š‰ž“n do}o –‘Š‹‹†š—…€o}o –‘Š‹‹†š—…o dp}p –‘Š‹‹†š‰š‹€p}p –‘Š‹‹†š‰š‹p dq dr}r›Š››†ž‹‹žœ——…€rr ds}s›Š››†ž‹‹žœ—‰š‹€ss dtÐWt du dv€Wv}v›žˆ€vv dwÀWw}w’Œ˜ ›žˆ dx dyÀDy}y–Ày}y–ÍÀy}y’ž‡ÐDy€>y dz d{}{ Œš‹™˜œ“€{}{ ›šœ“{ d|}| Œš‹˜œ“€|}|˜œ“| d}}}Œš‹‹ž‘Œžš‘‹€}}}˜œ“} d~}~ŠŒš‹ž‘Œžš‘‹€~}~ ‹ž‘Œžš‘‹~ d d€}€›žˆ‡€€}€‡ŒÀ€}€†ŒÀ€}€‡Œ°€}€ˆ–›‹—Ѐ€À€}€†Œ°€}€—š–˜—‹Ð€€€ d d‚^‚}‚™žŒ‹›žˆ^‚ dƒ}ƒ Œš‹™˜œ“€ƒ}ƒ ‹žœšœ“Îƒ d„}„ ›žˆ“†˜‘€„}„“𙋀„}„‡‹ŒÀ„}„ –‘Œš‹–›‡„À„}„“𙋀„}„†‹ŒÀ„}„ –‘Œš‹–›‡„À„}„“† ‘œ‘‘šœ‹„ d…0^… d†}†’ž‡Ð†}† –‘Œš‹–›‡Ð†† d‡P^‡}‡–Ї‡ W‡}‡’ž‡ dˆ}ˆ–͈}ˆ–Јˆ d‰}‰ Œš‹™˜œ“€‰}‰œ“Œ°‰}‰’ž‡Ð‰}‰–ÍЉ‰ dŠ}Š›žˆ“–‘š€Š}Ї‹Œ°Š}Š–ÐŠÀŠ}І‹Œ°Š}Š–ÐŠÀŠ}Ї‹Œ°Š}Š–ÍЊÀŠ}І‹Œ°Š}Š–ÍЊŠ d‹`^‹ dŒ@^Œ d dŽ^Ž}Ž Œ—ˆœŠŒ^Ž d} Œš‹™˜œ“€} œŠŒœ“ d^} –‘Œš‹–›‡à^ d‘}‘–‘}‘ –‘Œš‹–›‡Ð‘‘ d’}’›žˆ‡€’}’‡‹Œ°’}’–Ð’Ð’’À’}’†‹Œ°’}’–Ð’Ð’’À’}’‡‹Œ°’}’–Ð’°’’À’}’†‹Œ°’}’–Ð’°’’’ d“@^“ d”@^” d•ÐW• d– d—`K—ÀD—}—‡‹Œ°—ЗÀ—}—†‹Œ°—ЗÐD—€>— d˜`K˜ÀD˜}˜œ“Œ°˜Ð˜ÐD˜ð>˜ d™`K™ÀD™}™ –‘Œš‹–›‡ÐD™€>™ dš`Kš€Wš}šœ“šž€šš d›}›š›–’€›}›‡‹ŒÀ››› dœ}œš›–’€œ}œ†‹ŒÀœœœ d}š›–’€}œ“ŒÀ dž}ž –‘Œš‹–›‡žž dŸ}Ÿ ›–’žž†Œ€ŸŸ d ÐW  d¡ d¢`K¢€W¢}¢ ‰š–™†“–’–‹Œ€¢¢ d£^£}£Œ‹ž‹ž‘˜š—…У}£ š‘›ž‘˜š—…^£ d€}€ š‘›ž‘˜š—…€}€Œ‹ž‹ž‘˜š—…°€€ d¥@^¥ dŠ d§^§}§Œ‹ž‹ž‘˜š‰š‹Ð§}§ š‘›ž‘˜š‰š‹^§ dš}š š‘›ž‘˜š‰š‹š}šŒ‹ž‹ž‘˜š‰š‹°šš d©@^© dªÐWª d« d¬`K¬€W¬}¬ ›–’žž†Œ€¬¬ d­}­š›–’€­}­‡‹ŒÀ­}­‘Š’‹žœš–‘‹Œ­ d®}®š›–’€®}®†‹ŒÀ®}®‘Š’‹žœš–‘‹Œ® d¯}¯š›–’€¯}¯œ“ŒÀ¯}¯‘Š’‹žœš–‘‹Œ¯ d° d±^±}± –‘Œš‹–›‡à±}±‘Š’‹žœš–‘‹Œ^± d²}² –‘Œš‹–›‡²}²‘Š’‹žœš–‘‹Œ d³@^³ dŽ dµ„dµ ‹“ d¶}¶Š“ž‹š™“ž†Š‹‰–šˆ€¶¶ d· d· dž d¹}¹ šœž“œœ“Œ€¹¹ dºÐWº d» dŒ„dŒ ‹“ dœ`Kœ€Wœ}œŠ“ž‹š™“ž†Š‹‰–šˆ€œœ dŸÀDŸ}Ÿ‹ÐDŸ>Ÿ d¿ÀD¿}¿–ÐD¿€>¿ dÀÀDÀ}ÀŒ‹ÀÀ}ÀŒ‹ÍÐDÀ>À dÁÀDÁ}Áž›–ŠŒÐDÁ>Á dÂÀDÂ}œ‡ÀÂ}œ†ÐD> dà dÄ^Ä}đВ‹žœš–‘‹ŒàÄÄ^Ä dÅ}ÅŒ‹ÐÅ€ÅÅ Å}ŏ–ÅðÅ€Å}őВ‹žœš–‘‹ŒÅ dÆ}Æ –‘Œš‹–›‡ÆÆ dÇ}Çœ‡ÐÇ}LJŒ°Ç}Lj–›‹—ðÇÇ dÈ}Èœ†ÐÈ}ȆŒ°È}È—š–˜—‹ðÈÈ dÉ^É}Ɉ–›‹—ÀÉ}É—š–˜—‹^É dÊ}ʍž›–ŠŒÐÊ€Ê}ʈ–›‹—ÐÊʐÊðÊÊ dË0^Ë dÌ}̍ž›–ŠŒÐÌ€Ì}Ì—š–˜—‹ÐÌ̐ÌðÌÌ dÍ@^Í dÎ}ÎŒ‹ÍÐÎ}΍ž›–ŠŒ Î€Î΀?ðÎ}Î‘Š’‹žœš–‘‹ŒÎ dÏ}ύž›–ŠŒÏÏ dÐ dÑP^Ñ}Ñ‹ÐÑÑ WÑÑ Ñ}я–p^Ñ}ÑŒ‹ dÒ}Ò‡‹Œ°Ò}Ò –‘Œš‹–›‡ÐÒÐÒ}Òœ‡°Ò€Ò}ҍž›–ŠŒ Ò}ÒœŒ€Ò}Ò‹ÒÒ dÓ}Ó†‹Œ°Ó}Ó –‘Œš‹–›‡ÐÓÐÓ}Óœ†°Ó€Ó}Ӎž›–ŠŒ Ó}ÓŒ–‘€Ó}Ó‹ÓÓ dÔ}Ô –‘Œš‹–›‡Ô}Ô –‘Œš‹–›‡°ÔÔ dÕ^Õ€Õ}Õ –‘Œš‹–›‡ðÕ}Õ‘Š’‹žœš–‘‹ŒÕ^Õ dÖÀ]Ö d×@^× dØ}؍ž›–ŠŒØ}؍ž›–ŠŒ°Ø}ØŒ‹Í dÙ`^Ù dÚ@^Ú dÛÐWÛ dÜ dÜ dÝ dÞ`KÞ€WÞ}Þ šœž“œœ“Œ€ÞÞ dßÀDß}ߍÎÀß}ߘÎÀß}ߝÎÐD߀>ß dàÀDà}àÍÀà}à˜ÍÀà}àÍÐDà€>à dáÀDá}áÌÀá}á˜ÌÀá}áÌÐDá€>á dâÀDâ}⛍Àâ}⛘Àâ}⛝ÐDâ>â dãÀDã}ã–Àã}ã’ž‡ÐDã€>ã däÀDä}ä‹’™“‹ÐDä>ä dåÀDå}匍Àå}匘Àå}匝ÐDå>å dæ dç}çÎÐç}ç ‹žœšœ“Îðçç dè}èÍÐè}è ‹žœšœ“Íðèè dé}éÌÐé}é ‹žœšœ“Ìðéé dê dë}ë˜ÎÐë€ë}ë ‹žœšœ“Î`ëP?ë€ë!ëëëðëë dì}ì˜ÍÐì€ì}ì ‹žœšœ“Í`ìP?ì€ì!ìììðìì dí}í˜ÌÐí€í}í ‹žœšœ“Ì`íP?í€í!íííðíí dî dï}ïÎÐï}ï ‹žœšœ“Î`ïP?ï€ï!ïï dð}ðÍÐð}𠋍žœšœ“Í`ðP?ð€ð!ðð dñ}ñÌÐñ}ñ ‹žœšœ“Ì`ñP?ñ€ñ!ññ dò dó}󒞇Ðó€ó}ó‘Š’‹žœš–‘‹ŒÐóóóðóó dô dõ^õ}õ’ž‡àõõ^õ dö}ö‹’™“‹Ðöö€?ðö}ö’ž‡ d÷}÷›Ð÷€÷}÷ÍÐ÷}÷Î÷ ÷}÷‹’™“‹ dø}ø›˜Ðø€ø}ø˜ÍÐø}ø˜Îø ø}ø‹’™“‹ dù}ù›Ðù€ù}ùÍÐù}ùÎù ù}ù‹’™“‹ dú dû dü}üŒÐü}üÎ°üü? dý}ýŒ˜Ðý}ý˜Î°ýý? dþ}þŒÐþ}þÎ°þþ? dÿP^ÿ}ÿ–Ðÿÿ Wÿ}ÿ’ž‡ d}œ“Œ°}–ÐÐ  €>€}Œ° €>€}Œ˜°€>€}Œ d}ŒÐ}Œ°}› d}Œ˜Ð}Œ˜°}›˜ d}ŒÐ}Œ°}› d`^ d@^ d}’ž‡Ð}‘Š’‹žœš–‘‹ŒÐ}’ž‡ d^}’ž‡à^ d}‹’™“‹Ð€?ð}’ž‡ d } ›Ð € } ÌÐ } Í   } ‹’™“‹ d } ›˜Ð € } ˜ÌÐ } ˜Í   } ‹’™“‹ d } ›Ð € } ÌÐ } Í   } ‹’™“‹ d  d } ŒÐ } Í°  ? d}Œ˜Ð}˜Í°? d}ŒÐ}Í°? d}’ž‡Ð}‘Š’‹žœš–‘‹ŒÐ dP^}–Ð}– W}’ž‡ d}œ“Œ°}–ÐÐ  €>€}Œ° €>€}Œ˜°€>€}Œ d}ŒÐ}Œ°}› d}Œ˜Ð}Œ˜°}›˜ d}ŒÐ}Œ°}› d`^ d@^ d d}šš‘›š€à^ dÐW d d`K€W}ž››–‘‹€}‡ÐD>À}†ÐD> dÀD}Œœ‡À}Œœ†ÐD€> d d„d ‹“ d ð^  d! d! d" d#}#Œœ‡Ð#}#‡Œ°##°#€#€#}#ˆ–›‹—Ð### #€#}#‡Ð#}#Œ‹ž‹ž‘˜š—…#ð#€#}# š‘›ž‘˜š—…Ð#}#Œ‹ž‹ž‘˜š—…## d$ d% d&}&Œœ†Ð&}&†Œ°&}&—š–˜—‹Ð&&Ð&€&€&}&—š–˜—‹Ð&&& &€&}&†Ð&}&Œ‹ž‹ž‘˜š—…&ð&€&}& š‘›ž‘˜š—…Ð&}&Œ‹ž‹ž‘˜š—…&& d' d(^(}( –‘Œš‹–›‡Ð(}(‘Š’‹žœš–‘‹Œ^( d)}) Œš‹žž†›ž‹ž€)})‡‹ŒÀ))À)})‡‹ŒÀ))À)Ð))) d*}* Œš‹žž†›ž‹ž€*}*†‹ŒÀ**À*}*†‹ŒÀ**À*Ð*** d+}+‡‹Œ°+}+‘Š’‹žœš–‘‹ŒÐ++Ð+Ð+}+Œœ‡ d,},†‹Œ°,},‘Š’‹žœš–‘‹ŒÐ,,Ð,Ð,},Œœ† d-0^- d.}.‡‹Œ°.}. –‘Œš‹–›‡Ð.Ð.}.Œœ‡ d/}/†‹Œ°/}/ –‘Œš‹–›‡Ð/Ð/}/Œœ† d0}0 –‘Œš‹–›‡0}0 –‘Œš‹–›‡°00 d1@^1 d2 d3 d4 d5}5šš‘›š€5à^55 d6ÐW6 d7 d8 d9 d:`K:€W:}:‹–’š‹–œ”€:: d;ÀW;}; ’Œ˜ ‹–’š‹–œ” d< d=}= œ’’•šœ‹à=}=Œš‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€=}= œ’’ž‘›—…°=}= œ’’ž‘›‰š‹À=à^=À==À=== d>ð^> d?ÐW? d@ dA`KA€WA}A…š‘ž“š›€A}AŒ‹ž‹ŠŒÐDA°>AA dBÀWB}B ’Œ˜ …š‘ž“š› dC dD^D}DŒ‹ž‹ŠŒ`D}Dš‘ž“š›^D dE}E‹–’š‹–œ”€EE dF0^F dG}Gœ“šž€GG dH@^H dIÐWI dJ dK`KK€WK}KŒŠœœšŒŒ€K}Kž’ÐDK€>KK°WK°>K dLÀWL}L˜’œ œ’’ŒŠœœšŒŒ dM dNÀDN}N ‹’‰ž“Šš—…ÀN}N ‹’‰ž“Šš‰š‹ÐDN>N dOÀDO}OŒÐDO€>O dP dQ}QŒÐQ}Q™–‘›€Q}Q œ’’•šœ‹àQ}Q œŠšŒ‘ŒšÀQQÀQÐQQÀQCQŐQ dR^R}RŒàRR^R dS°^S_S dT}T‰ž“€T}T ‹’‰ž“Šš—…ÀT}T‹–’€T}T“𙋀T}T œ’’•šœ‹àT}T œŠšŒ‘ŒšÀT}TŒTTT dU}U‰ž“€U}U ‹’‰ž“Šš‰š‹ÀU}U‹–’€U}U’–›€U}U œ’’•šœ‹àU}U œŠšŒ‘ŒšÀU}UŒ°UUÀUÐUUUUU dVÀ^V_V dW}W ‹’‰ž“Šš—…W}WŒ‹ž‹ž‘˜š—… dX}X ‹’‰ž“Šš‰š‹X}XŒ‹ž‹ž‘˜š‰š‹ dY}Y˜’œ œ“šžš‡œš‹–‘€YY dZÐ^Z d[ d\}\ž››–‘‹€\}\ ‹’‰ž“Šš—…À\}\ ‹’‰ž“Šš‰š‹\ d]0^] d^}^™ž–“Šššœš–‰š›€^}^‹–’€^}^ œ’’•šœ‹à^}^ œŠšŒ‘Œš^À^}^˜’œ ™ž–“Š‘š‡šœ‹š››ž‹ž^ d_@^_ d` dað^a1a dbÐWb dc dd`Kd€Wd}d™ž–“Šš€d}dž’ÐDd€>dd°Wd°>d deÀWe}e˜’œ œ’’™ž–“Šš df dg}g™ž–“Šššœš–‰š›€g}g‹–’€g}g œ’’•šœ‹àg}g œŠšŒ‘ŒšgÀg}g œ’’•šœ‹àg}gœŠ™ž–“ŠššžŒ‘g dhð^h1h diÐWi dj dk dl dm dn do dp€Wp}p™ž–“Šššœš–‰š›€p}pšŒ‘ŒšÐDpÀ>pÀp}p ™ž–“šžŒ‘ÐDp}p˜’œ ™ž–“ŠššžŒ‘p dqð^q drÐWr ds dt du dv dw dx dy dz d{ d| d} d~ d d€„d€ ‹“ d d‚ dƒ d„ d… d† d‡€W‡}‡ ‹“ž‹‹žœ—€‡}‡ž‹‹žœ—‹ÐD‡à>‡‡ dˆÀWˆ}ˆ’Œ˜ ‹“ ž‹‹žœ— d‰ dŠ}Šž‹‹žœ—€Šà^ŠÀŠ}Šž‹‹žœ—‹Š d‹ÐW‹ dŒ d dŽ d€W} ‹“ž‹‹žœ—š›€} ‘šˆžš‘‹ÐDà> dÀW}’Œ˜ ‹“ ž‹‹žœ—š› d‘ d’ d“}“žš‘‹“}“ ‘šˆžš‘‹ d”}” ‹“ šŒ–Œ‹€”}”žš‘‹” d•}•›Š››†ž‹‹žœ——…€•• d–}–›Š››†ž‹‹žœ—‰š‹€–– d—ÐW— d˜ d™ dš d› dœ€Wœ}œ‹“’‰š€œ}œ›‡ÐDœ€>œÀœ}œ›†ÐDœ€>œœ dÀW} ’Œ˜ ‹“ ’‰š dž dŸ}Ÿ‡ŒŸ}Ÿ‡Œ°Ÿ}Ÿ›‡ d } †Œ } †Œ° } ›† d¡}¡š“œž‹š€¡à^¡À¡}¡‡ŒÀ¡}¡†Œ¡ d¢ d£ d€}€ ‹“ šŒ–Œ‹€€}€‡Œ€ d¥}¥ ‹“ šŒ–Œ‹€¥}¥†Œ¥ dŠ d§}§œ“šž€§§ dš}š›Š››†ž‹‹žœ——…€šš d©}©›Š››†ž‹‹žœ—‰š‹€©© dªÐWª d« d¬ d­ d® d¯ d° d± d² d³ dŽ dµ€Wµ}µ‹“˜š‹—ž‘›“šŒ€µ}µ‡œ›Œ°µÐµÐDµWµ Wµ€>µÀµ}¶†œ›Œ°¶Ð¶ÐD¶W¶ W¶€>¶À¶}·œŠŒŒ°·Ð·ÐD·W· W·}· ˜Š–œŠŒŒÀ·}žœ“Œš›ÐDžWž Wž°>žž d¹ÀW¹}¹’Œ˜ ‹“ ˜š‹—ž‘›“šŒ dº d» dŒ dœ dŸ}Ÿ ‹“˜š‹—ž‘›“šŒ€Ÿ}Ÿ‡œ›ŒÀŸ}Ÿ†œ›ŒÀŸ}ŸœŠŒŒÀŸ}Ÿœ“Œš›ÀŸ}Ÿ‡ŒÀŸ}Ÿ†ŒÀŸ}Ÿˆ–›‹—ÀŸ}Ÿ—š–˜—‹Ÿ d¿ dÀÐWÀ dÁ d dà dÄ dÅ dÆ€WÆ}Æ‹“’‰š—ž‘›“š€Æ}Æ —ž‘›“š‘Š’ÐDƐWÆ WÆ€>ÆÀÆ}Æ›‡ÐDÆ€>ÆÀÆ}Æ›†ÐDÆ€>ÆÆ dÇÀWÇ}Ç’Œ˜ ‹“ ’‰š—ž‘›“š dÈ dÉ dÊ dË dÌ}Ì ‹“’‰š—ž‘›“š€Ì}Ì —ž‘›“š‘Š’ÀÌ}Ì›‡ÀÌ}Ì›†ÀÌ}̇ŒÀÌ}̆ŒÀÌ}̈–›‹—ÀÌ}Ì—š–˜—‹ÀÌà^ÌÌ dÍ}Íœ“šž€ÍÍ dÎ}ːŠ››†ž‹‹žœ——…€ÎÎ dÏ}Ï›Š››†ž‹‹žœ—‰š‹€ÏÏ dÐÐWÐ dÑ dÒ dÓ dÔ dÕ dÖ d× dØ dÙ€WÙ}Ù‹“›ž˜œšž‹š€Ù}Ù žš‘‹•ÐDÙà>ÙÀÙ}Ù‡ÎÐDÙ€>ÙÀÙ}Ù†ÎÐDÙ€>ÙÀÙ}Ú‡ÍÐDÚ€>ÚÀÚ}Ú†ÍÐDÚ€>ÚÚ dÛÀWÛ}Û’Œ˜ ‹“ ›ž˜œšž‹š dÜ dÝ dÞ dß dà}à ‹“›ž˜œšž‹š€à}à žš‘‹•Àà}à‡ÎÀà}à†ÎÀà}à‡ÍÀà}à†ÍÀà}à‡ŒÀà}à†ŒÀà}àˆ–›‹—Àà}à—š–˜—‹Àà}àžš‘‹à dá dâ dã}㌋ž‹Š€ãã däÐWä då dæ dæ dç dè`Kè€Wè}è Œœž“ššŒ–…š€è}葚ˆ“š‘˜ÐDè€>èè°Wè°>è déÀWé}鞊‹Œœž“š šŒ–…ššŽŠšŒ‹ dê dë}둚ˆ“š‘˜ë}둚ˆ“š‘˜°ëë dì^ì€ì}ì Œœž“š•—…Ðì}옒œ Š››†šŽŠšŒ‹ì^ì dí^í}푚ˆ“š‘˜àí}툖›‹—^í dî}›‹—î}ˆ“š‘˜ dï„dï ‹“}ï ‹“ šŒ–Œ‹€ï}›‹—ï dï dð}ðšŒ–…š€ðà^ðÀð}ðˆ–›‹—Àð}ð—š–˜—‹ð dñ}ñœ“šž€ññ dò}ò›Š››†ž‹‹žœ—‰š‹€òò dó@^ó dô ^ô€ô}ô Œœž“š•‰š‹Ðô}ô˜’œ Š››†šŽŠšŒ‹ô^ô dõ^õ}õ‘šˆ“š‘˜àõ}õ—š–˜—‹^õ dö}ö—š–˜—‹ö}ö‘šˆ“š‘˜ d÷„d÷ ‹“}÷ ‹“ šŒ–Œ‹€÷}÷—š–˜—‹÷ d÷ dø}øšŒ–…š€øà^øÀø}øˆ–›‹—Àø}ø—š–˜—‹ø dù}ùœ“šž€ùù dú}ú›Š››†ž‹‹žœ——…€úú dû@^û dü@^ü dý dþð^þ1þ dÿÐWÿ d d`K€W} Š››†š–‘–‹€}ž’ÐD€>°W°> dÀW}žŠ‹Œœž“š Š››†š–‘–‹ d d^€} Œœž“š•—…Ð}˜’œ Š››†šŽŠšŒ‹`}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹—…^ d}›Š››†ž‹‹žœ——…€ dð^1 d@^ d^€} Œœž“š•‰š‹Ð}˜’œ Š››†šŽŠšŒ‹`}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹‰š‹^ d } ›Š››†ž‹‹žœ—‰š‹€   d ð^ 1  d @^  d ð^ A  d ÐW  d d`KÀD}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹—…À}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹‰š‹ÐD°> d`K€W}›Š››†ž‹‹žœ——…€ d^} Œœž“š•—…à}š’‹†^ d}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹—…1 d} Œœž“š•—…à}ž‹‹žœ—‹€}‡Œ°À}†ŒÀ}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ}Œ‹ž‹ž‘˜š—…À} š‘›ž‘˜š—…À1Àà^À}žš‘‹À}š‘ž“𛐠d@^ dÐW d`K€W}›Š››†ž‹‹žœ—‰š‹€ d^} Œœž“š•‰š‹à}š’‹†^ d}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹‰š‹1 d} Œœž“š•‰š‹à}ž‹‹žœ—‹€}‡ŒÀ}†Œ°À}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ} š‘›ž‘˜š‰š‹À}Œ‹ž‹ž‘˜š‰š‹ÀAÀà^À}žš‘‹À}š‘ž“𛐠d@^ dÐW dPK d d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d1 d2 d3°d3 Define Area Object type GMCPathTrace #doc object GMCPathTrace ~This object implements a type of 2D graph that can be used to ~plot the recent positions of the motor. To use this object, simply ~set up its properties, especially the startRangeHorz, endRangeHorz, ~startRangeVert, endRangeVert, commObject, inputTypeHorz, ~inputSourceHorz, inputTypeVert, inputSourceVert, and ~pollInterval properties. ~Generally you would be interested in polling the motor position along two of the ~motor axis (such as the X and the Y axis). This object is robust object ~and can consume a lot of the processing power available on the QTERM-G70. ~As such, you should minimize the use of other polling type objects on the ~same screen as you place this GMCPathTrace object. You can also improve ~performance, if necessary, by increasing pollInterval, and decreasing ~numTracePoints. dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc dim xPos as integer func xPos(newval as integer) endfunc dim yPos as integer func yPos(newval as integer) endfunc dim width as integer func width(newval as integer) endfunc dim height as integer func height(newval as integer) endfunc dim borderColor as color func bordercolor (newVal as color) endfunc #doc prop TraceColor1 ~This color is used to draw the the most recent positions that have been plotted. If ~fastDraw is set to true, then this color is used for the entire plot. dim TraceColor1 as color func traceColor1 (newVal as color) endfunc #doc prop TraceColor2 ~As positions that have been logged age, the fade in to this color. This color ~is used to represent trace positions that are in the middle of the log. This color ~is not used if fastDraw is set to true. dim TraceColor2 as color func traceColor2 (newVal as color) endfunc #doc prop TraceColor3 ~The oldest positions in the trace log are drawn in this color. This color in not ~used if fastDraw is set to true. dim traceColor3 as color func traceColor3 (newVal as color) endfunc #doc prop curPosColor ~If showCurPos is true, then the current position of on the plot will be drawn in this color dim curPosColor as color func curPosColor (newVal as color) endfunc #doc prop showCurPos ~If true, the current position will be shown as a small box on the plot dim showCurPos as boolean func showCurPos (newVal as boolean) endfunc dim bgColor as color func bgColor (newVal as color) endfunc dim transparent as boolean func transparent (newVal as boolean) endfunc #doc prop fastDraw ~When fastDraw is set to true, this object displays itself much, much faster. As a ~result it can log many more trace points than it otherwise could. When this property is ~set to true, the trace line is drawn in a single solid color (TraceColor1). On ~older versions of firmware, the beginning and end of the trace line will be connected. ~When fastDraw is false, the trace line is drawn in a gradient that fades between ~the various trace colors. As the gradient takes time to draw, you should limit the ~numTracePoints property to values of 100 or less when this property is true. dim fastDraw as boolean func fastDraw (newVal as boolean) endfunc #doc prop NumTracePoints ~This is the number of points that the this object will log. Increasing this this number ~will allow for a longer log, but decreased performance of the terminal. If you increase ~this value above 100, you should generally also set fastDraw to true. dim NumTracePoints as integer func numTracePoints (newVal as integer) endfunc #doc prop startRangeHorz ~This defines the lower limit to be displayed on this object. The value of this property ~corresponts to a point along the left of this object. This object will display ~values between startRangeHorz and endRangeHorz within its extents. If ~startRangeHorz is greater than endRangeHorz then the graph is flipped ~horizontally. dim startRangeHorz as float func startRangeHorz (newVal as float) endfunc #doc prop endRangeHorz ~This defines the upper limit to be displayed on this object. The value of this property ~corresponts to a point along the right of this object. This object will display ~values between startRangeHorz and endRangeHorz within its extents. If ~startRangeHorz is greater than endRangeHorz then the graph is flipped ~horizontally. dim endRangeHorz as float func endRangeHorz (newVal as float) endfunc #doc prop startRangeVert ~This defines the lower limit to be displayed on this object. The value of this property ~corresponts to a point along the bottom of this object. This object will display ~values between startRangeVert and endRangeVert within its extents. If ~startRangeVert is greater than endRangeVert then the graph is flipped ~vertically. dim startRangeVert as float func startRangeVert (newVal as float) endfunc #doc prop endRangeVert ~This defines the upper limit to be displayed on this object. The value of this property ~corresponts to a point along the top of this object. This object will display ~values between startRangeVert and endRangeVert within its extents. If ~startRangeVert is greater than endRangeVert then the graph is flipped ~vertically. dim endRangeVert as float func endRangeVert (newVal as float) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication #doc prop inputTypeHorz ~InputType determines which property of the motion controller will be used to plot the ~horizontal axis of this control. Select an appropriate type from the drop down list. dim inputTypeHorz as GMC_DataType func inputTypeHorz(newVal as GMC_DataType) endfunc #doc prop inputSourceHorz ~If the inputTypeHorz property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSourceHorz property to select which axis to query. dim inputSourceHorz as GMC_Axis func inputSourceHorz (newVal as GMC_Axis) endfunc #doc prop inputTypeVert ~InputType determines which property of the motion controller will be used to plot the ~horizontal axis of this control. Select an appropriate type from the drop down list. dim inputTypeVert as GMC_DataType func inputTypeVert(newVal as GMC_DataType) endfunc #doc prop inputSourceVert ~If the inputTypeVert property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSourceVert property to select which axis to query. dim inputSourceVert as GMC_Axis func inputSourceVert (newVal as GMC_Axis) endfunc #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer func pollInterval (newVal as integer) endfunc #doc prop scaleObjHorz ~If you want a scale displayed along the horizontal axis, create a GMCAutoScale object, set its ~properties, then set the scaleObjHorz to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObjHorz as objref GMCAutoScale func scaleObjHorz(newVal as GMCAutoScale) endfunc #doc prop scaleObjVert ~If you want a scale displayed along the horizontal axis, create a GMCAutoScale object, set its ~properties, then set the scaleObjHorz to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObjVert as objref GMCAutoScale func scaleObjVert(newVal as GMCAutoScale) endfunc func StartUp() handles MSG_INIT endfunc func Draw() handles MSG_DRAW endfunc endfunc endfunc endfunc endfunc endfunc endfunc handles MSG_TIMETICK endfunc handles MSG_ZENABLED endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications, GMC_FailBadCommand or GMC_FailUnexpectedData ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as string, failReason as GMC_FailureReason) endfunc func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH endfunc func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED endfunc func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE endfunc func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE endfunc func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE endfunc handles AutoScale_ResizeRequest endfunc handles AutoScale_BuddyReinit endfunc endfunc endfunc Enddef #endfile #ifnot Galil_mc_src_GMCAutoScale #option Galil_mc_src_GMCAutoScale #ifnot AutoScaleConstants #option AutoScaleConstants const message AutoScale_ResizeRequest const message AutoScale_BuddyReinit const message AutoScale_SelfWarn const majorTickWidth := 4 const minorTickWidth := 2 const tickPadding := 2 #hidden dim GMC_BuddyRequest as objref GMCAutoScale #endif #ifnot GMCAutoScaleDefined #option GMCAutoScaleDefined Define Area Object type GMCAutoScale #ToolImage "F3BF1D5F7B5F71BF3FFF7FFF7FFF1FFF7FFF7FFF3FFF7DBF795F1D5FFDBF" '******************************************************************* 'Object: GMCScaleObject 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: Assistant scale display for GMC objects ' 'Version: 1.52 'Copyright: 2004 QSI Corporation. Permission to modify and ' distribute this object is granted provided this ' copyright notice remains in tact. '******************************************************************* #doc object GMCAutoScale ~This object displays a simple scale in conjunction with the GMCGauge, GMCPathTrace, ~and GMCTrendChart objects. To use this object, create an instance of this object and ~set its properties. Then select an instance of a GMCGauge, GMCPathTrace or ~GMCTrendChart and set its scaleObj, scaleObjHorz, or scaleObjVert ~property to refer to the GMCAutoScale you just created. This will attach the ~GMCAutoScale to the other object. Once that occurs, this scale will move and size ~along with the other object. library standard source ToolMessages library standard source AbsoluteValues dim enabled as boolean init enabled := true func enabled(newval as boolean) enabled := newval Enable (me, enabled) endfunc #if _tool func StartUp() handles MSG_INIT GMC_BuddyRequest := me UserBroadcastMsg (default, AutoScale_BuddyReinit, 0, true) if buddyObj == empty then UserDirectMsg (me, AutoScale_SelfWarn, 0, false) endif endfunc private func SelfWarn(parm as integer) returns boolean handles AutoScale_SelfWarn Tool_Trace ("Autoscale Warning: " + str(me) + " is not attached to any object. If this scale is not needed, please delete it.") return true endfunc #endif func Draw() handles MSG_DRAW 'dim width, height as integer dim bgColor as color dim i, max, j, max2 as integer dim txt, tick1, tick2, tick3 as integer dim curTickValue as float dim w, h, xo, yo as integer dim renderStr, formatStr as string dim pos1, pos2, inc, inc2 as float 'width = GetPosInfo(me, Get_Width) 'height = GetPosInfo (me, Get_Height) 'Draw the tick marks SetFgColor(fgColor) bgColor := fgColor+1 SetBgColor(bgColor) SetTransparent(bgColor) UseTransparent(true) formatStr := "%0" + str(minLabelWidth) + "." + str(digitsAfterDecimal) + "f" max = majorTicks-2 max2 = minorTicks-1 inc = float(length-1) / ((majorTicks-1)*(minorTicks+1)) inc2 = float(length-1) / (majorTicks-1) if not horz then if not attachalternateside then txt = xPos tick1 = xPos+lineWidth+tickPadding tick2 = xPos+lineWidth+tickPadding+majorTickWidth-1 tick3 = tick2 - (minorTickWidth-1) else txt = xPos+tickPadding+majorTickWidth tick1 = xPos+majorTickWidth tick2 = xPos tick3 = tick2 + (minorTickWidth-1) endif curTickValue = sr pos1 = yPos + lineHeight/2 pos2 = yPos for i = 0 to max renderStr = cprintf(formatStr, curTickValue) GetTTFTextSize (w, h, xo, yo, font, 0, ptSize, renderStr, font_normal) DrawTTFText (txt, pos2, lineWidth, lineHeight, xo + (lineWidth-w), yo, font, 0, ptSize, renderStr, font_normal) DrawLine (tick1, pos1, tick2, pos1) for j = 0 to max2 pos1 := pos1 + inc DrawLine(tick2, pos1, tick3, pos1) next pos1 := pos1 + inc pos2 := pos2 + inc2 curTickValue := curTickValue + factor next renderStr = cprintf(formatStr, er) GetTTFTextSize (w, h, xo, yo, font, 0, ptSize, renderStr, font_normal) DrawTTFText (txt, pos2, lineWidth, lineHeight, xo + (lineWidth-w), yo, font, 0, ptSize, renderStr, font_normal) DrawLine (tick1, pos1, tick2, pos1) else 'Scale is oriented horizontally if attachalternateside then txt = yPos tick1 = yPos+lineWidth+tickPadding tick2 = yPos+lineWidth+tickPadding+majorTickWidth-1 tick3 = tick2 - (minorTickWidth-1) SetTTFAngle (3*PI/2) else txt = yPos+tickPadding+majorTickWidth tick1 = yPos+majorTickWidth tick2 = yPos tick3 = tick2 + (minorTickWidth-1) SetTTFAngle(3*PI/2) endif curTickValue = sr pos1 = xPos + lineHeight/2 pos2 = xPos for i = 0 to max renderStr = cprintf(formatStr, curTickValue) GetTTFTextSize (w, h, xo, yo, font, 0, ptSize, renderStr, font_normal) DrawTTFText (pos2, txt, lineHeight, lineWidth, xo, yo + (lineWidth-h), font, 0, ptSize, renderStr, font_normal) DrawLine (pos1, tick1, pos1, tick2) for j = 0 to max2 pos1 := pos1 + inc DrawLine(pos1, tick2, pos1, tick3) next pos1 := pos1 + inc pos2 := pos2 + inc2 curTickValue := curTickValue + factor next renderStr = cprintf(formatStr, er) GetTTFTextSize (w, h, xo, yo, font, 0, ptSize, renderStr, font_normal) DrawTTFText (pos2, txt, lineHeight, lineWidth, xo, yo + (lineWidth-h), font, 0, ptSize, renderStr, font_normal) DrawLine (pos1, tick1, pos1, tick2) endif endfunc 'The rest of these functions add functionality to the PC development tool. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in the PC development tool. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by the PC development tool to obtain the coordinates of 'the resize grips. The arrays xCoords, yCoords, and cursors all contain 0 'elements initially. This means that you should either call redim on those 'arrays and set their values, or declare local arrays, set the values of 'the local arrays, and then assign xCoords, yCoords and cursors to those 'local arrays. Closed indicates whether the Foundry should connect the 'first and last grips to make a closed object. xCoords, yCoords, and 'cursors should all contain the same number of elements when this function 'completes func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES redim (xCoords, 4) redim (yCoords, 4) redim (cursors, 4) xCoords[0] = GetPosInfo(me, Get_X) xCoords[1] = xCoords[0] + GetPosInfo(me, Get_Width) - 1 xCoords[2] = xCoords[1] xCoords[3] = xCoords[0] yCoords[0] = GetPosInfo(me, Get_Y) yCoords[1] = yCoords[0] yCoords[2] = yCoords[0] + GetPosInfo(me, Get_Height)-1 yCoords[3] = yCoords[2] cursors[0] = CSR_ObjectFixed or CSR_None cursors[1] = CSR_None cursors[2] = CSR_None cursors[3] = CSR_none endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. (x1, y1) are the coordinates that the user started his 'drag and (x2, y2) are the coordinates that the mouse was released func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE 'Call our MSG_INIT handler StartUp() endfunc #endif dim minLabelWidth as integer init minLabelWidth := 0 func minLabelWidth(newVal as integer) minLabelWidth := newVal ReInitBuddy() endfunc dim digitsAfterDecimal as integer init digitsAfterDecimal := 0 func digitsAfterDecimal(newVal as integer) digitsAfterDecimal := newVal ReInitBuddy() endfunc dim majorTicks as integer init majorTicks := 3 func majorTicks(newVal as integer) majorTicks := newVal ReinitBuddy() endfunc dim minorTicks as integer init minorTicks := 3 func minorTicks(newVal as integer) minorTicks := newVal ReinitBuddy() endfunc dim forceEvenSpacing as boolean init forceEvenSpacing := true func forceEvenSpacing (newVal as boolean) forceEvenSpacing := newVal ReinitBuddy() endfunc dim font as TTFont init font := default func font (newVal as TTFont) font := newVal ReinitBuddy() endfunc dim fgColor as color init fgColor := RGB_White func fgColor (newVal as color) fgColor := newVal ReRender(me) endfunc dim ptSize as integer init ptSize := 11 func ptSize (newVal as integer) ptSize := newVal ReinitBuddy() endfunc dim offset as float init offset := 0 func offset(newVal as float) offset := newVal ReinitBuddy() endfunc dim scale as float init scale := 1 func scale (newVal as float) scale := newVal ReinitBuddy() endfunc dim attachAlternateSide as boolean init attachAlternateSide := false func attachAlternateSide(newVal as boolean) attachAlternateSide := newVal ReinitBuddy() endfunc dim rotateText as boolean init rotateText := false func rotateText (newVal as boolean) rotateText := newVal ReinitBuddy() endfunc private dim ypos, xpos as integer private dim length as integer private dim lineWidth, lineHeight as integer private dim buddyObj as objref private dim horz as boolean private dim factor as float private dim sr, er as float library standard native miscfunctions func AttachTo (leftPos as integer, topPos as integer, rightPos as integer, bottomPos as integer, -> startRange as float, endRange as float, horizontal as boolean, buddy as objref, -> parent as objref, enable as boolean) dim tmpLen as integer dim textHeight as integer dim maxWidth, maxHeight as integer dim w, h, xo, yo as integer dim tmpStr as string startRange := startRange * scale + offset endRange := endRange * scale + offset if horizontal then tmpLen = rightPos-leftPos+1 else tmpLen = bottomPos-topPos+1 endif if forceEvenSpacing then tmpLen := CalcBestLeng(tmpLen) endif 'calculate the height of a line of text GetTTFtextSize(w, maxHeight, xo, yo, font, 0, ptSize, "-0123456789.E", font_normal) 'calculate the max width of a line tmpStr = cprintf("%0" + str(minLabelWidth) + "." + str(digitsAfterDecimal) + "f", startRange) GetTTFTextSize(w, h, xo, yo, font, 0, ptSize, tmpStr, font_normal) tmpStr = cprintf("%0" + str(minLabelWidth) + "." + str(digitsAfterDecimal) + "f", endRange) GetTTFTextSize(maxWidth, h, xo, yo, font, 0, ptSize, tmpStr, font_normal) if w > maxWidth then maxWidth := w endif if not horizontal then yPos := topPos-maxHeight/2 if not attachAlternateSide then xpos := leftPos - (majorTickWidth+tickPadding+maxWidth) else xpos := rightPos+1 endif relocate (me, xPos, yPos) resize (me, majorTickWidth+tickPadding+maxWidth, tmpLen+maxHeight) else xPos := leftPos - maxHeight/2 if not attachAlternateSide then yPos := bottomPos+1 else yPos := topPos-(majorTickWidth+tickPadding+maxWidth) endif relocate (me, xPos, yPos) resize (me, tmpLen+maxHeight, majorTickWidth+tickPadding+maxWidth) endif sr := startRange er := endRange factor := (endRange-startRange) / (majorTicks-1) lineHeight := maxHeight lineWidth := maxWidth horz := horizontal buddyObj := buddy length := tmpLen if forceEvenSpacing then if horizontal and (tmpLen <> rightPos-leftPos+1) then GMC_BuddyRequest := me UserDirectMsg (buddyObj, AutoScale_ResizeRequest, tmpLen, true) elseif (tmpLen <> (bottomPos-topPos+1)) then GMC_BuddyRequest := me UserDirectMsg (buddyObj, AutoScale_ResizeRequest, tmpLen, true) endif endif #if _tool tool_persist(enabled) #endif 'Get Foundry to re-request my resize grips attach(me, parent) enabled(enable) Rerender(me) endfunc private func CalcBestLeng (curLen as integer) returns integer dim gaps as integer gaps = (majorTicks-1) * (minorTicks+1) return ((curLen-1+gaps/2)/gaps)*gaps + 1 endfunc private func ReinitBuddy() GMC_BuddyRequest := me if buddyObj <> empty then UserDirectMsg (buddyObj, AutoScale_BuddyReinit, 0, true) else UserBroadcastMsg (default, AutoScale_BuddyReinit, 0, true) endif endfunc Enddef #endif 'GMCAutoScale #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œžŠ‹Œœž“š dtd˜ž“–“ ’œ Œœ ˜’œžŠ‹Œœž“š d dTežŠ‹Œœž“šœ‘Œ‹ž‘‹Œ dtdžŠ‹Œœž“šœ‘Œ‹ž‘‹Œ d dàD0?}žŠ‹Œœž“š šŒ–…ššŽŠšŒ‹ dàD0?}žŠ‹Œœž“š Š››†š–‘–‹ dàD0?}žŠ‹Œœž“š Œš“™ˆž‘ d d àD } ’ž•‹–œ”ˆ–›‹—   d àD } ’–‘‹–œ”ˆ–›‹—   d àD } ‹–œ”ž››–‘˜   d deÀD}˜’œ Š››†šŽŠšŒ‹ÐDà>} ˜’œžŠ‹Œœž“š d d d d d d d dTe˜’œžŠ‹Œœž“š›š™–‘š› dtd˜’œžŠ‹Œœž“š›š™–‘š› dKK K@K} ˜’œžŠ‹Œœž“š d@dC<¹Ìœ¹Î»Ê¹ÈœÊ¹ÈΜ¹Ì¹¹¹È¹¹¹È¹¹¹Î¹¹¹È¹¹¹È¹¹¹Ì¹¹¹È»œ¹ÈÆÊ¹Î»Ê¹¹»œ¹ d d d d d d d d d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/Àd/}/Œ‹ž‘›ž›Ðd/}/ ‹“’šŒŒž˜šŒ d0Àd0}0Œ‹ž‘›ž›Ðd0}0žŒ“Š‹š‰ž“ŠšŒ d1 d2ÀD2}2š‘ž“š›ÐD2°>2 d3ðD3}3š‘ž“š›313 d4€W4}4š‘ž“š›€4}4‘šˆ‰ž“ÐD4°>44 d5}5š‘ž“š›5}5‘šˆ‰ž“ d6}6š‘ž“š€6à^6À6}6š‘ž“š›6 d7ÐW7 d8 d9„d9 ‹“ d:€W:}:Œ‹ž‹Š€:: d;ÀW;};’Œ˜ –‘–‹ d< d=}=˜’œ Š››†šŽŠšŒ‹=à^= d>}>ŠŒšž›œžŒ‹’Œ˜€>P>À>}>žŠ‹Œœž“š Š››†š–‘–‹À>>À>1>> d? d@^@}@Š››†•Ð@}@š’‹†^@ dA}A ŠŒš›–šœ‹’Œ˜€Aà^AÀA}AžŠ‹Œœž“š Œš“™ˆž‘ÀAAÀAAAA dB@^B dCÐWC dD dE`KE€WE}EŒš“™ˆž‘€E}Ež’ÐDE€>EE°WE°>E dFÀWF}FžŠ‹Œœž“š Œš“™ˆž‘ dG dH}H ‹“ ‹žœš€HCHŸŠ‹Œœž“šßšž‘–‘˜Åß°H}HŒ‹€Hà^HH°HCHOߖŒß‘‹ßž‹‹žœ—š›ß‹ßž‘†ß•šœ‹Ñßß¶™ß‹—–ŒßŒœž“šß–Œß‘‹ß‘šš›š›Óߏ“šžŒšß›š“š‹šß–‹ÑH dI dJð^J1J dKÐWK dL dL dM dN dO€WO}O›žˆ€OO dPÀWP}P’Œ˜ ›žˆ dQ dR dSÀDS}S˜œ“ÐDSð>S dTÀDT}T–ÀT}T’ž‡ÀT}T•ÀT}T’ž‡ÍÐDT€>T dUÀDU}U‹‡‹ÀU}U‹–œ”ÎÀU}U‹–œ”ÍÀU}U‹–œ”ÌÐDU€>U dVÀDV}V œŠ‹–œ”‰ž“ŠšÐDV>V dWÀDW}WˆÀW}W—ÀW}W‡ÀW}W†ÐDW€>W dXÀDX}X š‘›šŒ‹ÀX}X ™’ž‹Œ‹ÐDXÀ>X dYÀDY}YŒÎÀY}YŒÍÀY}Y–‘œÀY}Y–‘œÍÐDY>Y dZ d[ d\ d] d^ d_}_ Œš‹™˜œ“€_}_™˜œ“_ d`}`˜œ“`}`™˜œ“°`` da}a Œš‹˜œ“€a}a˜œ“a db}bŒš‹‹ž‘Œžš‘‹€b}b˜œ“b dc}cŠŒš‹ž‘Œžš‘‹€c1cc dd de}e ™’ž‹Œ‹eCeÚϰe}eŒ‹€e}e ’–‘“žš“ˆ–›‹—e°eCeѰe}eŒ‹€e}e›–˜–‹Œž™‹š›šœ–’ž“e°eCe™ df}f’ž‡Ðf}f ’ž•‹–œ”ŒÐff dg}g’ž‡ÍÐg}g ’–‘‹–œ”ŒÐgg dh}h–‘œÐh>h€h}h“š‘˜‹—Ðhhhðh€h€h}h ’ž•‹–œ”ŒÐhhh h€h}h ’–‘‹–œ”Œ°hhhh di}i–‘œÍÐi>i€i}i“š‘˜‹—Ðiiiði€i}i ’ž•‹–œ”ŒÐiii dj^jj}j—…^j dk^kk}kž‹‹žœ—ž“‹š‘ž‹šŒ–›š^k dl}l‹‡‹Ðl}l‡Œ dm}m‹–œ”ÎÐm}m‡Œ°m}m “–‘šˆ–›‹—°m}m ‹–œ”ž››–‘˜ dn}n‹–œ”ÍÐn}n‡Œ°n}n “–‘šˆ–›‹—°n}n ‹–œ”ž››–‘˜°n}n’ž•‹–œ”ˆ–›‹—Ðnn do}o‹–œ”ÌÐo}o‹–œ”ÍÐo€o}o’–‘‹–œ”ˆ–›‹—Ðooo dp0^p dq}q‹‡‹Ðq}q‡Œ°q}q ‹–œ”ž››–‘˜°q}q’ž•‹–œ”ˆ–›‹— dr}r‹–œ”ÎÐr}r‡Œ°r}r’ž•‹–œ”ˆ–›‹— ds}s‹–œ”ÍÐs}s‡Œ dt}t‹–œ”ÌÐt}t‹–œ”Ͱt€t}t’–‘‹–œ”ˆ–›‹—Ðttt du@^u dv dw}w œŠ‹–œ”‰ž“ŠšÐw}wŒ dx}xŒÎÐx}x†Œ°x}x “–‘š—š–˜—‹ðxx dy}yŒÍÐy}y†Œ dzP^z}z–Ðzz Wz}z’ž‡ d{}{ š‘›šŒ‹Ð{}{œ–‘‹™€{}{ ™’ž‹Œ‹À{}{ œŠ‹–œ”‰ž“Šš{ d|}|˜š‹‹‹™‹š‡‹Œ–…š€|}|ˆÀ|}|—À|}|‡À|}|†À|}|™‘‹À||À|}|‹Œ–…šÀ|}| š‘›šŒ‹À|}| ™‘‹ ‘’ž“| d}}} ›žˆ‹‹™‹š‡‹€}}}‹‡‹À}}}ŒÍÀ}}} “–‘šˆ–›‹—À}}} “–‘š—š–˜—‹À}}}‡°}€}}} “–‘šˆ–›‹—Ð}}}ˆ}À}}}†À}}}™‘‹À}}À}}}‹Œ–…šÀ}}} š‘›šŒ‹À}}} ™‘‹ ‘’ž“} d~}~›žˆ“–‘š€~}~‹–œ”ÎÀ~}~ŒÎÀ~}~‹–œ”ÍÀ~}~ŒÎ~ d d€P^€}€•Ѐ€ W€}€’ž‡Í d}ŒÎ}ŒÎ°}–‘œ d‚}‚›žˆ“–‘š€‚}‚‹–œ”ÍÀ‚}‚ŒÎÀ‚}‚‹–œ”ÌÀ‚}‚ŒÎ‚ dƒ`^ƒ d„}„ŒÎ„}„ŒÎ°„}„–‘œ d…}…ŒÍ…}…ŒÍ°…}…–‘œÍ d†}† œŠ‹–œ”‰ž“Šš†}† œŠ‹–œ”‰ž“Šš°†}†™žœ‹ d‡`^‡ dˆ}ˆ š‘›šŒ‹Ðˆ}ˆœ–‘‹™€ˆ}ˆ ™’ž‹Œ‹Àˆ}ˆšˆ d‰}‰˜š‹‹‹™‹š‡‹Œ–…š€‰}‰ˆÀ‰}‰—À‰}‰‡À‰}‰†À‰}‰™‘‹À‰‰À‰}‰‹Œ–…šÀ‰}‰ š‘›šŒ‹À‰}‰ ™‘‹ ‘’ž“‰ dŠ}Š ›žˆ‹‹™‹š‡‹€Š}Š‹‡‹ÀŠ}ŠŒÍÀŠ}Š “–‘šˆ–›‹—ÀŠ}Š “–‘š—š–˜—‹ÀŠ}Ї°Š€Š}Š “–‘šˆ–›‹—Њ}ŠˆŠÀŠ}ІÀŠ}Š™‘‹ÀŠŠÀŠ}Š‹Œ–…šÀŠ}Š š‘›šŒ‹ÀŠ}Š ™‘‹ ‘’ž“Š d‹}‹›žˆ“–‘š€‹}‹‹–œ”ÎÀ‹}‹ŒÎÀ‹}‹‹–œ”ÍÀ‹}‹ŒÎ‹ dŒ0^Œ d dŽ^Ž}Žž‹‹žœ—ž“‹š‘ž‹šŒ–›š^Ž d}‹‡‹Ð}†Œ d}‹–œ”ÎА}†Œ°} “–‘šˆ–›‹—°} ‹–œ”ž››–‘˜ d‘}‘‹–œ”ÍБ}‘†Œ°‘}‘ “–‘šˆ–›‹—°‘}‘ ‹–œ”ž››–‘˜°‘}‘’ž•‹–œ”ˆ–›‹—Б‘ d’}’‹–œ”ÌÐ’}’‹–œ”ÍÐ’€’}’’–‘‹–œ”ˆ–›‹—Ð’’’ d“}“ Œš‹‹‹™ž‘˜“š€““ “}“–𓓐“ d”0^” d•}•‹‡‹Ð•}•†Œ°•}• ‹–œ”ž››–‘˜°•}•’ž•‹–œ”ˆ–›‹— d–}–‹–œ”ÎЖ}–†Œ°–}–’ž•‹–œ”ˆ–›‹— d—}—‹–œ”ÍЗ}—†Œ d˜}˜‹–œ”ÌИ}˜‹–œ”Ͱ˜€˜}˜’–‘‹–œ”ˆ–›‹—И˜˜ d™}™ Œš‹‹‹™ž‘˜“š€™™ ™}™–𙙐™ dš@^š d› dœ}œ œŠ‹–œ”‰ž“ŠšÐœ}œŒ d}ŒÎН}‡Œ°} “–‘š—š–˜—‹ð dž}žŒÍО}ž‡Œ dŸP^Ÿ}Ÿ–ПŸ WŸ}Ÿ’ž‡ d }  š‘›šŒ‹Ð } œ–‘‹™€ }  ™’ž‹Œ‹À }  œŠ‹–œ”‰ž“Šš  d¡}¡˜š‹‹‹™‹š‡‹Œ–…š€¡}¡ˆÀ¡}¡—À¡}¡‡À¡}¡†À¡}¡™‘‹À¡¡À¡}¡‹Œ–…šÀ¡}¡ š‘›šŒ‹À¡}¡ ™‘‹ ‘’ž“¡ d¢}¢ ›žˆ‹‹™‹š‡‹€¢}¢ŒÍÀ¢}¢‹‡‹À¢}¢ “–‘š—š–˜—‹À¢}¢ “–‘šˆ–›‹—À¢}¢‡À¢}¢†°¢€¢}¢ “–‘šˆ–›‹—Т}¢—¢À¢}¢™‘‹À¢¢À¢}¢‹Œ–…šÀ¢}¢ š‘›šŒ‹À¢}¢ ™‘‹ ‘’ž“¢ d£}£›žˆ“–‘š€£}£ŒÎÀ£}£‹–œ”ÎÀ£}£ŒÎÀ£}£‹–œ”͐£ d€ d¥P^¥}¥•Ð¥¥ W¥}¥’ž‡Í dŠ}ŠŒÎŠ}ŠŒÎ°Š}Š–‘œ d§}§›žˆ“–‘š€§}§ŒÎÀ§}§‹–œ”ÍÀ§}§ŒÎÀ§}§‹–œ”̐§ dš`^š d©}©ŒÎ©}©ŒÎ°©}©–‘œ dª}ªŒÍª}ªŒÍ°ª}ª–‘œÍ d«}« œŠ‹–œ”‰ž“Šš«}« œŠ‹–œ”‰ž“Šš°«}«™žœ‹ d¬`^¬ d­}­ š‘›šŒ‹Ð­}­œ–‘‹™€­}­ ™’ž‹Œ‹À­}­š­ d®}®˜š‹‹‹™‹š‡‹Œ–…š€®}®ˆÀ®}®—À®}®‡À®}®†À®}®™‘‹À®®À®}®‹Œ–…šÀ®}® š‘›šŒ‹À®}® ™‘‹ ‘’ž“® d¯}¯ ›žˆ‹‹™‹š‡‹€¯}¯ŒÍÀ¯}¯‹‡‹À¯}¯ “–‘š—š–˜—‹À¯}¯ “–‘šˆ–›‹—À¯}¯‡À¯}¯†°¯€¯}¯ “–‘šˆ–›‹—Я}¯—¯À¯}¯™‘‹À¯¯À¯}¯‹Œ–…šÀ¯}¯ š‘›šŒ‹À¯}¯ ™‘‹ ‘’ž“¯ d°}°›žˆ“–‘š€°}°ŒÎÀ°}°‹–œ”ÎÀ°}°ŒÎÀ°}°‹–œ”͐° d±@^± d²ÐW² d³ dŽ dµ d¶ d· dž d¹ dº d» dŒ dœ dŸ„dŸ ‹“ d¿ dÀ dÁ d dà dÄ dÅ dÆ dÇ dÈ dÉ dʀWÊ}Ê‹“˜š‹—ž‘›“šŒ€Ê}ʇœ›Œ°ÊÐÊÐDʐWÊ Wʀ>ÊÀÊ}ˆœ›Œ°ËÐËÐDːWË Wˀ>ËÀË}ÌœŠŒŒ°ÌÐÌÐD̐WÌ WÌ}Ì ˜Š–œŠŒŒÀÌ}Íœ“Œš›ÐD͐WÍ WͰ>͐Í dÎÀWÎ}Î’Œ˜ ‹“ ˜š‹—ž‘›“šŒ dÏ dÐ}Ðš›–’€Ð}Їœ›ŒÀÐАРdÑ}Ñš›–’€Ñ}цœ›ŒÀÑÑÑ dÒ}Òš›–’€Ò}ÒœŠŒŒÀÒÒÒ dÓ dÔ}Ô‡œ›Œ°ÔÔÐÔÐÔ}Ô ˜š‹Œ–‘™€Ôà^ÔÀÔ}Ô˜š‹ ‡Ô dÕ}Õ‡œ›Œ°ÕÕÐÕÐÕ}Õ‡œ›Œ°ÕÕÐÕ°Õ}Õ ˜š‹Œ–‘™€Õà^ÕÀÕ}Õ ˜š‹ ˆ–›‹—ÕÐÕÕ dÖ}Ö‡œ›Œ°ÖÖÐÖÐÖ}Ö‡œ›Œ°ÖÖÐÖ d×}ׇœ›Œ°××Ð×Ð×}ׇœ›Œ°××Ð× dØ dÙ}Ù†œ›Œ°ÙÙÐÙÐÙ}Ù ˜š‹Œ–‘™€Ùà^ÙÀÙ}Ù˜š‹ †Ù dÚ}Ú†œ›Œ°ÚÚÐÚÐÚ}Ú†œ›Œ°ÚÚÐÚ dÛ}Û†œ›Œ°ÛÛÐÛÐÛ}Û†œ›Œ°ÛÛÐÛ°Û}Û ˜š‹Œ–‘™€Ûà^ÛÀÛ}Û ˜š‹ —š–˜—‹ÛÐÛÛ dÜ}܆œ›Œ°ÜÜÐÜÐÜ}܆œ›Œ°ÜÜÐÜ dÝ dÞ}ÞœŠŒŒ°ÞÞÐÞÐÞ}ÞœŒ •šœ‹™–‡š›ÀÞ}ÞœŒ ‘‘š dß}ßœŠŒŒ°ßßÐßÐß}ßœŒ ‘‘š dà}àœŠŒŒ°ààÐàÐà}àœŒ ‘‘š dá}ᜊŒŒ°ááÐáÐá}ᜌ ‘‘š dâ dãÐWã dä då dæ dç dè dé dê dë dì dí€Wí}틐“›ž˜œšž‹š€í}í žš‘‹•ÐDíà>íÀí}í‡ÎÐDí€>íÀí}í†ÎÐDí€>íÀí}î‡ÍÐDî€>îÀî}î†ÍÐDî€>îî dïÀWï}ï’Œ˜ ‹“ ›ž˜œšž‹š dð dñ dò}òŒ‹ž‹Š€òò dóÐWó dô dõ dõ dö d÷ døÀDø}ø ’–‘“žš“ˆ–›‹—ÐDø€>ø dùðDù}ù ’–‘“žš“ˆ–›‹—ùù dú€Wú}ú ’–‘“žš“ˆ–›‹—€ú}ú‘šˆ‰ž“ÐDú€>úú dû}û ’–‘“žš“ˆ–›‹—û}û‘šˆ‰ž“ dü}ü š–‘–‹Š››†€üü dýÐWý dþ dÿÀDÿ}ÿ›–˜–‹Œž™‹š›šœ–’ž“ÐDÿ€>ÿ dðD}›–˜–‹Œž™‹š›šœ–’ž“ d€W}›–˜–‹Œž™‹š›šœ–’ž“€}‘šˆ‰ž“ÐD€> d}›–˜–‹Œž™‹š›šœ–’ž“}‘šˆ‰ž“ d} š–‘–‹Š››†€ dÐW d dÀD} ’ž•‹–œ”ŒÐD€> dðD} ’ž•‹–œ”Œ d€W} ’ž•‹–œ”Œ€}‘šˆ‰ž“ÐD€> d }  ’ž•‹–œ”Œ } ‘šˆ‰ž“ d }  š–‘–‹Š››†€   d ÐW  d  d ÀD }  ’–‘‹–œ”ŒÐD €>  dðD} ’–‘‹–œ”Œ d€W} ’–‘‹–œ”Œ€}‘šˆ‰ž“ÐD€> d} ’–‘‹–œ”Œ}‘šˆ‰ž“ d} š–‘–‹Š››†€ dÐW d dÀD}™œšš‰š‘Œžœ–‘˜ÐD°> dðD}™œšš‰š‘Œžœ–‘˜1 d€W}™œšš‰š‘Œžœ–‘˜€}‘šˆ‰ž“ÐD°> d}™œšš‰š‘Œžœ–‘˜}‘šˆ‰ž“ d} š–‘–‹Š››†€ dÐW d dÀD}™‘‹ÐD? dðD}™‘‹P d€W}™‘‹€}‘šˆ‰ž“ÐD? d}™‘‹}‘šˆ‰ž“ d} š–‘–‹Š››†€ d ÐW  d! d"ÀD"}"™˜œ“ÐD"ð>" d#ðD#}#™˜œ“#}# ˜ ˆ—–‹š d$€W$}$™˜œ“€$}$‘šˆ‰ž“ÐD$ð>$$ d%}%™˜œ“%}%‘šˆ‰ž“ d&}&šš‘›š€&à^&& d'ÐW' d( d)ÀD)})‹Œ–…šÐD)€>) d*ðD*}*‹Œ–…š** d+€W+}+‹Œ–…š€+}+‘šˆ‰ž“ÐD+€>++ d,},‹Œ–…š,},‘šˆ‰ž“ d-}- š–‘–‹Š››†€-- d.ÐW. d/ d0ÀD0}0™™Œš‹ÐD0>0 d1ðD1}1™™Œš‹11 d2€W2}2™™Œš‹€2}2‘šˆ‰ž“ÐD2>22 d3}3™™Œš‹3}3‘šˆ‰ž“ d4}4 š–‘–‹Š››†€44 d5ÐW5 d6 d7ÀD7}7Œœž“šÐD7>7 d8ðD8}8Œœž“š88 d9€W9}9Œœž“š€9}9‘šˆ‰ž“ÐD9>99 d:}:Œœž“š:}:‘šˆ‰ž“ d;}; š–‘–‹Š››†€;; d<ÐW< d= d>ÀD>}>ž‹‹žœ—ž“‹š‘ž‹šŒ–›šÐD>°>> d?ðD?}?ž‹‹žœ—ž“‹š‘ž‹šŒ–›š?A? d@€W@}@ž‹‹žœ—ž“‹š‘ž‹šŒ–›š€@}@‘šˆ‰ž“ÐD@°>@@ dA}Až‹‹žœ—ž“‹š‘ž‹šŒ–›šA}A‘šˆ‰ž“ dB}B š–‘–‹Š››†€BB dCÐWC dD dEÀDE}E ‹ž‹š‹š‡‹ÐDE°>E dFðDF}F ‹ž‹š‹š‡‹FAF dG€WG}G ‹ž‹š‹š‡‹€G}G‘šˆ‰ž“ÐDG°>GG dH}H ‹ž‹š‹š‡‹H}H‘šˆ‰ž“ dI}I š–‘–‹Š››†€II dJÐWJ dK dL`KLÀDL}L†ŒÀL}L‡ŒÐDL€>L dM`KMÀDM}M“š‘˜‹—ÐDM€>M dN`KNÀDN}N “–‘šˆ–›‹—ÀN}N “–‘š—š–˜—‹ÐDN€>N dO`KOÀDO}OŠ››†•ÐDOà>O dP`KPÀDP}P—…ÐDP°>P dQ`KQÀDQ}Q™žœ‹ÐDQ>Q dR`KRÀDR}RŒÀR}RšÐDR>R dS dTÀdT}TŒ‹ž‘›ž›PjT}T ’–Œœ™Š‘œ‹–‘Œ dU€WU}Už‹‹žœ—‹€U}U“š™‹ŒÐDU€>UÀU}U‹ŒÐDU€>UÀU}U–˜—‹ŒÐDU€>UÀU}U ‹‹’ŒÐDU€>UÀU}V Œ‹ž‹ž‘˜šÐDV>VÀV}Vš‘›ž‘˜šÐDV>VÀV}V —–…‘‹ž“ÐDV°>VÀV}VŠ››†ÐDVà>VÀV}Wžš‘‹ÐDWà>WÀW}Wš‘ž“šÐDW°>WW dX dYÀDY}Y‹’“š‘ÐDY€>Y dZÀDZ}Z ‹š‡‹—š–˜—‹ÐDZ€>Z d[ÀD[}[’ž‡ˆ–›‹—À[}[ ’ž‡—š–˜—‹ÐD[€>[ d\ÀD\}\ˆÀ\}\—À\}\‡À\}\†ÐD\€>\ d]ÀD]}]‹’Œ‹ÐD]À>] d^ d_}_ Œ‹ž‹ž‘˜š_}_ Œ‹ž‹ž‘˜š _}_Œœž“š°_}_™™Œš‹ d`}`š‘›ž‘˜š`}`š‘›ž‘˜š `}`Œœž“š°`}`™™Œš‹ da db^b}b —–…‘‹ž“^b dc}c‹’“š‘Ðc}c–˜—‹ŒÐc}c“š™‹Œ°cc dd0^d de}e‹’“š‘Ðe}e ‹‹’ŒÐe}e‹Œ°ee df@^f dg dh^h}h™œšš‰š‘Œžœ–‘˜^h di}i‹’“š‘i}i œž“œšŒ‹“š‘˜€i}i‹’“š‘i dj@^j dk dl dm}m˜š‹‹‹™‹š‡‹Œ–…š€m}mˆÀm}m ’ž‡—š–˜—‹Àm}m‡Àm}m†Àm}m™‘‹ÀmmÀm}m‹Œ–…šÀmCm ÒÏÎÍÌËÊÉÈÇÆÑºÀm}m ™‘‹ ‘’ž“m dn do dp}p‹’Œ‹Ðp}pœ–‘‹™€pCpÚϰp}pŒ‹€p}p ’–‘“žš“ˆ–›‹—p°pCpѰp}pŒ‹€p}p›–˜–‹Œž™‹š›šœ–’ž“p°pCp™Àp}p Œ‹ž‹ž‘˜šp dq}q˜š‹‹‹™‹š‡‹Œ–…š€q}qˆÀq}q—Àq}q‡Àq}q†Àq}q™‘‹ÀqqÀq}q‹Œ–…šÀq}q‹’Œ‹Àq}q ™‘‹ ‘’ž“q dr}r‹’Œ‹Ðr}rœ–‘‹™€rCrÚϰr}rŒ‹€r}r ’–‘“žš“ˆ–›‹—r°rCrѰr}rŒ‹€r}r›–˜–‹Œž™‹š›šœ–’ž“r°rCr™Àr}rš‘›ž‘˜šr ds}s˜š‹‹‹™‹š‡‹Œ–…š€s}s’ž‡ˆ–›‹—Às}s—Às}s‡Às}s†Às}s™‘‹ÀssÀs}s‹Œ–…šÀs}s‹’Œ‹Às}s ™‘‹ ‘’ž“s dt^t}tˆàt}t’ž‡ˆ–›‹—^t du}u’ž‡ˆ–›‹—u}uˆ dv@^v dw dx^xx}x —–…‘‹ž“^x dy}y†Œy}y‹ŒÐy}y ’ž‡—š–˜—‹ðyy dz^zz}zž‹‹žœ—ž“‹š‘ž‹šŒ–›š^z d{}{‡Œ{}{“š™‹ŒÐ{€{}{’ž•‹–œ”ˆ–›‹—°{}{ ‹–œ”ž››–‘˜°{}{’ž‡ˆ–›‹—{ d|0^| d}}}‡Œ}}}–˜—‹Œ°}} d~@^~ d}š“œž‹š€à^À}‡ŒÀ}†Œ d€}€šŒ–…š€€à^€À€}€’ž•‹–œ”ˆ–›‹—°€}€ ‹–œ”ž››–‘˜°€}€’ž‡ˆ–›‹—À€}€‹’“š‘°€}€ ’ž‡—š–˜—‹€ d0^ d‚}‚‡Œ‚}‚“š™‹ŒÐ‚}‚ ’ž‡—š–˜—‹ð‚‚ dƒ^ƒƒ}ƒž‹‹žœ—ž“‹š‘ž‹šŒ–›š^ƒ d„}„†Œ„}„ ‹‹’Œ°„„ d…0^… d†}††Œ†}†‹ŒÐ†€†}†’ž•‹–œ”ˆ–›‹—°†}† ‹–œ”ž››–‘˜°†}†’ž‡ˆ–›‹—† d‡@^‡ dˆ}ˆš“œž‹š€ˆà^ˆÀˆ}ˆ‡ŒÀˆ}ˆ†Œˆ d‰}‰šŒ–…š€‰à^‰À‰}‰‹’“š‘°‰}‰ ’ž‡—š–˜—‹À‰}‰’ž•‹–œ”ˆ–›‹—°‰}‰ ‹–œ”ž››–‘˜°‰}‰’ž‡ˆ–›‹—‰ dŠ@^Š d‹ dŒ}ŒŒŒ}Œ Œ‹ž‹ž‘˜š d}š}š‘›ž‘˜š dŽ}Ž™žœ‹Ž€Ž}Žš‘›ž‘˜šÐŽ}Ž Œ‹ž‹ž‘˜šŽðŽ€Ž}Ž ’ž•‹–œ”ŒÐŽŽŽ d} “–‘š—š–˜—‹} ’ž‡—š–˜—‹ d} “–‘šˆ–›‹—}’ž‡ˆ–›‹— d‘}‘—…‘}‘ —–…‘‹ž“ d’}’Š››†•’}’Š››† d“}““š‘˜‹—“}“‹’“š‘ d”^”}”™œšš‰š‘Œžœ–‘˜^” d•^•}• —–…‘‹ž“`•€•}•‹’“š‘à•}•–˜—‹ŒÐ•}•“š™‹Œ°•••^• d–}–˜’œ Š››†šŽŠšŒ‹–à^– d—}— ŠŒš›–šœ‹’Œ˜€—}—Š››†•À—}—žŠ‹Œœž“š šŒ–…ššŽŠšŒ‹À—}—‹’“š‘À—1—— d˜ ^˜€˜}˜‹’“š‘à˜€˜}˜ ‹‹’ŒÐ˜}˜‹Œ°˜˜˜˜^˜ d™}™˜’œ Š››†šŽŠšŒ‹™à^™ dš}š ŠŒš›–šœ‹’Œ˜€š}šŠ››†•Àš}šžŠ‹Œœž“š šŒ–…ššŽŠšŒ‹Àš}š‹’“š‘Àš1šš d›@^› dœ@^œ d dž„dž ‹“}ž ‹“ šŒ–Œ‹€ž}žš‘ž“š›ž dž dŸ}Ÿž‹‹žœ—€Ÿà^ŸÀŸ}Ÿžš‘‹Ÿ d } š‘ž“𛀠} š‘ž“𐠠d¡}¡šš‘›š€¡à^¡¡ d¢ÐW¢ d£ d€`K€€W€}€ œž“œšŒ‹“š‘˜€€}€œŠ“š‘ÐD€€>€€°W€€>€ d¥ÀD¥}¥˜žŒÐD¥€>¥ dŠ d§}§˜žŒÐ§€§}§ ’ž•‹–œ”ŒÐ§§§ §€§}§ ’–‘‹–œ”Œ°§§§ dšð^š€š€š}šœŠ“š‘Кš°š}š˜žŒðšššðš}š˜žŒš š}š˜žŒ°šš d©ÐW© dª d«`K«€W«}« š–‘–‹Š››†€«« d¬}¬˜’œ Š››†šŽŠšŒ‹¬à^¬ d­^­}­Š››†•à­}­š’‹†^­ d®}® ŠŒš›–šœ‹’Œ˜€®}®Š››†•À®}®žŠ‹Œœž“š Š››†š–‘–‹À®®À®1®® d¯0^¯ d°}°ŠŒšž›œžŒ‹’Œ˜€°P°À°}°žŠ‹Œœž“š Š››†š–‘–‹À°°À°1°° d±@^± d²ÐW² d³PK³ dŽ dµ d¶ d· dž d¹ dº d» dŒ dŒ dœ dŸ dŸ d¿ dÀ°dÀ Define Area Object type GMCAutoScale #doc object GMCAutoScale ~This object displays a simple scale in conjunction with the GMCGauge, GMCPathTrace, ~and GMCTrendChart objects. To use this object, create an instance of this object and ~set its properties. Then select an instance of a GMCGauge, GMCPathTrace or ~GMCTrendChart and set its scaleObj, scaleObjHorz, or scaleObjVert ~property to refer to the GMCAutoScale you just created. This will attach the ~GMCAutoScale to the other object. Once that occurs, this scale will move and size ~along with the other object. dim enabled as boolean func enabled(newval as boolean) endfunc func StartUp() handles MSG_INIT endfunc handles AutoScale_SelfWarn endfunc func Draw() handles MSG_DRAW endfunc func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE endfunc dim minLabelWidth as integer func minLabelWidth(newVal as integer) endfunc dim digitsAfterDecimal as integer func digitsAfterDecimal(newVal as integer) endfunc dim majorTicks as integer func majorTicks(newVal as integer) endfunc dim minorTicks as integer func minorTicks(newVal as integer) endfunc dim forceEvenSpacing as boolean func forceEvenSpacing (newVal as boolean) endfunc dim font as TTFont func font (newVal as TTFont) endfunc dim fgColor as color func fgColor (newVal as color) endfunc dim ptSize as integer func ptSize (newVal as integer) endfunc dim offset as float func offset(newVal as float) endfunc dim scale as float func scale (newVal as float) endfunc dim attachAlternateSide as boolean func attachAlternateSide(newVal as boolean) endfunc dim rotateText as boolean func rotateText (newVal as boolean) endfunc func AttachTo (leftPos as integer, topPos as integer, rightPos as integer, bottomPos as integer, -> startRange as float, endRange as float, horizontal as boolean, buddy as objref, -> parent as objref, enable as boolean) endfunc endfunc endfunc Enddef #endfile #ifnot Galil_mc_src_GMCSimpleTerminal #option Galil_mc_src_GMCSimpleTerminal #ifnot _GMCST_Constants #option _GMCST_Constants const GMCST_btnMinW := 30 const GMCST_btnPctW := .25 const GMCST_btnMinH := 20 const GMCST_btnPctH := .15 const GMCST_bdrMin := 3 const GMCST_bdrPct := .03 const GMCST_recentListLen := 20 const GMCST_responseListLen := 20 #endif #ifnot _GMCST_Globals #option _GMCST_Globals #hidden dim _GMCST_CurTerm as objref GMCSimpleTerminal #hidden dim _GMCST_CurDropListTarget as objref GMCSimpleTerminal #endif library progobjs source QwertyKeypad library progObjs source ListBoxBDF Define Area Object type GMCSimpleTerminal #ToolImage "00007FEE7FEE7FEE00007FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE0000" '******************************************************************* 'Object: GMCSimpleTerminal 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: A simple terminal for entering interactive commands ' to the controller. ' 'Version: 1.52 'Copyright: 2004 QSI Corporation. Permission to modify and ' distribute this object is granted provided this ' copyright notice remains in tact. '******************************************************************* #doc object GMCSimpleTerminal ~This object is a simple terminal window used to send arbitray commands to the ~controller. You can use this object to compose commands to send to the ~motion controller using a simple on-screen keypad. Recent commands are saved ~so that they may be resent. The results of the commands are displayed in ~the terminal window at the bottom of the object. library standard source ToolMessages library standard source Draw3DRect library standard source TextSingleLineBDF library galil_mc source GMCStringAlloc library galil_mc source GalilCommunications library standard source notes dim enabled as boolean init enabled := true func enabled(newval as boolean) enabled := newval Enable (me, enabled) endfunc dim parent as objref init parent := default func parent(newval as objref) parent := newval Attach(me, parent) endfunc dim xPos as integer init xPos := 0 func xPos(newval as integer) xPos := newVal Relocate (me, xPos, yPos) dirty = true endfunc dim yPos as integer init yPos := 0 func yPos(newval as integer) yPos := newval Relocate (me, xPos, yPos) dirty = true endfunc dim width as integer init width := 25 func width(newval as integer) width := newval Resize (me, width, height) dirty = true endfunc dim height as integer init height := 25 func height(newval as integer) height := newval Resize (me, width, height) dirty = true endfunc dim font as bdffont init font := default func font (newVal as bdffont) dim mu, md, mr, ml, nlx, nly as integer GetBdfFontMetrics (ml, mr, mu, md, nlx, nly, newval, font_normal) lineHeight := nly font := newVal dirty = true endfunc #doc prop bgColorBase ~This property determines the color of the background field of this object. It is also used on the keypad ~object that is used to input new commands. dim bgColorBase as color init bgColorBase := rgb_navy func bgColorBase (newVal as color) bgColorBase := newVal dirty = true endfunc #doc prop bgColor ~This property determines the background color of the buttons and text fields in this object dim bgColor as color init bgColor := col_183 func bgColor (newVal as color) bgColor := newVal dirty = true endfunc #doc prop fgColor ~This property determines the color of text in the buttons and text fields. dim fgColor as color init fgColor := rgb_black func fgColor (newVal as color) fgColor := newVal dirty = true endfunc #doc prop baseBorderWidth ~This determines the width of the border around the object. It also determines the height ~of the buttons on the object and the keypad. dim baseBorderWidth as integer init baseBorderWidth := 2 #doc prop borderWidth ~This determines how deep the recessed text fields are on this object. dim borderWidth as integer init borderWidth := 1 #doc prop customCommandKeySize ~This determines the size of the keys, in pixels, on the Qwerty keypad that is used for text ~entry. The default value of 26 is ideal for most terminals. You may adjust this value if the ~keypad does not fit on the screen of your terminal, or appears smaller than you wish. dim customCommandKeySize as integer init customCommandKeySize := 26 dim tone as _Note init tone := Note_UseDefault #doc prop preSetCommands ~This property determines which commands appear in the drop down list when the terminal is ~started up. Commands must be separated with a semicolon (;).

~NOTE: This property is only used when the terminal starts up. Setting it at ~run-time has no effect. Also, it is not modified as the contenets of the drop down list. dim preSetCommands as string init preSetCommands := "TP;RP;TE;TI;XQ #A;HX" #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty private dim curSendText as string private dim recentSentText[gmcst_recentListLen] as integer private dim recentInsertIdx as integer private dim responses[GMCST_responseListLen] as integer private dim responseInsertIdx as integer private dim sendBox[4] as integer private dim customBox[4] as integer private dim dropBox[4] as integer private dim textWidth, textWidth2 as integer private dim terminalTextStartY as integer private dim pixmap[] as color private dim pw, ph as integer private dim dirty as boolean private dim sendPressed as boolean private dim dropBoxPressed as boolean private dim customPressed as boolean private dim lineHeight as integer private dim numVisLines as integer init dirty := true private func dirty (newVal as boolean) dirty := newVal Rerender(me) endfunc func StartUp() handles MSG_INIT Relocate (me, xPos, yPos) Resize (me, width, height) Enable (me, enabled) Attach (me, parent) GMC_VerifyCommObj(commObject) font(font) ParsePresetCommands() endfunc func Draw() handles MSG_DRAW dim i, cx, cy, min as integer if dirty then DrawBaseImage() else DrawPixmap (xPos, yPos, pixmap, pw, ph) endif if sendPressed then DrawBtnFrame (sendBox, false) elseif customPressed then DrawBtnFrame (customBox, false) elseif dropBoxPressed then _3DFrame (dropBox[2] - (dropBox[3]-dropBox[1]+1) + BorderWidth, dropBox[1]+borderWidth, -> dropBox[2]-borderWidth, dropBox[3]-borderWidth, -> _Shadow3DColors[bgColor], _Highlight3DColors[bgColor], borderWidth) endif cx := dropBox[0] + borderWidth+1 if textWidth > 0 then 'Draw the combo box text SetFgColor (fgColor) SetBgColor (bgColor) _textRect (cx, dropBox[1] + borderWidth+1, -> textWidth, dropBox[3] - dropBox[1] - 1 - 2*borderWidth, -> curSendText, font, HA_Center, VA_Center) endif if textWidth2 > 0 then 'Draw the terminal text if responseInsertIdx > numVisLines then min := responseInsertIdx-1-numVisLines cy := terminalTextStartY + lineHeight*numVisLines else min := 0 cy := terminalTextStartY + lineHeight*(responseInsertIdx-1) endif SetTransparent(bgColor) UseTransparent(True) for i = responseInsertIdx-1 to min step -1 _textrect (cx, cy, textWidth2, lineHeight, _GMCST_StringAlloc.GetString(responses[i]), -> font, ha_left, va_baseline) cy := cy - lineHeight next endif endfunc private func DrawBtnFrame(rect[] as integer, raised as boolean) dim c1, c2 as byte if raised then c1 := _highlight3dColors[bgColor] c2 := _shadow3dcolors[bgColor] else c2 := _highlight3dColors[bgColor] c1 := _shadow3dcolors[bgColor] endif _3DFrame (rect[0], rect[1], rect[2], rect[3], c1, c2, baseborderWidth) endfunc private func DrawBaseImage() dim bw, bh as integer dim bdrW, bdrH as integer dim w, h, xo, yo as integer bw := Calcdimension (width, gmcst_btnPctW, gmcst_btnMinW) bh := Calcdimension (height, gmcst_btnPctH, gmcst_btnMinH) bdrW := Calcdimension (width, gmcst_bdrPct, gmcst_bdrMin) bdrH := Calcdimension (height, gmcst_bdrPct, gmcst_bdrMin) sendBox[0] := xPos+width - baseBorderWidth - bdrW - bw SendBox[1] := yPos+baseBorderWidth + bdrH SendBox[2] := sendBox[0] + bw - 1 SendBox[3] := sendBox[1] + bh - 1 customBox[0] := sendBox[0] customBox[1] := yPos+height-baseBorderWidth-bdrH-bh custombox[2] := sendbox[2] customBox[3] := customBox[1] + bh-1 DropBox[0] := xPos+baseBorderWidth+bdrW DropBox[1] := sendBox[1] DropBox[2] := sendbox[0] - bdrW - 1 DropBox[3] := sendBox[3] _Draw3DColorRect (xPos, yPos, xPos+width-1, yPos+height-1, bgColorBase, baseBorderWidth, true) DrawButtonRegion (sendBox, "Send", true, baseBorderWidth) GetBdfTextSize (w, h, xo, yo, font, "Custom", font_normal) if w > customBox[2]-customBox[0]+1-2*baseBorderWidth-1 then DrawButtonRegion (customBox, "Cust", true, baseBorderWidth) else DrawButtonRegion (customBox, "Custom", true, baseBorderWidth) endif DrawButtonRegion (DropBox, "", false, borderWidth) 'Draw the arrow box textWidth := (dropBox[2] - bh + BorderWidth - 2) - (dropBox[0]+borderWidth) _Draw3DColorRect (dropBox[2] - bh + BorderWidth, dropBox[1]+borderWidth, -> dropBox[2]-borderWidth, dropBox[3]-borderWidth, bgColor, -> borderWidth, true) xo = dropBox[2] - bh/2 yo = dropBox[3] - bh/4 SetFgColor(fgColor) DrawLine (xo, yo, xo, dropBox[1]+bh/4) DrawLine (xo, yo, xo-3, yo-3) DrawLine (xo, yo, xo+3, yo-3) _Draw3DColorRect (dropBox[0], DropBox[3] + bdrH+1, dropBox[2], customBox[3], bgColor, borderWidth, false) 'Do font calculations textWidth2 := (dropBox[2] - 1 - dropBox[0]) - 2*borderWidth terminalTextStartY := (DropBox[3]+bdrH+borderWidth) numVisLines = (((customBox[3]-borderWidth-1) - terminalTextStartY + 1)/lineHeight) - 1 endfunc private func DrawButtonRegion(rgn[] as integer, text[] as byte, raised as boolean, bdr as integer) _Draw3DColorRect (rgn[0], rgn[1], rgn[2], rgn[3], bgColor, bdr, raised) SetFgColor(fgColor) SetBgColor(bgColor) _TextRect (rgn[0]+bdr, rgn[1]+bdr, rgn[2]-rgn[0]+1-2*bdr, -> rgn[3]-rgn[1]+1-2*bdr, text, font, ha_center, va_center) endfunc private func CalcDimension (totalSize as integer, pct as float, min as integer) returns integer dim retVal as integer retVal := pct*totalSize if retVal < min then retVal := min endif return retVal endfunc private func ShowCustomKeypad () _gmcst_curTerm = me _gmcst_customCommand.text = "" _gmcst_customcommand.fillcolor = bgcolorbase _gmcst_customCommand.keybgcolor = bgColor _gmcst_customcommand.keyfgcolor= fgcolor _gmcst_customCommand.marqueebgcolor = bgColor _gmcst_customcommand.marqueefgcolor= fgcolor _gmcst_customcommand.shifted = true _gmcst_customcommand.font = font _gmcst_customcommand.keyfont = font _gmcst_customcommand.keydepth = baseborderwidth _gmcst_customcommand.keywidth = customCommandKeySize _gmcst_customcommand.keyheight = customCommandKeySize _gmcst_customcommand.xpos = (GetPosInfo(default, get_width) - GetPosInfo(_gmcst_customcommand, get_width))/2 _gmcst_customcommand.ypos = (GetPosInfo(default, get_height) - GetPosInfo(_gmcst_customcommand, get_height))/2 _gmcst_customcommand.parent = default SendToFront(_gmcst_customcommand) _gmcst_customcommand.autohide = true _gmcst_customcommand.enabled = true endfunc #undoc func SetCurCommand func SetCurCommand (text as string) curSendText = text AppendToList (recentSentText, recentInsertIdx, gmcst_RecentListLen, text) Rerender(me) endfunc #undoc func ExecuteCurCommand func ExecuteCurCommand() if (commObject <> empty) and (curSendText <> "") then commObject.SendAsciiCommandStream(curSendText, me, 0) endif endfunc private func AppendToList (list[] as reference to integer, curIdx as reference to integer, -> maxLen as integer, data[] as byte) if curIdx < maxLen then list[curIdx] := _GMCST_StringAlloc.AllocString(data) curIdx := curIdx + 1 else AppendToListAndShift(list, data) endif endfunc private func AppendToListAndShift (list[] as reference to integer, data[] as byte) dim leng as integer leng = len(list) if leng > 0 then _GMCST_StringAlloc.FreeString(list[0]) SetArrayData (list, 0, list, 1, -1) list[leng-1] = _GMCST_StringAlloc.AllocString(data) endif endfunc #if _DEBUG private func PrintList(list[] as integer) dim toPrint as string dim i as integer for i = 0 to len(list) - 1 toPrint = toPrint + "(" + str(list[i]) + " - \"" + _GMCST_StringAlloc.GetString(list[i]) + "\") " next #if _tool_any tool_trace (toPrint) #endif endfunc #endif private func ShowDropList() dim offX, offY as integer dim i, max as integer offX = GetPosInfo(me, Get_X) - GetPosInfo(me, Get_XGlobal) offY = GetPosInfo(me, Get_Y) - GetPosInfo(me, Get_YGlobal) _GMCST_DropList.font = font _GMCST_DropList.bgcolor = bgcolor _GMCST_DropList.fgcolor = fgcolor _GMCST_DropList.parent = default _GMCST_DropList.xPos = dropBox[0] - offX _GMCST_DropList.yPos = dropBox[3] - offY + 1 _GMCST_DropList.width = dropBox[2] - dropBox[0] + 1 _GMCST_DropList.height = ypos+height-1-dropBox[3] _GMCST_DropList.borderWidth = borderWidth _GMCST_DropList.scrollBoxSize = dropBox[3] - dropBox[1] + 1 - 2*borderWidth _GMCST_DropList.Clear() max = recentInsertIdx - 1 for i = max to 0 step -1 _GMCST_DropList.AddString (_GMCST_StringAlloc.GetString(recentSentText[i])) next SendToFront(_GMCST_DropList) _GMCST_DropList.enabled = true _GMCST_CurDropListTarget = me SetCapture(_GMCST_DropList) endfunc #undoc func SelectedFromDropList func SelectedFromDropList() dim sel as integer sel = recentInsertIdx - _GMCST_DropList.selected - 1 curSendText = _GMCST_DropList.curSelText 'Swap positions RecentSentText := left(RecentSentText, sel) + -> mid(RecentSentText, sel+1, recentInsertIdx-sel-1) + -> mid(RecentSenttext, sel, 1) + mid(RecentSentText, recentInsertIdx, -1) CancelDropList() Rerender(me) endfunc #undoc func CancelDropList func CancelDropList() _GMCST_CurDropListTarget = empty RemoveCapture(_GMCST_DropList) _GMCST_DropList.enabled = false endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess dim response as string response := trim(commObject.curResponse) if response == "" then response := ":" endif ResponseReceived(response) ProcessResponse(response) return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure dim response as string response := trim(commObject.curResponse) FailureReceived(response, commObject.curFailureReason) if response == "" then response := "?" elseif find(response, 0, -1, "?") < 0 then response := response + "?" endif ProcessResponse(response) return true endfunc private func ProcessResponse (response as string) dim pos, oldPos as integer dim curLine as string oldPos := 0 pos := find (response, 0, -1, "\r\n") while pos > 0 do curLine := mid (response, oldPos, pos-oldPos) oldPos := pos+2 pos := find (response, oldPos, -1, "\r\n") AppendToList(responses, responseInsertIdx, GMCST_responseListLen, curLIne) loop if oldPos < len(response) then curLine := mid(response, oldPos, -1) AppendToList(responses, responseInsertIdx, GMCST_responseListLen, curLIne) endif Rerender(me) endfunc #doc override ResponseReceived #param response:The text of the response from the controller. You may modify the value of this paramater and the results will be reflected in the final display ~This event is triggered after a command has been sent to the controller and a response ~has been received. The paramater response contains the string that the controller ~responded with. You may modify the value of the response property as desired to ~control the display of this object. The object will display whatever is contained ~in the response property after this function executes. By default this event ~does nothing. func ResponseReceived(response as reference to string) return endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as reference to string, failReason as GMC_FailureReason) return endfunc private func ParsePresetCommands() dim pos as integer dim oldPos as integer dim size as integer init size := 10 dim breaks[10], lens[10] as integer dim idx as integer pos = find (preSetCommands, 0, -1, ";") while pos > 0 do breaks[idx] := oldPos lens[idx] := pos - oldPos idx := idx + 1 'resize array if necessary if idx >= size then size := 2*size redim(breaks, size) redim(lens, size) endif oldPos := pos+1 pos := find (preSetCommands, oldPos, -1, ";") loop for idx = idx-1 to 0 step -1 SetCurCommand(mid(preSetCommands, breaks[idx], lens[idx])) next endfunc 'The rest of these functions add functionality to the PC development tool. The '#if _TOOL line ensures that the code will not be compiled into a BFF that 'is loaded into the terminal 'These functions are called in response to actions taken in the PC development tool. 'If as a result of these actions you change one or more of the properties of 'this object that should be permanently recorded (for instance changing xPos in 'response to MSG_TOOL_MOVE) then you should call Tool_Persist to save the new 'value of the property in your source code of your object instance #if _TOOL 'This function is called by the PC development tool, when you change the attachment 'of an object (i.e. in response to dragging it around the object tree). 'Note: the purpose of this function is to allow you to attach to another 'container, you should not change your parent property or call Tool_Persist 'until you receive a MSG_TOOL_ATTACHED. A MSG_TOOL_ATTACHED will be sent 'in response to an Attach API function call. func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH Attach (me, attachTo) endfunc 'This function is called in response to calling Attach (primarily in a 'handler for MSG_TOOL_ATTACH, but possibly in other places as well_. func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED 'Set our parent property to reflect who we are attached to and save parent := newParent Tool_Persist (parent) 'Save parent endfunc 'This function is called when the user drags an object instance with the 'mouse in the PC development tool. dx and dy are relative offsets from the current 'location of the object func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE xPos := xPos + dx yPos := yPos + dy Relocate (me, xPos, yPos) 'Save the changes we just made Tool_Persist (xPos) Tool_Persist (yPos) dirty = true endfunc 'This function is called by the PC development tool to obtain the coordinates of 'the resize grips. The arrays xCoords, yCoords, and cursors all contain 0 'elements initially. This means that you should either call redim on those 'arrays and set their values, or declare local arrays, set the values of 'the local arrays, and then assign xCoords, yCoords and cursors to those 'local arrays. Closed indicates whether the Foundry should connect the 'first and last grips to make a closed object. xCoords, yCoords, and 'cursors should all contain the same number of elements when this function 'completes func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolGetHandles (xCoords, yCoords, cursors, closed, xPos, yPos, width, height) endfunc 'This function is called in response to a user moving a resize grip within 'the PC development tool. handleNum is the index into the arrays that were returned 'by the handler for MSG_TOOL_GETHANDLES. You should return true from this 'function func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolMoveHandle (handleNum, dx, dy, xPos, yPos, width, height, me) dirty = true endfunc 'This function is called when the user created an instance of this template by 'selecting it from the object palette and dragging it in the layout view. 'The handler for MSG_INIT is not called automatically, and if you want it 'called, you should call it manually. 'You should call Tool_Persist on all the properties that you set up in this 'message handler. (x1, y1) are the coordinates that the user started his 'drag and (x2, y2) are the coordinates that the mouse was released func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE 'Call a standard function to handle common functionality. 'You can omit this function call and implement your own custom functionality 'if desired _ToolDragCreate (parentObj, x1, y1, x2, y2, xPos, yPos, width, height, parent) 'Call our MSG_INIT handler StartUp() endfunc #endif private func ScreenPress (xdown as integer, ydown as integer) returns boolean handles MSG_SCREEN_PRESS if (xdown >= custombox[0]) and (ydown >= customBox[1]) and -> (xdown < customBox[2]) and (ydown < customBox[3]) then customPressed := true Rerender(me) elseif (xdown >= sendBox[0]) and (ydown >= sendBox[1]) and -> (xdown < sendBox[2]) and (ydown < sendBox[3]) then sendPressed := true Rerender(me) elseif (xdown >= dropBox[0]) and (ydown >= dropBox[1]) and -> (xdown < dropBox[2]) and (ydown < dropBox[3]) then Rerender(me) dropBoxPressed = true endif return true endfunc private func ScreenRelease (xdown as integer, ydown as integer) returns boolean handles MSG_SCREEN_RELEASE if (xdown >= custombox[0]) and (ydown >= customBox[1]) and -> (xdown < customBox[2]) and (ydown < customBox[3]) then if customPressed then ShowCustomKeypad() _PlayTone (tone, 100, false) endif elseif (xdown >= sendBox[0]) and (ydown >= sendBox[1]) and -> (xdown < sendBox[2]) and (ydown < sendBox[3]) then if sendPressed then ExecuteCurCommand() _PlayTone (tone, 100, false) endif elseif (xdown >= dropBox[0]) and (ydown >= dropBox[1]) and -> (xdown < dropBox[2]) and (ydown < dropBox[3]) then if dropBoxPressed then ShowDropList() _PlayTone (tone, 100, false) endif endif if sendPressed or customPressed or dropBoxPressed then Rerender(me) endif sendPressed := false customPressed := false dropBoxPressed := false return true endfunc private func ScreenMove (xto as integer, yto as integer, xfrom as integer, yfrom as integer) returns boolean handles MSG_SCREEN_MOVE if (xto < xPos) or (yto < yPos) or (xto >= xPos + width) or (yTo >= yPos+ height) then return ScreenRelease(xto, yto) endif return true endfunc Enddef Declare _GMCST_CustomCommand as QwertyKeypad Level 249996 #Visible True #Lock False init keywidth := 26 init xpos := -10000 init ypos := -10000 init keybgcolor := col_253 init parent := default init shiftstyle := _qpk_capslock_shift init fillbackground := True init shifted := true init enabled := false init marqueepos := _qkp_topattached init keyfgcolor := col_47 init marqueefgcolor := col_84 init marqueebgcolor := rgb_forestgreen init text := "asdfasdf" init separators := false init popupstyle := _qkp_standardpopup init autohide := true func EnterPressed() if _GMCST_CurTerm <> empty then _GMCST_CurTerm.SetCurCommand(text) _GMCST_CurTerm.ExecuteCurCommand() endif endfunc Enddec '------------------------------------------------------------------------------------ Declare _GMCST_DropList as ListBoxBDF Level 249997 #Visible False #Lock False init lastsel := -1 init parent := default init xpos := -10000 init ypos := -10000 init width := 124 init height := 101 init bgcolor := col_183 init fgcolor := rgb_white init enabled := false protected func ScreenPress(x as integer, y as integer) returns boolean handles MSG_SCREEN_PRESS if (x < xPos) or (y < yPos) or (x >= xPos + width) or (y > yPos+height) then if _GMCST_CurDropListTarget <> empty then _GMCST_CurDropListTarget.CancelDropList() endif return true endif return Default(x, y) endfunc protected func ScreenRelease (x as integer, y as integer) returns boolean handles MSG_SCREEN_RELEASE if (x < xPos) or (y < yPos) or (x >= xPos + width) or (y > yPos+height) then if _GMCST_CurDropListTarget <> empty then _GMCST_CurDropListTarget.CancelDropList() endif return true endif return default(x, y) endfunc protected func ScreenMove (xto as integer, yto as integer, xfrom as integer, yfrom as integer) returns boolean handles MSG_SCREEN_MOVE if (xto < xPos) or (yto < yPos) or (xto >= xPos + width) or (yto > yPos+height) then if _GMCST_CurDropListTarget <> empty then _GMCST_CurDropListTarget.CancelDropList() endif return true endif return default (xto, yto, xfrom, yfrom) endfunc func SelChanged() if _GMCST_CurDropListTarget <> empty then _GMCST_CurDropListTarget.SelectedFromDropList() endif endfunc Enddec '---------------------------------------------------------------------------------------- declare _GMCST_StringAlloc as StringAlloc enddec #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œŒ–’“š‹š’–‘ž“ dtd˜ž“–“ ’œ Œœ ˜’œŒ–’“š‹š’–‘ž“ d dTe ˜’œŒ‹ œ‘Œ‹ž‘‹Œ dtd ˜’œŒ‹ œ‘Œ‹ž‘‹Œ dàD} ˜’œŒ‹ ‹‘’–‘ˆ dàD} ˜’œŒ‹ ‹‘œ‹ˆ€> dàD} ˜’œŒ‹ ‹‘’–‘— dàD} ˜’œŒ‹ ‹‘œ‹—š™> d d àD } ˜’œŒ‹ ›’–‘   d àD } ˜’œŒ‹ ›œ‹  Âõ< d d àD } ˜’œŒ‹ šœš‘‹“–Œ‹“š‘   dàD}˜’œŒ‹ šŒ‘Œš“–Œ‹“š‘ d d d dTe ˜’œŒ‹ ˜“ž“Œ dtd ˜’œŒ‹ ˜“ž“Œ deÀD} ˜’œŒ‹ œŠ‹š’ÐDà>}˜’œŒ–’“š‹š’–‘ž“ deÀD} ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹ÐDà>}˜’œŒ–’“š‹š’–‘ž“ d d d dÀd}˜•ŒÐd} Žˆš‹†”š†ž› dÀd}˜•ŒÐd} “–Œ‹‡›™ dKK K@K}˜’œŒ–’“š‹š’–‘ž“ d@dC<ÏÏÏÏȹººÈ¹ººÈ¹ººÏÏÏÏȹ¹ºÈ¹¹ºÈ¹¹ºÈ¹¹ºÈ¹¹ºÈ¹¹ºÈ¹¹ºÈ¹¹ºÈ¹¹ºÏÏÏÏ d d d d d d d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0Àd0}0Œ‹ž‘›ž›Ðd0}0 ‹“’šŒŒž˜šŒ d1Àd1}1Œ‹ž‘›ž›Ðd1}1 ›žˆÌ›šœ‹ d2Àd2}2Œ‹ž‘›ž›Ðd2}2‹š‡‹Œ–‘˜“š“–‘š›™ d3Àd3}3˜ž“–“ ’œÐd3}3˜’œŒ‹–‘˜ž““œ d4Àd4}4˜ž“–“ ’œÐd4}4˜ž“–“œ’’Š‘–œž‹–‘Œ d5Àd5}5Œ‹ž‘›ž›Ðd5}5‘‹šŒ d6 d7 d8ÀD8}8š‘ž“š›ÐD8°>8 d9ðD9}9š‘ž“š›919 d:€W:}:š‘ž“š›€:}:‘šˆ‰ž“ÐD:°>:: d;};š‘ž“š›;};‘šˆ‰ž“ d<}<š‘ž“š€<à^<À<}<š‘ž“š›< d=ÐW= d> d?ÀD?}?žš‘‹ÐD?à>? d@ðD@}@žš‘‹@P@ dA€WA}Ažš‘‹€A}A‘šˆ‰ž“ÐDAà>AA dB}Bžš‘‹B}B‘šˆ‰ž“ dC}Cž‹‹žœ—€Cà^CÀC}Cžš‘‹C dDÐWD dE dFÀDF}F‡ŒÐDF€>F dGðDG}G‡ŒGG dH€WH}H‡Œ€H}H‘šˆ‰ž“ÐDH€>HH dI}I‡ŒI}I‘šˆ‰ž“ dJ}Jš“œž‹š€Jà^JÀJ}J‡ŒÀJ}J†ŒJ dK}K›–‹†ÐK1K dLÐWL dM dNÀDN}N†ŒÐDN€>N dOðDO}O†ŒOO dP€WP}P†Œ€P}P‘šˆ‰ž“ÐDP€>PP dQ}Q†ŒQ}Q‘šˆ‰ž“ dR}Rš“œž‹š€Rà^RÀR}R‡ŒÀR}R†ŒR dS}S›–‹†ÐS1S dTÐWT dU dVÀDV}Vˆ–›‹—ÐDV€>V dWðDW}Wˆ–›‹—WW dX€WX}Xˆ–›‹—€X}X‘šˆ‰ž“ÐDX€>XX dY}Yˆ–›‹—Y}Y‘šˆ‰ž“ dZ}ZšŒ–…š€Zà^ZÀZ}Zˆ–›‹—ÀZ}Z—š–˜—‹Z d[}[›–‹†Ð[1[ d\ÐW\ d] d^ÀD^}^—š–˜—‹ÐD^€>^ d_ðD_}_—š–˜—‹__ d`€W`}`—š–˜—‹€`}`‘šˆ‰ž“ÐD`€>`` da}a—š–˜—‹a}a‘šˆ‰ž“ db}bšŒ–…š€bà^bÀb}bˆ–›‹—Àb}b—š–˜—‹b dc}c›–‹†Ðc1c ddÐWd de dfÀDf}f™‘‹ÐDf?f dgðDg}g™‘‹gPg dh€Wh}h™‘‹€h}h‘šˆ‰ž“ÐDh?hh diÀDi}i’ŠÀi}i’›Ài}i’Ài}i’“Ài}i‘“‡Ài}i‘“†ÐDi€>i dj}j˜š‹›™™‘‹’š‹–œŒ€j}j’“Àj}j’Àj}j’ŠÀj}j’›Àj}j‘“‡Àj}j‘“†Àj}j‘šˆ‰ž“Àj}j ™‘‹ ‘’ž“j dk dl}l “–‘š—š–˜—‹l}l‘“† dm dn}n™‘‹n}n‘šˆ‰ž“ do}o›–‹†Ðo1o dpÐWp dq dr ds dt duÀDu}u ˜œ“žŒšÐDuð>u dvðDv}v ˜œ“žŒšv}v˜ ‘ž‰† dw€Ww}w ˜œ“žŒš€w}w‘šˆ‰ž“ÐDwð>ww dx}x ˜œ“žŒšx}x‘šˆ‰ž“ dy}y›–‹†Ðy1y dzÐWz d{ d| d} d~ÀD~}~˜œ“ÐD~ð>~ dðD}˜œ“}œ“ ÎÇÌ d€€W€}€˜œ“€€}€‘šˆ‰ž“ÐD€ð>€€ d}˜œ“}‘šˆ‰ž“ d‚}‚›–‹†Ð‚1‚ dƒÐWƒ d„ d… d† d‡ÀD‡}‡™˜œ“ÐD‡ð>‡ dˆðDˆ}ˆ™˜œ“ˆ}ˆ ˜ “žœ” d‰€W‰}‰™˜œ“€‰}‰‘šˆ‰ž“ÐD‰ð>‰‰ dŠ}Š™˜œ“Š}Š‘šˆ‰ž“ d‹}‹›–‹†Ð‹1‹ dŒÐWŒ d dŽ d d d‘ÀD‘}‘žŒš›šˆ–›‹—ÐD‘€>‘ d’ðD’}’žŒš›šˆ–›‹—’’ d“ d” d• d–ÀD–}– ›šˆ–›‹—ÐD–€>– d—ðD—}— ›šˆ–›‹——— d˜ d™ dš d› dœ dÀD}œŠŒ‹’œ’’ž‘›”š†Œ–…šÐD€> džðDž}žœŠŒ‹’œ’’ž‘›”š†Œ–…šžž dŸ d ÀD } ‹‘šÐD }  ‘‹š d¡ðD¡}¡‹‘š¡}¡‘‹š ŠŒš›š™žŠ“‹ d¢ d£ d€ d¥ dŠ d§ dšÀDš}ššŒš‹œ’’ž‘›ŒÐDšÀ>š d©ðD©}©šŒš‹œ’’ž‘›Œ©C©«¯Ä­¯Ä«ºÄ«¶Ä§®ßÜŸÄ·§ dª d« d¬ d­ d® d¯ d° d± d²ÀD²}² œ’’•šœ‹ÐD²à>²}²˜ž“–“œ’’Š‘–œž‹–‘ d³ðD³}³ œ’’•šœ‹³}³š’‹† dŽ dµ d¶ d·`K·ÀD·}· œŠŒš‘›‹š‡‹ÐD·À>· dž`KžÀDž}žšœš‘‹Œš‘‹‹š‡‹°ž}ž˜’œŒ‹ šœš‘‹“–Œ‹“š‘ОÐDž€>ž d¹`K¹ÀD¹}¹šœš‘‹–‘Œš‹–›‡ÐD¹€>¹ dº`KºÀDº}º šŒ‘ŒšŒ°º}º˜’œŒ‹ šŒ‘Œš“–Œ‹“š‘кÐDº€>º d»`K»ÀD»}»šŒ‘Œš–‘Œš‹–›‡ÐD»€>» dŒ dœ`KœÀDœ}œŒš‘›‡°œœÐœÐDœ€>œ dŸ`KŸÀDŸ}Ÿ œŠŒ‹’‡°ŸŸÐŸÐDŸ€>Ÿ d¿`K¿ÀD¿}¿›‡°¿¿Ð¿ÐD¿€>¿ dÀ`KÀÀDÀ}À ‹š‡‹ˆ–›‹—ÀÀ}À ‹š‡‹ˆ–›‹—ÍÐDÀ€>À dÁ`KÁÀDÁ}Á‹š’–‘ž“‹š‡‹Œ‹ž‹†ÐDÁ€>Á d dÃ`KÃÀDÃ}Ï–‡’ž°ÃÐÃÐDÃð>à dÄ`KÄÀDÄ}ďˆÀÄ}ď—ÐDĀ>Ä dÅ`KÅÀDÅ}Å›–‹†ÐDŰ>Å dÆ dÇ`KÇÀDÇ}Ç Œš‘›šŒŒš›ÐDǰ>Ç dÈ`KÈÀDÈ}È›‡šŒŒš›ÐDȰ>È dÉ`KÉÀDÉ}É œŠŒ‹’šŒŒš›ÐDɰ>É dÊ dË`KËÀDË}Ë “–‘š—š–˜—‹ÐDˀ>Ë dÌ`KÌÀDÌ}Ì ‘Š’‰–Œ“–‘šŒÐD̀>Ì dÍ dÎðDÎ}Λ–‹†Î1Î dÏ`KπWÏ}Ï›–‹†€Ï}Ï‘šˆ‰ž“ÐDϰ>ϐÏ dÐ}Л–‹†Ð}Ð‘šˆ‰ž“ dÑ}Ñšš‘›š€Ñà^ѐÑ dÒÐWÒ dÓ dԀWÔ}ÔŒ‹ž‹Š€ԐÔ dÕÀWÕ}Õ’Œ˜ –‘–‹ dÖ}Öš“œž‹š€Öà^ÖÀÖ}Ö‡ŒÀÖ}Ö†ŒÖ d×}×šŒ–…š€×à^×À×}׈–›‹—À×}×—š–˜—‹× dØ}Øš‘ž“š€Øà^ØÀØ}Øš‘ž“𛐨 dÙ}Ùž‹‹žœ—€Ùà^ÙÀÙ}ُžš‘‹Ù dÚ dÛ}Û˜’œ ‰š–™†œ’’•€Û}Û œ’’•šœ‹Û dÜ}Ü™‘‹€Ü}Ü™‘‹Ü dÝ}ݏžŒššŒš‹œ’’ž‘›Œ€ݐÝ dÞÐWÞ dß dà€Wà}à›žˆ€àà dáÀWá}á’Œ˜ ›žˆ dâ dãÀDã}ã–Àã}㜇Àã}㜆Àã}ã’–‘ÐDã€>ã dä då^å}å›–‹†^å dæ}æ ›žˆžŒš–’ž˜š€ææ dç0^ç dè}è ›žˆ–‡’ž€è}臏ŒÀè}膏ŒÀè}菖‡’žÀè}菈Àè}菗è dé@^é dê dë^ë}ë Œš‘›šŒŒš›^ë dì}ì ›žˆ‹‘™ž’š€ì}쌚‘›‡ÀìAìì dí ^í}í œŠŒ‹’šŒŒš›^í dî}î ›žˆ‹‘™ž’š€î}î œŠŒ‹’‡ÀîAîî dï ^ï}‡šŒŒš›^ï dð}ð Ì›™ž’š€ð}𛍐‡°ððÐðÐð€ð}𛍐‡°ððÐðÐð}𛍐‡°ððÐð°ððð°ð}𠝐›šˆ–›‹—Àð}𛍐‡°ððÐð°ð}𠝐›šˆ–›‹—Àð}ñ›‡°ññÐñÐñ}ñ ›šˆ–›‹—Àñ}ñ›‡°ññÐñÐñ}ñ ›šˆ–›‹—Àñ}ò Œ—ž›ˆÌ›œ“Œ°ò}ò˜œ“ÐòÀò}ò —–˜—“–˜—‹Ì›œ“Œ°ò}ò˜œ“ÐòÀò}ò ›šˆ–›‹—ò dó@^ó dô dõ}õœ‡õ}õ›‡°õõÐõ°õ}õ ›šˆ–›‹—°õõ dö^ö}ö ‹š‡‹ˆ–›‹—àöö^ö d÷ dø}ø Œš‹™˜œ“€ø}ø™˜œ“ø dù}ù Œš‹˜œ“€ù}ù˜œ“ù dú}ú  ‹š‡‹šœ‹€ú}úœ‡Àú}ú›‡°úúÐú°ú}ú ›šˆ–›‹—°úúÀú}û ‹š‡‹ˆ–›‹—Àû}û›‡°ûûÐûÐû}û›‡°ûûÐûÐûûÐûû û}û ›šˆ–›‹—Àû}ü œŠŒš‘›‹š‡‹Àü}ü™‘‹Àü}ü —ž œš‘‹šÀü}ü ‰ž œš‘‹šü dý dþ@^þ dÿ^ÿ}ÿ ‹š‡‹ˆ–›‹—Íàÿÿ^ÿ d d^}šŒ‘Œš–‘Œš‹–›‡à} ‘Š’‰–Œ“–‘šŒ^ d}’–‘}šŒ‘Œš–‘Œš‹–›‡ÐÐ} ‘Š’‰–Œ“–‘šŒ d}œ†}‹š’–‘ž“‹š‡‹Œ‹ž‹†°} “–‘š—š–˜—‹ } ‘Š’‰–Œ“–‘šŒ d0^ d}’–‘ d}œ†}‹š’–‘ž“‹š‡‹Œ‹ž‹†°} “–‘š—š–˜—‹ €}šŒ‘Œš–‘Œš‹–›‡Ð d@^ d d } Œš‹‹ž‘Œžš‘‹€ } ˜œ“  d } ŠŒš‹ž‘Œžš‘‹€ 1   d P^ } –Ð } šŒ‘Œš–‘Œš‹–›‡Ð   W } ’–‘p^ Ð   d }   ‹š‡‹šœ‹€ } œ‡À } œ†À }  ‹š‡‹ˆ–›‹—ÍÀ }  “–‘š—š–˜—‹À }  ˜’œŒ‹ Œ‹–‘˜ž““œà }  ˜š‹Œ‹–‘˜€ }  šŒ‘ŒšŒ° } –Ð  À } ™‘‹À } —ž “š™‹À }  ‰ž žŒš“–‘š  d}œ†}œ†Ð} “–‘š—š–˜—‹ d`^ d@^ d d dÐW d d`K€W} ›žˆ‹‘™ž’š€}šœ‹°ÐÐD€>À}ž–Œš›ÐD°> dÀD}œÎÀ}œÍÐD > d d^}ž–Œš›^ d}œÎ} —–˜—“–˜—‹Ì›œ“Œ°}˜œ“Ð d}œÍ} Œ—ž›ˆÌ›œ“Œ°}˜œ“Ð d0^ d}œÍ} —–˜—“–˜—‹Ì›œ“Œ°}˜œ“Ð d}œÎ} Œ—ž›ˆÌ›œ“Œ°}˜œ“Ð d@^ d d }  Ì›™ž’š€ } šœ‹°  Ð À } šœ‹°  Ð À } šœ‹°  Ð À } šœ‹°  Ð À } œÎÀ } œÍÀ } žŒš›šˆ–›‹—  d!ÐW! d" d#`K#€W#}# ›žˆžŒš–’ž˜š€## d$ÀD$}$ˆÀ$}$—ÐD$€>$ d%ÀD%}%›ˆÀ%}%›—ÐD%€>% d&ÀD&}&ˆÀ&}&—À&}&‡À&}&†ÐD&€>& d' d(}(ˆ(}( œž“œ›–’š‘Œ–‘€(}(ˆ–›‹—À(}( ˜’œŒ‹ ‹‘œ‹ˆÀ(}( ˜’œŒ‹ ‹‘’–‘ˆ( d)})—)}) œž“œ›–’š‘Œ–‘€)})—š–˜—‹À)}) ˜’œŒ‹ ‹‘œ‹—À)}) ˜’œŒ‹ ‹‘’–‘—) d*}*›ˆ*}* œž“œ›–’š‘Œ–‘€*}*ˆ–›‹—À*}* ˜’œŒ‹ ›œ‹À*}* ˜’œŒ‹ ›’–‘* d+}+›—+}+ œž“œ›–’š‘Œ–‘€+}+—š–˜—‹À+}+ ˜’œŒ‹ ›œ‹À+}+ ˜’œŒ‹ ›’–‘+ d, d-}-Œš‘›‡°--Ð--}-‡Œ°-}-ˆ–›‹—Ð-}-žŒš›šˆ–›‹—Ð-}-›ˆÐ-}-ˆ d.}.Œš‘›‡°..Ð..}.†Œ°.}.žŒš›šˆ–›‹—°.}.›— d/}/Œš‘›‡°//Ð//}/Œš‘›‡°//Ð/°/}/ˆÐ// d0}0Œš‘›‡°00Ð00}0Œš‘›‡°00Ð0°0}0—Ð00 d1 d2}2 œŠŒ‹’‡°22Ð22}2Œš‘›‡°22Ð2 d3}3 œŠŒ‹’‡°33Ð33}3†Œ°3}3—š–˜—‹Ð3}3žŒš›šˆ–›‹—Ð3}3›—Ð3}3— d4}4 œŠŒ‹’‡°44Ð44}4Œš‘›‡°44Ð4 d5}5 œŠŒ‹’‡°55Ð55}5 œŠŒ‹’‡°55Ð5°5}5—Ð55 d6 d7}7›‡°77Ð77}7‡Œ°7}7žŒš›šˆ–›‹—°7}7›ˆ d8}8›‡°88Ð88}8Œš‘›‡°88Ð8 d9}9›‡°99Ð99}9Œš‘›‡°99Ð9Ð9}9›ˆÐ99 d:}:›‡°::Ð::}:Œš‘›‡°::Ð: d; d<}< ›žˆÌ›œ“šœ‹€<}<‡ŒÀ<}<†ŒÀ<}<‡Œ°<}<ˆ–›‹—Ð<<À<}<†Œ°<}<—š–˜—‹Ð<<À<}< ˜œ“žŒšÀ<}<žŒš›šˆ–›‹—À<1<< d= d>}>›žˆŠ‹‹‘š˜–‘€>}>Œš‘›‡À>C>¬š‘›À>1>À>}>žŒš›šˆ–›‹—> d?}?˜š‹›™‹š‡‹Œ–…š€?}?ˆÀ?}?—À?}?‡À?}?†À?}?™‘‹À?C?ŒŠŒ‹’À?}? ™‘‹ ‘’ž“? d@^@}@ˆà@}@ œŠŒ‹’‡°@@Ð@Ð@}@ œŠŒ‹’‡°@@Ð@°@@Ð@@ @}@žŒš›šˆ–›‹—Ð@@^@ dA}A›žˆŠ‹‹‘š˜–‘€A}A œŠŒ‹’‡ÀACAŒŠŒ‹ÀA1AÀA}AžŒš›šˆ–›‹—A dB0^B dC}C›žˆŠ‹‹‘š˜–‘€C}C œŠŒ‹’‡ÀCCCŒŠŒ‹’ÀC1CÀC}CžŒš›šˆ–›‹—C dD@^D dE}E›žˆŠ‹‹‘š˜–‘€E}E›‡ÀECEÀEAEÀE}E ›šˆ–›‹—E dF dG dH}H ‹š‡‹ˆ–›‹—H€H}H›‡°HHÐHÐH}H—°H}H ›šˆ–›‹—ÐHHHÐH€H}H›‡°HHÐH°H}H ›šˆ–›‹—H dI}I ›žˆÌ›œ“šœ‹€I}I›‡°IIÐIÐI}I—°I}I ›šˆ–›‹—ÀI}I›‡°IIÐI°I}I ›šˆ–›‹—ÀI}J›‡°JJÐJÐJ}J ›šˆ–›‹—ÀJ}J›‡°JJÐJÐJ}J ›šˆ–›‹—ÀJ}J˜œ“ÀJ}K ›šˆ–›‹—ÀK1KK dL}L‡ÐL}L›‡°LLÐLÐL}L—ðLL dM}M†ÐM}M›‡°MMÐMÐM}M—ðMM dN}N Œš‹™˜œ“€N}N™˜œ“N dO}O›žˆ“–‘š€O}O‡ÀO}O†ÀO}O‡ÀO}O›‡°OOÐO°O}O—ðOOO dP}P›žˆ“–‘š€P}P‡ÀP}P†ÀP}P‡ÐPPÀP}P†ÐPPP dQ}Q›žˆ“–‘š€Q}Q‡ÀQ}Q†ÀQ}Q‡°QQÀQ}Q†ÐQQQ dR dS}S ›žˆÌ›œ“šœ‹€S}S›‡°SSÐSÀS}S›‡°SSÐS°S}S›—°SSÀS}S›‡°SSÐSÀS}S œŠŒ‹’‡°SSÐSÀS}S˜œ“ÀS}S ›šˆ–›‹—ÀSASS dT dU dV}V ‹š‡‹ˆ–›‹—ÍV€V}V›‡°VVÐVÐVVÐV}V›‡°VVÐVVÐVV V}V ›šˆ–›‹— dW}W‹š’–‘ž“‹š‡‹Œ‹ž‹†W€W}W›‡°WWÐW°W}W›—°W}W ›šˆ–›‹—W dX}X ‘Š’‰–Œ“–‘šŒÐX€X€X€X}X œŠŒ‹’‡°XXÐXÐX}X ›šˆ–›‹—ÐXXXÐX}X‹š’–‘ž“‹š‡‹Œ‹ž‹†°XXXðX}X “–‘š—š–˜—‹XÐXX dYÐWY dZ d[`K[€W[}[›žˆŠ‹‹‘š˜–‘€[}[˜‘°[Ð[ÐD[€>[À[}[‹š‡‹°[Ð[ÐD[ >[À[}[ž–Œš›ÐD[°>[À[}[›ÐD[€>[[ d\}\ ›žˆÌ›œ“šœ‹€\}\˜‘°\\Ð\À\}\˜‘°\\Ð\À\}\˜‘°\\Ð\À\}\˜‘°\\Ð\À\}\˜œ“À\}\›À\}\ž–Œš›\ d]}] Œš‹™˜œ“€]}]™˜œ“] d^}^ Œš‹˜œ“€^}^˜œ“^ d_}_  ‹š‡‹šœ‹€_}_˜‘°__Ð_°_}_›À_}_˜‘°__Ð_°_}_›À_}_˜‘°__Ð_Ð_}_˜‘°__Ð_°__Ð__ _}_›À_}`˜‘°``Ð`Ð`}`˜‘°``Ð`°``Ð`` `}`›À`}`‹š‡‹À`}`™‘‹À`}` —ž œš‘‹šÀ`}` ‰ž œš‘‹š` daÐWa db dc`Kc€Wc}c œž“œ›–’š‘Œ–‘€c}c ‹‹ž“Œ–…šÐDc€>cÀc}cœ‹ÐDc>cÀc}c’–‘ÐDc€>cc°Wc€>c ddÀDd}dš‹‰ž“ÐDd€>d de df}fš‹‰ž“f}fœ‹ f}f ‹‹ž“Œ–…š dg^g}gš‹‰ž“Àg}g’–‘^g dh}hš‹‰ž“h}h’–‘ di@^i dj dkð^k}kš‹‰ž“ dlÐWl dm dn`Kn€Wn}nŒ—ˆœŠŒ‹’”š†ž›€nn do}o ˜’œŒ‹ œŠ‹š’Ðoà^o dp dq}q ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àq}q‹š‡‹ÐqCq dr}r ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àr}r ™–““œ“Ðr}r ˜œ“žŒš ds}s ˜’œŒ‹ œŠŒ‹’œ’’ž‘›às}s ”š†˜œ“Ðs}s˜œ“ dt}t ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àt}t ”š†™˜œ“Ðt}t™˜œ“ du}u ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àu}u’žŽŠšš˜œ“Ðu}u˜œ“ dv}v ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àv}v’žŽŠšš™˜œ“Ðv}v™˜œ“ dw}w ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àw}wŒ—–™‹š›Ðw1w dx}x ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àx}x™‘‹Ðx}x™‘‹ dy}y ˜’œŒ‹ œŠŒ‹’œ’’ž‘›ày}y”š†™‘‹Ðy}y™‘‹ dz}z ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àz}z”š†›š‹—Ðz}zžŒš›šˆ–›‹— d{}{ ˜’œŒ‹ œŠŒ‹’œ’’ž‘›à{}{”š†ˆ–›‹—Ð{}{œŠŒ‹’œ’’ž‘›”š†Œ–…š d|}| ˜’œŒ‹ œŠŒ‹’œ’’ž‘›à|}| ”š†—š–˜—‹Ð|}|œŠŒ‹’œ’’ž‘›”š†Œ–…š d}}} ˜’œŒ‹ œŠŒ‹’œ’’ž‘›à}}}‡ŒÐ}€}}} ˜š‹Œ–‘™€}P}À}}} ˜š‹ ˆ–›‹—}Ð}}} ˜š‹Œ–‘™€}}} ˜’œŒ‹ œŠŒ‹’œ’’ž‘›À}}} ˜š‹ ˆ–›‹—}}ð}} d~}~ ˜’œŒ‹ œŠŒ‹’œ’’ž‘›à~}~†ŒÐ~€~}~ ˜š‹Œ–‘™€~P~À~}~ ˜š‹ —š–˜—‹~Ð~}~ ˜š‹Œ–‘™€~}~ ˜’œŒ‹ œŠŒ‹’œ’’ž‘›À~}~ ˜š‹ —š–˜—‹~~ð~~ d d€}€ ˜’œŒ‹ œŠŒ‹’œ’’ž‘›à€}€žš‘‹Ð€P€ d} Œš‘›‹™‘‹€} ˜’œŒ‹ œŠŒ‹’œ’’ž‘› d‚}‚ ˜’œŒ‹ œŠŒ‹’œ’’ž‘›à‚}‚žŠ‹—–›šÐ‚1‚ dƒ}ƒ ˜’œŒ‹ œŠŒ‹’œ’’ž‘›àƒ}ƒš‘ž“š›Ðƒ1ƒ d„ÐW„ d… d† d‡€W‡}‡ Œš‹œŠœ’’ž‘›€‡}‡‹š‡‹ÐD‡À>‡‡ dˆ}ˆ œŠŒš‘›‹š‡‹Ðˆ}ˆ‹š‡‹ d‰ dŠ}Š žš‘›‹“–Œ‹€Š}Ššœš‘‹Œš‘‹‹š‡‹ÀŠ}Ššœš‘‹–‘Œš‹–›‡ÀŠ}Š˜’œŒ‹ šœš‘‹“–Œ‹“š‘ÀŠ}Š‹š‡‹Š d‹ dŒ}Œšš‘›š€Œà^ŒŒ dÐW dŽ d d€W}š‡šœŠ‹šœŠœ’’ž‘›€ d‘^‘€‘}‘ œ’’•šœ‹à‘}‘š’‹†‘`‘€‘}‘ œŠŒš‘›‹š‡‹à‘C‘‘^‘ d’}’ œ’’•šœ‹à’}’Œš‘›žŒœ––œ’’ž‘›Œ‹šž’€’}’ œŠŒš‘›‹š‡‹À’à^’À’’’ d“@^“ d”ÐW” d• d–`K–€W–}– žš‘›‹“–Œ‹€–}–“–Œ‹°–ЖÐD–W– W–€>–À–}–œŠ–›‡ÐD–W– W–€>–À–}—’ž‡“š‘ÐD—€>—À—}—›ž‹ž°—ЗÐD— >—— d˜^˜}˜œŠ–›‡À˜}˜’ž‡“š‘^˜ d™}™“–Œ‹°™}™œŠ–›‡Ð™™}™ ˜’œŒ‹ Œ‹–‘˜ž““œà™}™ ž““œŒ‹–‘˜€™}™›ž‹ž™ dš}šœŠ–›‡š}šœŠ–›‡°šš d›0^› dœ}œžš‘›‹“–Œ‹ž‘›Œ—–™‹€œ}œ“–Œ‹Àœ}œ›ž‹žœ d@^ džÐWž dŸ d `K €W } žš‘›‹“–Œ‹ž‘›Œ—–™‹€ } “–Œ‹° Ð ÐD W  W €> À } ›ž‹ž° Ð ÐD  >   d¡ÀD¡}¡“š‘˜ÐD¡€>¡ d¢}¢“š‘˜Ð¢}¢“š‘€¢}¢“–Œ‹¢ d£ d€^€}€“š‘˜à€€^€ d¥}¥ ˜’œŒ‹ Œ‹–‘˜ž““œà¥}¥ ™ššŒ‹–‘˜€¥}¥“–Œ‹°¥¥Ð¥¥ dŠ}Š Œš‹žž†›ž‹ž€Š}Š“–Œ‹ÀŠŠÀŠ}Š“–Œ‹ÀŠŠÀŠÐŠŠŠ d§}§“–Œ‹°§}§“š‘˜Ð§§Ð§Ð§}§ ˜’œŒ‹ Œ‹–‘˜ž““œà§}§ ž““œŒ‹–‘˜€§}§›ž‹ž§ dš@^š d©ÐW© dª d«„d« ›šŠ˜ d¬`K¬€W¬}¬ –‘‹“–Œ‹€¬}¬“–Œ‹°¬Ð¬ÐD¬€>¬¬ d­ÀD­}­‹–‘‹ÐD­À>­ d® d¯ÀD¯}¯–ÐD¯€>¯ d° d±P^±}±–б± W±}±“š‘€±}±“–Œ‹±Ð±± d²}²‹–‘‹Ð²}²‹–‘‹°²C²×°²}²Œ‹€²}²“–Œ‹°²}²–в²°²C²ßÒßݰ²}² ˜’œŒ‹ Œ‹–‘˜ž““œà²}² ˜š‹Œ‹–‘˜€²}²“–Œ‹°²}²–в²°²C²ÝÖßß d³`^³ dŽ dµ„dµ  ‹“ ž‘† d¶}¶ ‹“ ‹žœš€¶}¶‹–‘‹¶ d· d· džÐWž d¹ d¹ dº d»`K»€W»}» Œ—ˆ›“–Œ‹€»» dŒÀDŒ}Œ™™‡ÀŒ}Œ™™†ÐDŒ€>Œ dœÀDœ}œ–Àœ}œ’ž‡ÐDœ€>œ dŸ d¿}¿™™‡Ð¿}¿ ˜š‹Œ–‘™€¿à^¿À¿}¿˜š‹ ‡¿Ð¿}¿ ˜š‹Œ–‘™€¿à^¿À¿}¿ ˜š‹ ‡˜“ž“¿ dÀ}À™™†ÐÀ}À ˜š‹Œ–‘™€Àà^ÀÀÀ}À˜š‹ †ÀÐÀ}À ˜š‹Œ–‘™€Àà^ÀÀÀ}À ˜š‹ †˜“ž“À dÁ dÂ} ˜’œŒ‹ ›“–Œ‹àÂ}™‘‹ÐÂ}™‘‹ dÃ}à˜’œŒ‹ ›“–Œ‹àÃ}ݘœ“ÐÃ}ݘœ“ dÄ}Ä ˜’œŒ‹ ›“–Œ‹àÄ}Ä™˜œ“ÐÄ}Ä™˜œ“ dÅ}Å ˜’œŒ‹ ›“–Œ‹àÅ}ŏžš‘‹ÐÅPÅ dÆ}Æ ˜’œŒ‹ ›“–Œ‹àÆ}ƇŒÐÆ}Æ›‡°ÆÆÐÆÐÆ}Ɛ™™‡ dÇ}Ç ˜’œŒ‹ ›“–Œ‹àÇ}džŒÐÇ}Ç›‡°ÇÇÐÇÐÇ}ǐ™™†°ÇÇ dÈ}È ˜’œŒ‹ ›“–Œ‹àÈ}Ȉ–›‹—ÐÈ}È›‡°ÈÈÐÈÐÈ}È›‡°ÈÈÐȰÈÈ dÉ}É ˜’œŒ‹ ›“–Œ‹àÉ}É—š–˜—‹ÐÉ}ɆŒ°É}É—š–˜—‹ÐÉÉÐÉ}É›‡°ÉÉÐÉ dÊ}Ê ˜’œŒ‹ ›“–Œ‹àÊ}Ê ›šˆ–›‹—ÐÊ}Ê ›šˆ–›‹— dË}Ë ˜’œŒ‹ ›“–Œ‹àË}Ë Œœ““‡Œ–…šÐË}Ë›‡°ËËÐËÐË}Ë›‡°ËËÐ˰ËËÐËË Ë}Ë ›šˆ–›‹— dÌ dÍ}Í ˜’œŒ‹ ›“–Œ‹àÍ}Íœ“šž€ÍÍ dÎ}Î’ž‡ÐÎ}Îšœš‘‹–‘Œš‹–›‡ÐÎÎ dÏP^Ï}Ï–ÐÏ}Ï’ž‡ WÏÏp^ÏÐÏÏ dÐ}Р˜’œŒ‹ ›“–Œ‹àÐ}Ð ž››Œ‹–‘˜€Ð}Р˜’œŒ‹ Œ‹–‘˜ž““œàÐ}Ð ˜š‹Œ‹–‘˜€Ð}Ðšœš‘‹Œš‘‹‹š‡‹°Ð}ЖÐААРdÑ`^Ñ dÒ dÓ dÔ}Ô Œš‘›‹™‘‹€Ô}Ô ˜’œŒ‹ ›“–Œ‹Ô dÕ}Õ ˜’œŒ‹ ›“–Œ‹àÕ}Õš‘ž“š›ÐÕ1Õ dÖ}Ö ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹ÐÖà^Ö d× dØ}Ø Œš‹œž‹Šš€Ø}Ø ˜’œŒ‹ ›“–Œ‹Ø dÙÐWÙ dÚ dÛ dÜ€WÜ}ÜŒš“šœ‹š›™’›“–Œ‹€ÜÜ dÝÀDÝ}ÝŒš“ÐDÝ€>Ý dÞ dß}ߌš“Ðß}ßšœš‘‹–‘Œš‹–›‡Ðß}ß ˜’œŒ‹ ›“–Œ‹àß}ßŒš“šœ‹š›Ðßß dà}à œŠŒš‘›‹š‡‹Ðà}à ˜’œŒ‹ ›“–Œ‹àà}à œŠŒš“‹š‡‹ dá dâ dã}㍚œš‘‹Œš‘‹‹š‡‹ã}ã“𙋀ã}㍚œš‘‹Œš‘‹‹š‡‹Àã}㌚“ã°ã}ä’–›€ä}䍚œš‘‹Œš‘‹‹š‡‹Àä}䌚“°ääÀä}䍚œš‘‹–‘Œš‹–›‡Ðä}䌚“Ðäää°ä}å’–›€å}博œš‘‹Œš‘‹‹š‡‹Àå}匚“Àååå°å}å’–›€å}博œš‘‹Œš‘‹‹š‡‹Àå}博œš‘‹–‘Œš‹–›‡ÀåÐååå dæ}朞‘œš“›“–Œ‹€ææ dç}獚š‘›š€çà^çç dèÐWè dé dê dë€Wë}뜞‘œš“›“–Œ‹€ëë dì}ì ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹Ðì}ìš’‹† dí}í š’‰šœž‹Šš€í}í ˜’œŒ‹ ›“–Œ‹í dî}î ˜’œŒ‹ ›“–Œ‹àî}îš‘ž“š›ÐîAî dïÐWï dð dñ dò`Kò€Wò}òŒŠœœšŒŒ€ò}òž’ÐDò€>òò°Wò°>ò dóÀWó}ó˜’œ œ’’ŒŠœœšŒŒ dô dõÀDõ}õšŒ‘ŒšÐDõÀ>õ dö}öšŒ‘Œšö}ö‹–’€ö}ö œ’’•šœ‹àö}ö œŠšŒ‘Œšö d÷ dø^ø}øšŒ‘ŒšÐøCø^ø dù}ùšŒ‘ŒšùCùÅ dú@^ú dû dü}üšŒ‘Œššœš–‰š›€ü}üšŒ‘Œšü dý dþ}þœšŒŒšŒ‘Œš€þ}þšŒ‘Œšþ dÿ dð^1 dÐW d d`K€W}™ž–“Šš€}ž’ÐD€>°W°> dÀW}˜’œ œ’’™ž–“Šš d dÀD}šŒ‘ŒšÐDÀ> d}šŒ‘Œš}‹–’€} œ’’•šœ‹à} œŠšŒ‘Œš d}™ž–“Šššœš–‰š›€}šŒ‘ŒšÀ} œ’’•šœ‹à}œŠ™ž–“ŠššžŒ‘ d  d ^ } šŒ‘ŒšÐ C ^  d } šŒ‘Œš C À d  ^ } ™–‘›€ } šŒ‘ŒšÀ  À Ð  À C À À  ^  d } šŒ‘Œš } šŒ‘Œš° C À d@^ d d}œšŒŒšŒ‘Œš€}šŒ‘Œš d dð^1 dÐW d d`K€W}œšŒŒšŒ‘Œš€}šŒ‘ŒšÐDÀ> dÀD}ŒÀ}“›ŒÐD€> dÀD}œŠ“–‘šÐDÀ> d d}“›Œ d}Œ}™–‘›€}šŒ‘ŒšÀÀÐÀCòõ d€^}Œà^ d}œŠ“–‘š}’–›€}šŒ‘ŒšÀ}“›ŒÀ}ŒÐ}“›Œ d}“›Œ}Œ° d}Œ}™–‘›€}šŒ‘ŒšÀ}“›ŒÀÐÀCòõ d d }  žš‘›‹“–Œ‹€ }  šŒ‘ŒšŒÀ } šŒ‘Œš–‘Œš‹–›‡À } ˜’œŒ‹ šŒ‘Œš“–Œ‹“š‘À } œŠ“–‘š  d! ^! d" d#^#}#“›ŒÀ#}#“š‘€#}#šŒ‘Œš#^# d$}$œŠ“–‘š$}$’–›€$}$šŒ‘ŒšÀ$}$“›ŒÀ$Ð$$$ d%}% žš‘›‹“–Œ‹€%}% šŒ‘ŒšŒÀ%}%šŒ‘Œš–‘Œš‹–›‡À%}%˜’œŒ‹ šŒ‘Œš“–Œ‹“š‘À%}%œŠ“–‘š% d&@^& d' d( d)})šš‘›š€)à^)) d*ÐW* d+ d, d- d. d/ d0 d1 d2 d3 d4€W4}4šŒ‘Œššœš–‰š›€4}4šŒ‘ŒšÐD4W4 W4À>44 d5ð^5 d6ÐW6 d7 d8 d9 d: d; d< d=€W=}=™ž–“Šššœš–‰š›€=}=šŒ‘ŒšÐD=W= W=À>=À=}= ™ž–“šžŒ‘ÐD=}=˜’œ ™ž–“ŠššžŒ‘= d>ð^> d?ÐW? d@ dA`KA€WA}AžŒššŒš‹œ’’ž‘›Œ€AA dBÀDB}BŒÐDB€>B dCÀDC}C“›ŒÐDC€>C dDÀDD}DŒ–…šÐDD€>D dEðDE}EŒ–…šEE dFÀDF}Fšž”Œ°FF ÐFÀF}F“š‘Œ°FF ÐFÐDF€>F dGÀDG}G–›‡ÐDG€>G dH dI}IŒÐI}I™–‘›€I}IšŒš‹œ’’ž‘›ŒÀIIÀIÐIIÀICIĐI dJ dK€^K}KŒàKK^K dL}Lšž”Œ°L}L–›‡ÐLL}L“›Œ dM}M“š‘Œ°M}M–›‡ÐMM}MŒÐM}M“›Œ dN}N–›‡N}N–›‡°NN dO dP dQ^Q}Q–›‡ðQ}QŒ–…š^Q dR}RŒ–…šRR R}RŒ–…š dS}Sš›–’€S}Sšž”ŒÀS}SŒ–…šS dT}Tš›–’€T}T“š‘ŒÀT}TŒ–…šT dU@^U dV dW}W“›ŒW}WŒ°WW dX}XŒX}X™–‘›€X}XšŒš‹œ’’ž‘›ŒÀX}X“›ŒÀXÐXXÀXCXĐX dY ^Y dZ d[P^[}[–›‡Ð[}[–›‡Ð[[ W[[p^[Ð[[ d\}\ Œš‹œŠœ’’ž‘›€\}\’–›€\}\šŒš‹œ’’ž‘›ŒÀ\}\šž”Œ°\}\–›‡Ð\À\}\“š‘Œ°\}\–›‡Ð\\\ d]`^] d^ d_ÐW_ d` da db dc dd de df dg dh di dj dk„dk ‹“ dl dm dn do dp dq dr€Wr}r ‹“ž‹‹žœ—€r}rž‹‹žœ—‹ÐDrà>rr dsÀWs}s’Œ˜ ‹“ ž‹‹žœ— dt du}už‹‹žœ—€uà^uÀu}už‹‹žœ—‹u dvÐWv dw dx dy dz€Wz}z ‹“ž‹‹žœ—š›€z}z ‘šˆžš‘‹ÐDzà>zz d{ÀW{}{’Œ˜ ‹“ ž‹‹žœ—š› d| d} d~}~žš‘‹~}~ ‘šˆžš‘‹ d} ‹“ šŒ–Œ‹€}žš‘‹ d€ÐW€ d d‚ dƒ d„ d…€W…}…‹“’‰š€…}…›‡ÐD…€>…À…}…›†ÐD…€>…… d†ÀW†}† ’Œ˜ ‹“ ’‰š d‡ dˆ}ˆ‡Œˆ}ˆ‡Œ°ˆ}ˆ›‡ d‰}‰†Œ‰}‰†Œ°‰}‰›† dŠ}Šš“œž‹š€Šà^ŠÀŠ}ЇŒÀŠ}ІŒŠ d‹ dŒ d} ‹“ šŒ–Œ‹€}‡Œ dŽ}Ž ‹“ šŒ–Œ‹€Ž}ކŒŽ d}›–‹†Ð1 dÐW d‘ d’ d“ d” d• d– d— d˜ d™ dš d›€W›}›‹“˜š‹—ž‘›“šŒ€›}›‡œ›Œ°›Ð›ÐD›W› W›€>›À›}œ†œ›Œ°œÐœÐDœWœ Wœ€>œÀœ}œŠŒŒ°ÐÐDW W} ˜Š–œŠŒŒÀ}žœ“Œš›ÐDžWž Wž°>žž dŸÀWŸ}Ÿ’Œ˜ ‹“ ˜š‹—ž‘›“šŒ d  d¡ d¢ d£ d€}€ ‹“˜š‹—ž‘›“šŒ€€}€‡œ›ŒÀ€}€†œ›ŒÀ€}€œŠŒŒÀ€}€œ“Œš›À€}€‡ŒÀ€}€†ŒÀ€}€ˆ–›‹—À€}€—š–˜—‹€ d¥ dŠÐWŠ d§ dš d© dª d« d¬€W¬}¬‹“’‰š—ž‘›“š€¬}¬ —ž‘›“š‘Š’ÐD¬W¬ W¬€>¬À¬}¬›‡ÐD¬€>¬À¬}¬›†ÐD¬€>¬¬ d­ÀW­}­’Œ˜ ‹“ ’‰š—ž‘›“š d® d¯ d° d± d²}² ‹“’‰š—ž‘›“š€²}² —ž‘›“š‘Š’À²}²›‡À²}²›†À²}²‡ŒÀ²}²†ŒÀ²}²ˆ–›‹—À²}²—š–˜—‹À²à^²² d³}³›–‹†Ð³1³ dŽ dµÐWµ d¶ d· dž d¹ dº d» dŒ dœ dŸ€WŸ}Ÿ‹“›ž˜œšž‹š€Ÿ}Ÿ žš‘‹•ÐDŸà>ŸÀŸ}Ÿ‡ÎÐDŸ€>ŸÀŸ}Ÿ†ÎÐDŸ€>ŸÀŸ}¿‡ÍÐD¿€>¿À¿}¿†ÍÐD¿€>¿¿ dÀÀWÀ}À’Œ˜ ‹“ ›ž˜œšž‹š dÁ d dà dÄ dÅ}Å ‹“›ž˜œšž‹š€Å}Å žš‘‹•ÀÅ}ŇÎÀÅ}ņÎÀÅ}ŇÍÀÅ}ņÍÀÅ}ҏŒÀÅ}ņŒÀÅ}ň–›‹—ÀÅ}Å—š–˜—‹ÀÅ}ŏžš‘‹Å dÆ dÇ dÈ}ÈŒ‹ž‹Š€ÈÈ dÉÐWÉ dÊ dË dË dÌ dÍ`KÍ€WÍ}Í Œœšš‘šŒŒ€Í}͇›ˆ‘ÐDÍ€>ÍÀÍ}͆›ˆ‘ÐDÍ€>͐ͰWͰ>Í dÎÀWÎ}Î’Œ˜ Œœšš‘ šŒŒ dÏ^Ï€Ï}χ›ˆ‘ðÏ}Ï œŠŒ‹’‡°ÏÏÐϐÏ`Ï€Ï}φ›ˆ‘ðÏ}Ï œŠŒ‹’‡°ÏÏÐϐÏ`Ï€Ð}Ї›ˆ‘ÀÐ}Ð œŠŒ‹’‡°ÐÐÐАÐ`ЀÐ}І›ˆ‘ÀÐ}Ð œŠŒ‹’‡°ÐÐÐАÐ^Ð dÑ}Ñ œŠŒ‹’šŒŒš›Ñ1Ñ dÒ}Òšš‘›š€Òà^ÒÒ dÓ ^Ó€Ó}Ó‡›ˆ‘ðÓ}ÓŒš‘›‡°ÓÓÐӐÓ`Ó€Ó}Ó†›ˆ‘ðÓ}ÓŒš‘›‡°ÓÓÐӐÓ`Ó€Ô}Ô‡›ˆ‘ÀÔ}ÔŒš‘›‡°ÔÔÐԐÔ`Ô€Ô}Ô†›ˆ‘ÀÔ}ÔŒš‘›‡°ÔÔÐԐÔ^Ô dÕ}Õ Œš‘›šŒŒš›Õ1Õ dÖ}Öšš‘›š€Öà^ÖÖ d× ^×€×}ׇ›ˆ‘ð×}×›‡°××Ðא×`×€×}׆›ˆ‘ð×}×›‡°××Ðא×`×€Ø}؇›ˆ‘ÀØ}Ø›‡°ØØÐؐØ`Ø€Ø}؆›ˆ‘ÀØ}Ø›‡°ØØÐؐØ^Ø dÙ}Ùšš‘›š€Ùà^ِ٠dÚ}Ú›‡šŒŒš›ÐÚ1Ú dÛ@^Û dÜ dÝð^Ý1Ý dÞÐWÞ dß dà`Kà€Wà}à Œœšš‘š“šžŒš€à}à‡›ˆ‘ÐDà€>àÀà}à†›ˆ‘ÐDà€>àà°Wà°>à dáÀWá}á’Œ˜ Œœšš‘ š“šžŒš dâ dã^ã€ã}㇛ˆ‘ðã}ã œŠŒ‹’‡°ããÐãã`ã€ã}㆛ˆ‘ðã}ã œŠŒ‹’‡°ããÐãã`ã€ä}䇛ˆ‘Àä}ä œŠŒ‹’‡°ääÐää`ä€ä}䆛ˆ‘Àä}ä œŠŒ‹’‡°ääÐää^ä då^å}å œŠŒ‹’šŒŒš›^å dæ}挗ˆœŠŒ‹’”š†ž›€ææ dç}ç  “ž†‹‘š€ç}狐‘šÀççdÀçAçç dè@^è dé ^é€é}釛ˆ‘ðé}錚‘›‡°ééÐéé`é€é}醛ˆ‘ðé}錚‘›‡°ééÐéé`é€ê}ꇛˆ‘Àê}ꌚ‘›‡°êêÐêê`ê€ê}ꆛˆ‘Àê}ꌚ‘›‡°êêÐêê^ê dë^ë}ë Œš‘›šŒŒš›^ë dì}ìš‡šœŠ‹šœŠœ’’ž‘›€ìì dí}í  “ž†‹‘š€í}틐‘šÀíídÀíAíí dî@^î dï ^ï€ï}ˆ‘ðï}‡°ïïÐïï`ï€ï}ˆ‘ðï}‡°ïïÐïï`ï€ð}ð‡›ˆ‘Àð}𛍐‡°ððÐðð`ð€ð}ð†›ˆ‘Àð}𛍐‡°ððÐðð^ð dñ^ñ}ñ›‡šŒŒš›^ñ dò}ò Œ—ˆ›“–Œ‹€òò dó}ó  “ž†‹‘š€ó}󋐑šÀóódÀóAóó dô@^ô dõ@^õ dö d÷^÷}÷ Œš‘›šŒŒš›À÷}÷ œŠŒ‹’šŒŒš›À÷}÷›‡šŒŒš›^÷ dø}øšš‘›š€øà^øø dù@^ù dú dû}û Œš‘›šŒŒš›ûAû dü}ü œŠŒ‹’šŒŒš›üAü dý}ý›‡šŒŒš›ýAý dþð^þ1þ dÿÐWÿ d d`K€W} Œœšš‘’‰š€}‡‹ÐD€>À}†‹ÐD€>À}‡™’ÐD€>À}†™’ÐD€>°W°> dÀW}’Œ˜ Œœšš‘ ’‰š d d^€}‡‹À}‡ŒÀ€}†‹À}†ŒÀ€}‡‹ð}‡Œ°}ˆ–›‹—À€}†‹ð}†Œ°}—š–˜—‹^ dð^} Œœšš‘š“šžŒš€}‡‹À}†‹ d@^ d dð^1 d ÐW  d PK  d  d  d  d d d@Q} ˜’œŒ‹ œŠŒ‹’œ’’ž‘›ÐD} Žˆš‹†”š†ž› d`QŒÐ dPd1 dàdA dðD}”š†ˆ–›‹— dðD}‡ŒÐ' dðD}†ŒÐ' dðD} ”š†˜œ“}œ“ ÍÊÌ dðD}žš‘‹P dðD} Œ—–™‹Œ‹†“š} Ž” œžŒ“œ” Œ—–™‹ dðD}™–““žœ”˜Š‘›1 dðD}Œ—–™‹š›1 d dðD}š‘ž“š›A dðD} ’žŽŠššŒ} Ž” ‹ž‹‹žœ—š› d d ðD }  ”š†™˜œ“ } œ“ ËÈ d!ðD!}!’žŽŠšš™˜œ“!}!œ“ ÇË d"ðD"}"’žŽŠšš˜œ“"}"˜ ™šŒ‹˜šš‘ d#ðD#}#‹š‡‹#C#žŒ›™žŒ›™ d$ðD$}$ Œšžž‹Œ$A$ d%ðD%}% ŠŒ‹†“š%}% Ž” Œ‹ž‘›ž›Š d&ðD&}&žŠ‹—–›š&1& d' d(€W(}( š‘‹ššŒŒš›€(( d) d*^*}* ˜’œŒ‹ œŠ‹š’à*}*š’‹†^* d+}+ ˜’œŒ‹ œŠ‹š’à+}+ Œš‹œŠœ’’ž‘›€+}+‹š‡‹+ d,}, ˜’œŒ‹ œŠ‹š’à,},š‡šœŠ‹šœŠœ’’ž‘›€,, d-@^- d.ÐW. d/PQ/ d0 d1 d2 d3@Q3}3 ˜’œŒ‹ ›“–Œ‹ÐD3}3 “–Œ‹‡›™ d4`Q44Ð d5Pd5A5 d6àd6A6 d7ðD7}7“žŒ‹Œš“7Ð77 d8ðD8}8žš‘‹8P8 d9ðD9}9‡Œ9Ð99' d:ðD:}:†Œ:Ð::' d;ðD;};ˆ–›‹—;;| d<ðD<}<—š–˜—‹<<e d=ðD=}=˜œ“=}=œ“ ÎÇÌ d>ðD>}>™˜œ“>}> ˜ ˆ—–‹š d?ðD?}?š‘ž“š›?A? d@ dApKA€WA}A Œœšš‘šŒŒ€A}A‡ÐDA€>AÀA}A†ÐDA€>AA°WA°>A dBÀWB}B’Œ˜ Œœšš‘ šŒŒ dC dD^D€D}D‡ÀD}D‡ŒDÀD€D}D†ÀD}D†ŒDÀD€D}D‡ðD}D‡Œ°D}Dˆ–›‹—DÀD€D}D†àD}D†Œ°D}D—š–˜—‹D^D dE^E}E ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹àE}Eš’‹†^E dF}F ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹àF}Fœž‘œš“›“–Œ‹€FF dG@^G dHð^H1H dI@^I dJ dKð^KPK€K}K‡ÀK}K†K dLÐWL dM dNpKN€WN}N Œœšš‘š“šžŒš€N}N‡ÐDN€>NÀN}N†ÐDN€>NN°WN°>N dOÀWO}O’Œ˜ Œœšš‘ š“šžŒš dP dQ^Q€Q}Q‡ÀQ}Q‡ŒQÀQ€Q}Q†ÀQ}Q†ŒQÀQ€Q}Q‡ðQ}Q‡Œ°Q}Qˆ–›‹—QÀQ€Q}Q†àQ}Q†Œ°Q}Q—š–˜—‹Q^Q dR^R}R ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹àR}Rš’‹†^R dS}S ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹àS}Sœž‘œš“›“–Œ‹€SS dT@^T dUð^U1U dV@^V dW dXð^XPX€X}X‡ÀX}X†X dYÐWY dZ d[pK[€W[}[ Œœšš‘’‰š€[}[‡‹ÐD[€>[À[}[†‹ÐD[€>[À[}[‡™’ÐD[€>[À[}[†™’ÐD[€>[[°W[°>[ d\ÀW\}\’Œ˜ Œœšš‘ ’‰š d] d^^^€^}^‡‹À^}^‡Œ^À^€^}^†‹À^}^†Œ^À^€^}^‡‹ð^}^‡Œ°^}^ˆ–›‹—^À^€^}^†‹à^}^†Œ°^}^—š–˜—‹^^^ d_^_}_ ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹à_}_š’‹†^_ d`}` ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹à`}`œž‘œš“›“–Œ‹€`` da@^a dbð^b1b dc@^c dd deð^ePe€e}e‡‹Àe}e†‹Àe}e‡™’Àe}e†™’e dfÐWf dg dh€Wh}h Œš“œ—ž‘˜š›€hh di^i}i ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹ài}iš’‹†^i dj}j ˜’œŒ‹ œŠ›“–Œ‹‹ž˜š‹àj}jŒš“šœ‹š›™’›“–Œ‹€jj dk@^k dlÐWl dmPQm dn do dp dq@Qq}q ˜’œŒ‹ Œ‹–‘˜ž““œÐDq}q Œ‹–‘˜ž““œ drPQr ds dt dt du dv°dv Define Area Object type GMCSimpleTerminal #doc object GMCSimpleTerminal ~This object is a simple terminal window used to send arbitray commands to the ~controller. You can use this object to compose commands to send to the ~motion controller using a simple on-screen keypad. Recent commands are saved ~so that they may be resent. The results of the commands are displayed in ~the terminal window at the bottom of the object. dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc dim xPos as integer func xPos(newval as integer) endfunc dim yPos as integer func yPos(newval as integer) endfunc dim width as integer func width(newval as integer) endfunc dim height as integer func height(newval as integer) endfunc dim font as bdffont func font (newVal as bdffont) endfunc #doc prop bgColorBase ~This property determines the color of the background field of this object. It is also used on the keypad ~object that is used to input new commands. dim bgColorBase as color func bgColorBase (newVal as color) endfunc #doc prop bgColor ~This property determines the background color of the buttons and text fields in this object dim bgColor as color func bgColor (newVal as color) endfunc #doc prop fgColor ~This property determines the color of text in the buttons and text fields. dim fgColor as color func fgColor (newVal as color) endfunc #doc prop baseBorderWidth ~This determines the width of the border around the object. It also determines the height ~of the buttons on the object and the keypad. dim baseBorderWidth as integer #doc prop borderWidth ~This determines how deep the recessed text fields are on this object. dim borderWidth as integer #doc prop customCommandKeySize ~This determines the size of the keys, in pixels, on the Qwerty keypad that is used for text ~entry. The default value of 26 is ideal for most terminals. You may adjust this value if the ~keypad does not fit on the screen of your terminal, or appears smaller than you wish. dim customCommandKeySize as integer dim tone as _Note #doc prop preSetCommands ~This property determines which commands appear in the drop down list when the terminal is ~started up. Commands must be separated with a semicolon (;).

~NOTE: This property is only used when the terminal starts up. Setting it at ~run-time has no effect. Also, it is not modified as the contenets of the drop down list. dim preSetCommands as string #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication endfunc func StartUp() handles MSG_INIT endfunc func Draw() handles MSG_DRAW endfunc endfunc endfunc endfunc endfunc endfunc #undoc func SetCurCommand func SetCurCommand (text as string) endfunc #undoc func ExecuteCurCommand func ExecuteCurCommand() endfunc endfunc endfunc endfunc endfunc #undoc func SelectedFromDropList func SelectedFromDropList() endfunc #undoc func CancelDropList func CancelDropList() endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc endfunc #doc override ResponseReceived #param response:The text of the response from the controller. You may modify the value of this paramater and the results will be reflected in the final display ~This event is triggered after a command has been sent to the controller and a response ~has been received. The paramater response contains the string that the controller ~responded with. You may modify the value of the response property as desired to ~control the display of this object. The object will display whatever is contained ~in the response property after this function executes. By default this event ~does nothing. func ResponseReceived(response as reference to string) endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications or GMC_FailBadCommand ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as reference to string, failReason as GMC_FailureReason) endfunc endfunc func ToolAttach (attachTo as objref) handles MSG_TOOL_ATTACH endfunc func ToolAttached (newParent as objref) handles MSG_TOOL_ATTACHED endfunc func ToolMove (dx as integer, dy as integer) handles MSG_TOOL_MOVE endfunc func ToolGetHandles (xCoords[] as reference to integer, -> yCoords[] as reference to integer, -> cursors[] as reference to GuiCursors, -> closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc func ToolMoveHandle (handleNum as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE endfunc func ToolDragCreate (parentObj as objref, x1 as integer, y1 as integer, -> x2 as integer, y2 as integer) handles MSG_TOOL_DRAGCREATE endfunc handles MSG_SCREEN_PRESS endfunc handles MSG_SCREEN_RELEASE endfunc handles MSG_SCREEN_MOVE endfunc Enddef func EnterPressed() endfunc protected func ScreenPress(x as integer, y as integer) returns boolean handles MSG_SCREEN_PRESS endfunc protected func ScreenRelease (x as integer, y as integer) returns boolean handles MSG_SCREEN_RELEASE endfunc protected func ScreenMove (xto as integer, yto as integer, xfrom as integer, yfrom as integer) returns boolean handles MSG_SCREEN_MOVE endfunc func SelChanged() endfunc #endfile #ifnot Galil_mc_src_GMCTrendChart #option Galil_mc_src_GMCTrendChart Define Area Object type GMCTrendChart #ToolImage "00007FFE71FE6EFE5F7E5F7E3FBE2AAA7FBE7FDE7FDE7FEC7FF27FFE0000" '********************************************************************************************** 'Object: TrendChart 'Author: Randy Flint and Cody Stockwell 'Date: 27 May 2004 'Description: This object draws a graph of data received 'Version: 1.52 ' 'Copyright 2004 QSI Corporation 'Permission is granted to copy, distribute and modify this code, 'provided that this copyright statement is preserved. '*********************************************************************************************** library galil_mc source GalilCommunications library galil_mc source GMCAutoScale dim enabled as boolean init enabled := true func enabled(newval as boolean) enable(me, newval) enabled := newval Zenabled(enabled) if scaleObj <> empty then scaleObj.enabled = enabled endif endfunc dim parent as objref func parent(newval as objref) attach(me, newval) parent := newval endfunc dim xpos as integer init xpos := 0 func xpos(newval as integer) dim i, xoffset, arraysize as integer xoffset := newval - xpos arraysize := numdatapoints+3 xpos := newval if startuphasrun then for i=0 to arraysize xqueue[i] := xqueue[i] + xoffset next endif xpos1 := xpos + width-1 relocate(me, xpos, ypos) DoBuddyAttach() endfunc dim ypos as integer init ypos := 0 func ypos(newval as integer) dim i, yoffset, arraysize as integer yoffset := newval - ypos arraysize := numdatapoints-1 ypos := newval for i=0 to arraysize yqueue[i] := yqueue[i] + yoffset next charty0 := ypos + height-2 ywrap[1] := ypos + height ywrap[2] := ypos + height ypos1 := ypos + height-1 relocate(me, xpos, ypos) DoBuddyAttach() endfunc dim width as integer init width := 200 func width(newval as integer) if newval > 0 then width := newval precalc() endif endfunc dim height as integer init height := 103 func height(newval as integer) if newval > 0 then height := newval precalc() endif DoBuddyAttach() endfunc dim fgcolor as color init fgcolor := rgb_white func fgcolor(newval as color) fgcolor := newval rerender(me) endfunc dim bgcolor as color init bgcolor := rgb_black func bgcolor(newval as color) bgcolor := newval rerender(me) endfunc dim bordercolor as color init bordercolor := rgb_white func bordercolor(newval as color) bordercolor := newval rerender(me) endfunc dim transparent as boolean func transparent(newval as boolean) transparent := newval rerender(me) endfunc #doc prop connectPoints ~Set connectPoints to true to draw a line between all points on the trend chart. Set this ~property to false to show the points simply as dots. dim connectpoints as boolean init connectpoints := true func connectpoints(newval as boolean) connectpoints := newval rerender(me) endfunc private dim qindex as integer #doc prop pointSeparation ~This property determines how far apart data points are displayed. Larger values of ~pointSeparation result in a trendChart that shows fewer data points at any given time. dim pointseparation as integer init pointseparation := 5 func pointseparation(newval as integer) if newval > 0 then pointseparation := newval else pointseparation := 1 endif rerender(me) endfunc #doc prop highLimit ~This property helps determine the scale of the trend chart. HighLimit represents the ~topmost location in the trend chart. Data points that are logged that have the value of ~highLimit or larger are displayed in the top line of the trendChart. Normally you should ~choose a highLimit that is as large or larger than the largest possible data point. dim highlimit as float init highlimit := 100 func highlimit(newval as float) highlimit := newval precalc() rerender(me) endfunc #doc prop lowLimit ~This property helps determine the scale of the trend chart. LowLimit represents the ~bottommost location in the trend chart. Data points that are logged that have the value of ~lowLimit or smaller are displayed in the bottom line of the trendChart. Normally you should ~choose a lowLimit that is as small or smaller than the smallest possible data point. dim lowlimit as float init lowlimit := 0 func lowlimit(newval as float) lowlimit := newval precalc() rerender(me) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty #doc prop inputType ~InputType determines which property of the motion controller will be reflected in the ~gauge. Select an appropriate type from the drop down list. If you need to poll data ~that is not in the dropdown list, then set the customCommand property to query the ~information and useCustomCommand property to true. dim inputType as GMC_DataType init inputType := GMC_Position func inputType(newVal as GMC_DataType) inputType := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc #doc prop inputSource ~If the inputType property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSource property to select which axis to query. dim inputSource as GMC_Axis init inputSource := GMC_Axis_X func inputSource (newVal as GMC_Axis) inputSource := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc private dim command as string #doc prop useCustomCommand ~Set this value to true if you will be using a custom command to poll the controller.

If this ~value is true, then this object will poll the controller using the information in the ~customCommand property rather than the values of the inputType and ~inputSource properties.

If this value is false, then the customCommand ~property is ingored and the inputType and inputSource properties are used instead. dim useCustomCommand as boolean init useCustomCommand := false func useCustomCommand (newVal as boolean) useCustomCommand := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc #doc prop customCommand ~Use this property to send a custom polling command to the controller. You should use this ~property only if you cannot obtain the information you need by using the inputType and ~inputSource properties. The controller should return a single numeric value in decimal ~format in response to the custom command that you define.

Note: The customCommand ~property is ignored unless the useCustomCommand property is set to true. dim customCommand as string init customCommand := "" func CustomCommand (newval as string) customCommand := newVal command := GMCDataTypeToCommand(inputType, inputSource, useCustomCommand, customCommand) endfunc #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer init pollInterval := 1000 func pollInterval (newVal as integer) if newVal <= 0 then pollInterval := 0 UnregisterMsgHandler (me, msg_timetick, 0) else pollInterval := newVal RegisterMsghandler (me, msg_timetick, newVal/20) endif endfunc #doc prop scaleObj ~If you want a scale displayed next to this object, create a GMCAutoScale object, set its ~properties, then set the scaleObj to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObj as objref GMCAutoScale init scaleObj := empty func scaleObj(newVal as GMCAutoScale) if scaleObj <> empty then scaleObj.enabled = false endif scaleObj := newVal DoBuddyAttach() endfunc private dim xpos1 as integer private dim ypos1 as integer private dim xqueue[] as integer private dim yqueue[] as integer private dim ywrap[4] as integer private dim ypointscaler as float private dim charty0 as integer private dim numdatapoints as integer func numdatapoints(newval as integer) if newval > 0 then numdatapoints := newval else numdatapoints := 1 endif endfunc private dim startuphasrun as boolean func StartUp() handles MSG_INIT #if _TOOL dim i as integer dim point as integer dim h1 as integer dim h2 as float dim hash as string dim shift as float #endif if pointseparation <= 0 then pointseparation := 1 #if _tool tool_persist(pointseparation) #endif endif precalc() ypointscaler := (height-3.0)/(highlimit-lowlimit) 'For foundry, initialize the points to look like a sin curve #if _TOOL hash = str(me) shift = ((hash[len(hash) - 1]+3) mod 4) * PI / 2 point = numdatapoints - 1 h1 = height - 3 h2 = h1/2 if point <> 0 then for i = 0 to point yqueue[i] = ypos + ((h1) * sin((2*PI*i)/point+shift)/2) + h2 + 1 next endif #endif ' resize(me, width, height) 'included in precalc() relocate(me, xpos, ypos) attach(me, parent) enable(me, enabled) startuphasrun := true DoBuddyAttach() PollInterval(pollInterval) GMC_VerifyCommObj(commObject) InputType(inputType) endfunc fixed func Draw() handles MSG_DRAW dim i,j as integer setbgcolor(bgcolor) settransparent(bgcolor) usetransparent(transparent) drawbox(xpos, ypos, xpos1, ypos1) setfgcolor(fgcolor) if connectpoints == true then if qindex > 0 then 'check to see if qindex-1 is legal address ywrap[0] = yqueue[qindex-1] else 'if not, we want to point to the end of the array ywrap[0] = yqueue[numdatapoints-1] endif ywrap[3] = yqueue[qindex] drawpolygon(xqueue, Right(yqueue, numdatapoints-1-(qindex-1)) + Left(yqueue, qindex) + ywrap, POLY_NORMAL) else 'connectpoints == false for i=qindex to numdatapoints-1 setpixel(xqueue[j], yqueue[i]) j=j+1 next for i=0 to qindex-1 setpixel(xqueue[j], yqueue[i]) j=j+1 next endif setfgcolor(bordercolor) usetransparent(true) drawbox(xpos, ypos, xpos1, ypos1) endfunc #undoc func precalc fixed func precalc() dim i, accum, num as integer numdatapoints = (width-3)/pointseparation + 1 width := (numdatapoints-1)*pointseparation + 3 resize(me, width, height) num := numdatapoints-1 charty0 := ypos + height-2 ypointscaler := (height-3.0)/(highlimit-lowlimit) ywrap[1] := ypos + height ywrap[2] := ypos + height xpos1 := xpos + width-1 ypos1 := ypos + height-1 redim(xqueue,numdatapoints+4) accum := xpos + 1 for i=0 to numdatapoints xqueue[i] := accum accum := accum + pointseparation next xqueue[numdatapoints] := xpos + width xqueue[numdatapoints+1] := xpos + width xqueue[numdatapoints+2] := xpos - 1 xqueue[numdatapoints+3] := xpos - 1 redim(yqueue,numdatapoints) for i=0 to num yqueue[i] := charty0 next endfunc 'Communication Stuff----------------------------------------------------------------------------------------------------- private func Timetick () handles MSG_TIMETICK commObject.SendAsciiCommandStreamCounted(command, me, 0, 1) return endfunc private func Zenabled (status as boolean) handles MSG_ZENABLED dim i as integer if status and enabled then i = len(yqueue) #if _TOOL startup() #else precalc() #endif Rerender(me) TimeTick() endif endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess dim tmpValue as float check error val(tmpValue, trim(commObject.curResponse)) ResponseReceived(tmpValue) NewDataPoint(tmpValue) Rerender(me) on error tmpValue := lowLimit GMC_ClearException() FailureReceived(trim(commObject.curResponse), GMC_FailUnexpectedData) NewDataPoint(lowLimit) enderr return true endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure FailureReceived(trim(commObject.curResponse), commObject.curFailureReason) NewDataPoint(lowLimit) return true endfunc #doc override ResponseReceived #param response: This contains the number polled from the controller. You may modify this value if you wish and the results will be displayed on the graph. ~This event called whenever this object receives receives a response from the controller as a ~result of a poll. The paramater response contains the value that was returned from ~the controller. You may modify response in order to change the final value which ~will be displayed in this object. func ResponseReceived (response as reference to float) return endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications, GMC_FailBadCommand or GMC_FailUnexpectedData ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as string, failReason as GMC_FailureReason) return endfunc #undoc func newDataPoint private func newdatapoint(newval as float) dim toint as integer if newval < lowlimit then newVal := lowlimit elseif newval > highlimit then newVal:= highlimit endif toint := charty0 - (newVal-lowlimit)*ypointscaler yqueue[qindex] = toint qindex := (qindex + 1) mod numdatapoints rerender(me) endfunc 'Scale Stuff------------------------------------------------------------------------------------------------------------ private func ScaleResize(newLeng as integer) returns boolean handles AutoScale_ResizeRequest if (GMC_BuddyRequest == scaleObj) then newLeng = newLeng + 2 if newLeng <> height then height = newLeng #if _tool tool_persist(height) #endif endif endif return true endfunc private func BuddyReinit(parm as integer) returns boolean handles AutoScale_BuddyReinit if (scaleObj == GMC_BuddyRequest) and initialAttachRequest then DoBuddyAttach() return true endif return false endfunc private dim initialAttachRequest as boolean private func DoBuddyAttach() if scaleObj <> empty then initialAttachRequest := true scaleObj.AttachTo (xPos, yPos+1, xPos+width-1, yPos+height-2, highLimit, -> lowLimit, false, me, parent, enabled) endif endfunc #if _TOOL fixed func ToolGetHandles(xcoords[] as reference to integer, ycoords[] as reference to integer, -> cursors[] as reference to GuiCursors, closed as reference to boolean) handles MSG_TOOL_GETHANDLES dim xhandle[8] as integer dim yhandle[8] as integer dim cursortype[8] as guicursors init cursortype := [csr_upleft, csr_updown, csr_upright, csr_leftright, -> csr_downright, csr_updown, csr_downleft, csr_leftright] xhandle[0] = xpos yhandle[0] = ypos xhandle[1] = xpos + (width-1)/2 yhandle[1] = ypos xhandle[2] = xpos + width-1 yhandle[2] = ypos xhandle[3] = xpos + width-1 yhandle[3] = ypos + (height-1)/2 xhandle[4] = xpos + width-1 yhandle[4] = ypos + height-1 xhandle[5] = xpos + (width-1)/2 yhandle[5] = ypos + height-1 xhandle[6] = xpos yhandle[6] = ypos + height-1 xhandle[7] = xpos yhandle[7] = ypos + (height-1)/2 xcoords = xhandle ycoords = yhandle cursors = cursortype closed := true endfunc fixed func ToolMoveHandle(handle as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE dim numpoints as integer if dx > 0 then numpoints := dx/pointseparation+1 else numpoints := dx/pointseparation-1 endif if handle == 0 then if width - numpoints*pointseparation > 0 then width := width - numpoints*pointseparation xpos := xpos + numpoints*pointseparation endif if height - dy > 0 then height := height - dy ypos := ypos + dy endif elseif handle == 1 then if height - dy > 0 then height := height - dy ypos := ypos + dy endif elseif handle == 2 then if width + numpoints*pointseparation > 0 then width := width + numpoints*pointseparation endif if height - dy > 0 then height := height - dy ypos := ypos + dy endif elseif handle == 3 then if width + numpoints*pointseparation > 0 then width := width + numpoints*pointseparation endif elseif handle == 4 then if width + numpoints*pointseparation > 0 then width := width + numpoints*pointseparation endif if height + dy > 0 then height := height + dy endif elseif handle == 5 then if height + dy > 0 then height := height + dy endif elseif handle == 6 then if width - numpoints*pointseparation > 0 then width := width - numpoints*pointseparation xpos := xpos + numpoints*pointseparation endif if height + dy > 0 then height := height + dy endif elseif handle == 7 then if width - numpoints*pointseparation > 0 then width := width - numpoints*pointseparation xpos := xpos + numpoints*pointseparation endif endif tool_persist(xpos) tool_persist(ypos) tool_persist(width) tool_persist(height) startup() endfunc fixed func ToolMove(dx as integer, dy as integer) handles MSG_TOOL_MOVE xpos = xpos + dx ypos = ypos + dy tool_persist(xpos) tool_persist(ypos) DoBuddyAttach() endfunc fixed func ToolAttach(AttachTo as objref) handles MSG_TOOL_ATTACH attach(me, AttachTo) endfunc fixed func ToolAttached(newparent as objref) handles MSG_TOOL_ATTACHED parent = newparent tool_persist(parent) DoBuddyAttach() endfunc fixed func ToolDragCreate (parentobj as objref, x0 as integer, y0 as integer, -> x1 as integer, y1 as integer) handles MSG_TOOL_DRAGCREATE if (x1 < x0) then xpos := x1 width := x0 - x1 else xpos := x0 width := x1 - x0 endif if (y1 < y0) then ypos := y1 height := y0 - y1 else ypos := y0 height := y1 - y0 endif parent := parentobj tool_persist(parent) tool_persist (xpos) tool_persist (ypos) tool_persist (width) tool_persist (height) startup() endfunc #endif Enddef #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œ‹š‘›œ—ž‹ dtd˜ž“–“ ’œ Œœ ˜’œ‹š‘›œ—ž‹ dKK K@K} ˜’œ‹š‘›œ—ž‹ d@dC<ÏÏÏÏȹ¹ºÈιºÉº¹ºÊ¹ÈºÊ¹ÈºÌ¹œºÍŸŸŸÈ¹œºÈ¹»ºÈ¹»ºÈ¹ºŒÈ¹¹Íȹ¹ºÏÏÏÏ d d d d d d d d d d d d dÀd}˜ž“–“ ’œÐd}˜ž“–“œ’’Š‘–œž‹–‘Œ dÀd}˜ž“–“ ’œÐd} ˜’œžŠ‹Œœž“š d d dÀD}š‘ž“š›ÐD°> dðD}š‘ž“š›1 d€W}š‘ž“š›€}‘šˆ‰ž“ÐD°> d}š‘ž“š€à^À}‘šˆ‰ž“ d}š‘ž“š›}‘šˆ‰ž“ d}…š‘ž“š›€}š‘ž“𛐠d^}Œœž“š•à}š’‹†^ d}Œœž“š•à}š‘ž“š›Ð}š‘ž“š› d@^ dÐW d dÀD}žš‘‹ÐDà> d €W } žš‘‹€ } ‘šˆ‰ž“ÐD à>  d!}!ž‹‹žœ—€!à^!À!}!‘šˆ‰ž“! d"}"žš‘‹"}"‘šˆ‰ž“ d#ÐW# d$ d%ÀD%}%‡ŒÐD%€>% d&ðD&}&‡Œ&& d'€W'}'‡Œ€'}'‘šˆ‰ž“ÐD'€>'' d(ÀD(}(–À(}(‡™™Œš‹À(}( žž†Œ–…šÐD(€>( d)})‡™™Œš‹)})‘šˆ‰ž“Ð)})‡Œ d*}* žž†Œ–…š*}* ‘Š’›ž‹ž–‘‹Œ°** d+}+‡Œ+}+‘šˆ‰ž“ d, d-^-}- Œ‹ž‹Š—žŒŠ‘^- d.P^.}.–Ð.. W.}. žž†Œ–…š d/}/‡ŽŠšŠš°/}/–Ð//}/‡ŽŠšŠš°/}/–Ð/°/}/‡™™Œš‹ d0`^0 d1@^1 d2 d3}3‡ŒÎ3}3‡Œ°3}3ˆ–›‹—Ð33 d4}4š“œž‹š€4à^4À4}4‡ŒÀ4}4†Œ4 d5}5 ›Š››†ž‹‹žœ—€55 d6ÐW6 d7 d8ÀD8}8†ŒÐD8€>8 d9ðD9}9†Œ99 d:€W:}:†Œ€:}:‘šˆ‰ž“ÐD:€>:: d;ÀD;};–À;};†™™Œš‹À;}; žž†Œ–…šÐD;€>; d<}<†™™Œš‹<}<‘šˆ‰ž“Ð<}<†Œ d=}= žž†Œ–…š=}= ‘Š’›ž‹ž–‘‹ŒÐ== d>}>†Œ>}>‘šˆ‰ž“ d? d@P^@}@–Ð@@ W@}@ žž†Œ–…š dA}A†ŽŠšŠš°A}A–ÐAA}A†ŽŠšŠš°A}A–ÐA°A}A†™™Œš‹ dB`^B dC dD}Dœ—ž‹†ÏD}D†Œ°D}D—š–˜—‹ÐDD dE}E†ˆž°EEÐEE}E†Œ°E}E—š–˜—‹ dF}F†ˆž°FFÐFF}F†Œ°F}F—š–˜—‹ dG dH}H†ŒÎH}H†Œ°H}H—š–˜—‹ÐHH dI}Iš“œž‹š€Ià^IÀI}I‡ŒÀI}I†ŒI dJ}J ›Š››†ž‹‹žœ—€JJ dKÐWK dL dMÀDM}Mˆ–›‹—ÐDM€>M dNðDN}Nˆ–›‹—NNÈ dO€WO}Oˆ–›‹—€O}O‘šˆ‰ž“ÐDO€>OO dP^P}P‘šˆ‰ž“àPP^P dQ}Qˆ–›‹—Q}Q‘šˆ‰ž“ dR}Ršœž“œ€RR dS@^S dTÐWT dU dVÀDV}V—š–˜—‹ÐDV€>V dWðDW}W—š–˜—‹WWg dX€WX}X—š–˜—‹€X}X‘šˆ‰ž“ÐDX€>XX dY^Y}Y‘šˆ‰ž“àYY^Y dZ}Z—š–˜—‹Z}Z‘šˆ‰ž“ d[}[šœž“œ€[[ d\@^\ d]}] ›Š››†ž‹‹žœ—€]] d^ÐW^ d_ d`ÀD`}`™˜œ“ÐD`ð>` daðDa}a™˜œ“a}a ˜ ˆ—–‹š db€Wb}b™˜œ“€b}b‘šˆ‰ž“ÐDbð>bb dc}c™˜œ“c}c‘šˆ‰ž“ dd}dšš‘›š€dà^dd deÐWe df dgÀDg}g˜œ“ÐDgð>g dhðDh}h˜œ“h}h ˜ “žœ” di€Wi}i˜œ“€i}i‘šˆ‰ž“ÐDið>ii dj}j˜œ“j}j‘šˆ‰ž“ dk}kšš‘›š€kà^kk dlÐWl dm dnÀDn}n ›šœ“ÐDnð>n doðDo}o ›šœ“o}o ˜ ˆ—–‹š dp€Wp}p ›šœ“€p}p‘šˆ‰ž“ÐDpð>pp dq}q ›šœ“q}q‘šˆ‰ž“ dr}ršš‘›š€rà^rr dsÐWs dt duÀDu}u ‹ž‘Œžš‘‹ÐDu°>u dv€Wv}v ‹ž‘Œžš‘‹€v}v‘šˆ‰ž“ÐDv°>vv dw}w ‹ž‘Œžš‘‹w}w‘šˆ‰ž“ dx}xšš‘›š€xà^xx dyÐWy dz d{ d| d} d~ÀD~}~ œ‘‘šœ‹–‘‹ŒÐD~°>~ dðD} œ‘‘šœ‹–‘‹Œ1 d€€W€}€ œ‘‘šœ‹–‘‹Œ€€}€‘šˆ‰ž“ÐD€°>€€ d} œ‘‘šœ‹–‘‹Œ}‘šˆ‰ž“ d‚}‚šš‘›š€‚à^‚‚ dƒÐWƒ d„ d…`K…ÀD…}…Ž–‘›š‡ÐD…€>… d† d‡ dˆ d‰ dŠÀDŠ}Š–‘‹Œšžž‹–‘ÐDŠ€>Š d‹ðD‹}‹–‘‹Œšžž‹–‘‹‹ dŒ€WŒ}Œ–‘‹Œšžž‹–‘€Œ}Œ‘šˆ‰ž“ÐDŒ€>ŒŒ d^}‘šˆ‰ž“à^ dŽ}Ž–‘‹Œšžž‹–‘Ž}Ž‘šˆ‰ž“ d0^ d}–‘‹Œšžž‹–‘ d‘@^‘ d’}’šš‘›š€’à^’’ d“ÐW“ d” d• d– d— d˜ d™ dšÀDš}š —–˜—“–’–‹ÐDš>š d›ðD›}› —–˜—“–’–‹››d dœ€Wœ}œ —–˜—“–’–‹€œ}œ‘šˆ‰ž“ÐDœ>œœ d} —–˜—“–’–‹}‘šˆ‰ž“ dž}žšœž“œ€žž dŸ}Ÿšš‘›š€Ÿà^ŸŸ d ÐW  d¡ d¢ d£ d€ d¥ dŠ d§ÀD§}§“ˆ“–’–‹ÐD§>§ dšðDš}š“ˆ“–’–‹šš d©€W©}©“ˆ“–’–‹€©}©‘šˆ‰ž“ÐD©>©© dª}ª“ˆ“–’–‹ª}ª‘šˆ‰ž“ d«}«šœž“œ€«« d¬}¬šš‘›š€¬à^¬¬ d­ÐW­ d® d¯ d° d± d² d³ dŽ dµ d¶ÀD¶}¶ œ’’•šœ‹ÐD¶à>¶}¶˜ž“–“œ’’Š‘–œž‹–‘ d·ðD·}· œ’’•šœ‹·}·š’‹† dž d¹ dº d» dŒ dœ dŸÀDŸ}Ÿ –‘Š‹‹†šÐDŸ}Ÿ ˜’œ ›ž‹ž‹†š d¿ðD¿}¿ –‘Š‹‹†š¿}¿ ˜’œ Œ–‹–‘ dÀ€WÀ}À –‘Š‹‹†š€À}À‘šˆ‰ž“ÐDÀ}À ˜’œ ›ž‹ž‹†šÀ dÁ}Á –‘Š‹‹†šÁ}Á‘šˆ‰ž“ dÂ}œ’’ž‘›Â}˜’œ›ž‹ž‹†š‹œ’’ž‘›€Â} –‘Š‹‹†šÀÂ} –‘Š‹ŒŠœšÀÂ}ŠŒšœŠŒ‹’œ’’ž‘›ÀÂ} œŠŒ‹’œ’’ž‘› dÃÐWà dÄ dÅ dÆ dÇ dÈÀDÈ}È –‘Š‹ŒŠœšÐDÈ}Ș’œ ž‡–Œ dÉðDÉ}É –‘Š‹ŒŠœšÉ}É ˜’œ ž‡–Œ ‡ dʀWÊ}Ê –‘Š‹ŒŠœš€Ê}Ê‘šˆ‰ž“ÐDÊ}ʘ’œ ž‡–ŒÊ dË}Ë –‘Š‹ŒŠœšË}Ë‘šˆ‰ž“ dÌ}Ìœ’’ž‘›Ì}̘’œ›ž‹ž‹†š‹œ’’ž‘›€Ì}Ì –‘Š‹‹†šÀÌ}Ì –‘Š‹ŒŠœšÀÌ}ÌŠŒšœŠŒ‹’œ’’ž‘›ÀÌ}Ì œŠŒ‹’œ’’ž‘›Ì dÍÐWÍ dÎ`KÎÀDÎ}̐’’ž‘›ÐDÎÀ>Î dÏ dÐ dÑ dÒ dÓ dÔ dÕ dÖÀDÖ}ÖŠŒšœŠŒ‹’œ’’ž‘›ÐDÖ°>Ö d×ðD×}׊ŒšœŠŒ‹’œ’’ž‘›×A× d؀WØ}ØŠŒšœŠŒ‹’œ’’ž‘›€Ø}Ø‘šˆ‰ž“ÐDذ>ؐØ dÙ}ÙŠŒšœŠŒ‹’œ’’ž‘›Ù}Ù‘šˆ‰ž“ dÚ}Úœ’’ž‘›Ú}Ú˜’œ›ž‹ž‹†š‹œ’’ž‘›€Ú}Ú –‘Š‹‹†šÀÚ}Ú –‘Š‹ŒŠœšÀÚ}ÚŠŒšœŠŒ‹’œ’’ž‘›ÀÚ}Ú œŠŒ‹’œ’’ž‘›Ú dÛÐWÛ dÜ dÝ dÞ dß dà dá dâ dãÀDã}㠜ŠŒ‹’œ’’ž‘›ÐDãÀ>ã däðDä}ä œŠŒ‹’œ’’ž‘›äCä då€Wå}å œŠŒ‹’œ’’ž‘›€å}呚ˆ‰ž“ÐDåÀ>åå dæ}æ œŠŒ‹’œ’’ž‘›æ}摚ˆ‰ž“ dç}眐’’ž‘›ç}瘒œ›ž‹ž‹†š‹œ’’ž‘›€ç}ç –‘Š‹‹†šÀç}ç –‘Š‹ŒŠœšÀç}çŠŒšœŠŒ‹’œ’’ž‘›Àç}ç œŠŒ‹’œ’’ž‘›ç dèÐWè dé dê dë dì dí dî dï dð dñ dò dóÀDó}ó ““–‘‹š‰ž“ÐDó€>ó dôðDô}ô ““–‘‹š‰ž“ôôè dõ€Wõ}õ ““–‘‹š‰ž“€õ}õ‘šˆ‰ž“ÐDõ€>õõ dö^ö}ö‘šˆ‰ž“öö^ö d÷}÷ ““–‘‹š‰ž“÷÷ dø}øŠ‘š˜–Œ‹š’Œ˜—ž‘›“š€øà^øÀø}ø ’Œ˜ ‹–’š‹–œ”Àøøø dù0^ù dú}ú ““–‘‹š‰ž“ú}ú‘šˆ‰ž“ dû}ûš˜–Œ‹š’Œ˜—ž‘›“š€ûà^ûÀû}û ’Œ˜ ‹–’š‹–œ”Àû}û‘šˆ‰ž“ðûûû dü@^ü dýÐWý dþ dÿ d d d d dÀD}Œœž“š•ÐDà>} ˜’œžŠ‹Œœž“š dðD}Œœž“š•}š’‹† d€W}Œœž“š•€}‘šˆ‰ž“ÐD} ˜’œžŠ‹Œœž“š d^}Œœž“š•à}š’‹†^ d}Œœž“š•à}š‘ž“š›ÐA d @^  d  d } Œœž“š• } ‘šˆ‰ž“ d }  ›Š››†ž‹‹žœ—€   d ÐW  d d d d d d`KÀD}‡ŒÎÐD€> d`KÀD}†ŒÎÐD€> d d`KÀD}‡ŽŠšŠš°ÐÐD€> d`KÀD}†ŽŠšŠš°ÐÐD€> d`KÀD}†ˆž°ÐÐD€> d d`KÀD} †–‘‹Œœž“šÐD> d`KÀD}œ—ž‹†ÏÐD€> d d`KÀD} ‘Š’›ž‹ž–‘‹ŒÐD€> d€W} ‘Š’›ž‹ž–‘‹Œ€}‘šˆ‰ž“ÐD€> d^}‘šˆ‰ž“à^ d }  ‘Š’›ž‹ž–‘‹Œ } ‘šˆ‰ž“ d!0^! d"}" ‘Š’›ž‹ž–‘‹Œ"" d#@^# d$ÐW$ d% d&`K&ÀD&}& Œ‹ž‹Š—žŒŠ‘ÐD&°>& d' d(€W(}(Œ‹ž‹Š€(( d)ÀW)})’Œ˜ –‘–‹ d* d+„d+ ‹“ d,ÀD,},–ÐD,€>, d-ÀD-}-–‘‹ÐD-€>- d.ÀD.}.—ÎÐD.€>. d/ÀD/}/—ÍÐD/>/ d0ÀD0}0—žŒ—ÐD0À>0 d1ÀD1}1Œ—–™‹ÐD1>1 d2 d2 d3^3}3–‘‹Œšžž‹–‘33^3 d4}4–‘‹Œšžž‹–‘44 d5„d5 ‹“}5 ‹“ šŒ–Œ‹€5}5–‘‹Œšžž‹–‘5 d5 d6@^6 d7 d8}8šœž“œ€88 d9}9 †–‘‹Œœž“š9€9}9—š–˜—‹Ð99@@9ð9€9}9 —–˜—“–’–‹Ð9}9“ˆ“–’–‹9 d: d; d<„d< ‹“ d=}=—žŒ—Ð=}=Œ‹€=à^== d>}>Œ—–™‹Ð>€>€>}>—žŒ—°>}>“š‘€>}>—žŒ—>Ð>>Ð>°>>>À>>> >}>–ð>> d?}?–‘‹Ð?}? ‘Š’›ž‹ž–‘‹ŒÐ?? d@ dA}A—ÎÐA}A—š–˜—‹ÐAA dB}B—ÍÐB}B—ÎðBB dC dD^D}D–‘‹àDD^D dEP^E}E–ÐEE WE}E–‘‹ dF}F†ŽŠšŠš°F}F–ÐFÐF}F†Œ°F€F€F}F—ΐF F}FŒ–‘€F€FF F}F– F}F–FðF}F–‘‹°F}FŒ—–™‹FðFFF°F}F—ͰFF dG`^G dH@^H dI dI dJ dK dL}Lš“œž‹š€Là^LÀL}L‡ŒÀL}L†ŒL dM}Mž‹‹žœ—€Mà^MÀM}Mžš‘‹M dN}Nš‘ž“š€Nà^NÀN}Nš‘ž“š›N dO}O Œ‹ž‹Š—žŒŠ‘O1O dP}P ›Š››†ž‹‹žœ—€PP dQ dR}R ““–‘‹š‰ž“€R}R ““–‘‹š‰ž“R dS}S˜’œ ‰š–™†œ’’•€S}S œ’’•šœ‹S dT}T –‘Š‹‹†š€T}T –‘Š‹‹†šT dUÐWU dV dW€KW€WW}W›žˆ€WW dXÀWX}X’Œ˜ ›žˆ dYÀDY}Y–ÀY}Y•ÐDY€>Y dZ d[}[ Œš‹˜œ“€[}[˜œ“[ d\}\Œš‹‹ž‘Œžš‘‹€\}\˜œ“\ d]}]ŠŒš‹ž‘Œžš‘‹€]}] ‹ž‘Œžš‘‹] d^}^›žˆ‡€^}^‡ŒÀ^}^†ŒÀ^}^‡ŒÎÀ^}^†ŒÎ^ d_ d`}` Œš‹™˜œ“€`}`™˜œ“` da db^b}b œ‘‘šœ‹–‘‹ŒÐb1b^b dc^c}cŽ–‘›š‡àcc^c dd}d†ˆž°ddÐdÐd}d†ŽŠšŠš°d}dŽ–‘›š‡ÐddÐd de0^e df}f†ˆž°ffÐfÐf}f†ŽŠšŠš°f}f ‘Š’›ž‹ž–‘‹ŒÐffÐf dg@^g dh}h†ˆž°hhÐhÐh}h†ŽŠšŠš°h}hŽ–‘›š‡Ðh di dj}j ›žˆ“†˜‘€j}j‡ŽŠšŠšÀj}j–˜—‹€j}j†ŽŠšŠšÀj}j ‘Š’›ž‹ž–‘‹ŒÐjjÐj€j}jŽ–‘›š‡Ðjjjj°j}j“𙋀j}j†ŽŠšŠšÀj}jŽ–‘›š‡j°j}j†ˆžÀj}j “† ‘’ž“j dk0^k dlP^l}l–Ðl}lŽ–‘›š‡ Wl}l ‘Š’›ž‹ž–‘‹ŒÐll dm}mŒš‹–‡š“€m}m‡ŽŠšŠš°m}m•ÐmÀm}m†ŽŠšŠš°m}m–Ðmm dn}n•Ðn}n•°nn do`^o dpP^p}p–Ðpp Wp}pŽ–‘›š‡Ðpp dq}qŒš‹–‡š“€q}q‡ŽŠšŠš°q}q•ÐqÀq}q†ŽŠšŠš°q}q–Ðqq dr}r•Ðr}r•°rr ds`^s dt@^t du dv}v Œš‹™˜œ“€v}v ›šœ“v dw}wŠŒš‹ž‘Œžš‘‹€w1ww dx}x›žˆ‡€x}x‡ŒÀx}x†ŒÀx}x‡ŒÎÀx}x†ŒÎx dyÐWy dz d{ d|€K|€W|}|šœž“œ€|| d}ÀD}}}–À}}}žœœŠ’À}}}‘Š’ÐD}€>} d~ d} ‘Š’›ž‹ž–‘‹ŒÐ€}ˆ–›‹—Аð}–‘‹Œšžž‹–‘° d€ d}ˆ–›‹—€} ‘Š’›ž‹ž–‘‹ŒÐ }–‘‹Œšžž‹–‘° d‚}‚šŒ–…š€‚à^‚À‚}‚ˆ–›‹—À‚}‚—š–˜—‹‚ dƒ d„}„‘Š’„}„ ‘Š’›ž‹ž–‘‹ŒÐ„„ d…}…œ—ž‹†Ï…}…†Œ°…}…—š–˜—‹Ð…… d†}† †–‘‹Œœž“š†€†}†—š–˜—‹Ð††@@†ð†€†}† —–˜—“–’–‹Ð†}†“ˆ“–’–‹† d‡ dˆ}ˆ†ˆž°ˆˆÐˆˆ}ˆ†Œ°ˆ}ˆ—š–˜—‹ d‰}‰†ˆž°‰‰Ð‰‰}‰†Œ°‰}‰—š–˜—‹ dŠ d‹}‹‡ŒÎ‹}‹‡Œ°‹}‹ˆ–›‹—Ћ‹ dŒ}Œ†ŒÎŒ}Œ†Œ°Œ}Œ—š–˜—‹ÐŒŒ d dŽ}Žš›–’€Ž}Ž‡ŽŠšŠšÀŽ}Ž ‘Š’›ž‹ž–‘‹Œ°ŽŽŽ d}žœœŠ’}‡Œ° dP^}–А W} ‘Š’›ž‹ž–‘‹Œ d‘}‘‡ŽŠšŠš°‘}‘–Б‘}‘žœœŠ’ d’}’žœœŠ’’}’žœœŠ’°’}’–‘‹Œšžž‹–‘ d“`^“ d”}”‡ŽŠšŠš°”}” ‘Š’›ž‹ž–‘‹ŒÐ””}”‡Œ°”}”ˆ–›‹— d•}•‡ŽŠšŠš°•}• ‘Š’›ž‹ž–‘‹Œ°••Е•}•‡Œ°•}•ˆ–›‹— d–}–‡ŽŠšŠš°–}– ‘Š’›ž‹ž–‘‹Œ°––Ж–}–‡ŒÐ–– d—}—‡ŽŠšŠš°—}— ‘Š’›ž‹ž–‘‹Œ°——З—}—‡ŒÐ—— d˜ d™}™š›–’€™}™†ŽŠšŠšÀ™}™ ‘Š’›ž‹ž–‘‹Œ™ dšP^š}š–Кš Wš}š‘Š’ d›}›†ŽŠšŠš°›}›–Л›}›œ—ž‹†Ï dœ`^œ dÐW dž dŸ d `K €W } ‹–’š‹–œ”€   d¡ÀW¡}¡ ’Œ˜ ‹–’š‹–œ” d¢ d£}£ œ’’•šœ‹à£}£Œš‘›žŒœ––œ’’ž‘›Œ‹šž’œŠ‘‹š›€£}£œ’’ž‘›À£à^£À££À£££ d€ð^€ d¥ÐW¥ dŠ d§`K§€W§}§…š‘ž“𛀧}§Œ‹ž‹ŠŒÐD§°>§§ dšÀWš}š ’Œ˜ …š‘ž“š› d© dªÀDª}ª–ÐDª€>ª d« d¬^¬}¬Œ‹ž‹ŠŒ`¬}¬š‘ž“š›^¬ d­}­–Э}­“š‘€­}­†ŽŠšŠš­ d®„d® ‹“ d¯}¯Œ‹ž‹Š€¯¯ d°d° d±}±šœž“œ€±± d² d² d³}³šš‘›š€³à^³³ dŽ}Ž‹–’š‹–œ”€ŽŽ dµ@^µ d¶ÐW¶ d· dž`Kž€Wž}žŒŠœœšŒŒ€ž}žž’ÐDž€>žž°Wž°>ž d¹ÀW¹}¹˜’œ œ’’ŒŠœœšŒŒ dº d»ÀD»}»‹’‰ž“ŠšÐD»>» dŒ dœ°^œ_œ dŸ}Ÿ‰ž“€Ÿ}Ÿ‹’‰ž“ŠšÀŸ}Ÿ‹–’€Ÿ}Ÿ œ’’•šœ‹àŸ}Ÿ œŠšŒ‘ŒšŸŸ d¿}¿šŒ‘Œššœš–‰š›€¿}¿‹’‰ž“Šš¿ dÀ}À ‘šˆ›ž‹ž–‘‹€À}À‹’‰ž“ŠšÀ dÁ}Ášš‘›š€Áà^ÁÁ dÂÀ^Â_ dÃ}Ë’‰ž“ŠšÃ}Ӑˆ“–’–‹ dÄ}Ę’œ œ“šžš‡œš‹–‘€ÄÄ dÅ dÆ}Æ™ž–“Šššœš–‰š›€Æ}Æ‹–’€Æ}Æ œ’’•šœ‹àÆ}Æ œŠšŒ‘ŒšÆÀÆ}Ƙ’œ ™ž–“Š‘š‡šœ‹š››ž‹žÆ dÇ}Ç ‘šˆ›ž‹ž–‘‹€Ç}Ç“ˆ“–’–‹Ç dÈÐ^È dÉ dÊð^Ê1Ê dËÐWË dÌ dÍ`KÍ€WÍ}Í™ž–“Šš€Í}͏ž’ÐDÍ€>͐ͰWͰ>Í dÎÀWÎ}Θ’œ œ’’™ž–“Šš dÏ dÐ}Йž–“Šššœš–‰š›€Ð}Ћ–’€Ð}Ð œ’’•šœ‹àÐ}Ð œŠšŒ‘ŒšÐÀÐ}Ð œ’’•šœ‹àÐ}ÐœŠ™ž–“ŠššžŒ‘Ð dÑ}Ñ ‘šˆ›ž‹ž–‘‹€Ñ}Ñ“ˆ“–’–‹Ñ dÒð^Ò1Ò dÓÐWÓ dÔ dÕ dÖ d× dØ dÙ dÚ dÛ€WÛ}ÛšŒ‘Œššœš–‰š›€Û}ÛšŒ‘ŒšÐDېWÛ Wې>ÛÛ dÜð^Ü dÝÐWÝ dÞ dß dà dá dâ dã dä€Wä}䙞–“Šššœš–‰š›€ä}䍚Œ‘ŒšÐDäÀ>äÀä}ä ™ž–“šžŒ‘ÐDä}䘒œ ™ž–“ŠššžŒ‘ä dåð^å dæÐWæ dç dè dé`Ké€Wé}é ‘šˆ›ž‹ž–‘‹€é}鑚ˆ‰ž“ÐDé>éé dêÀDê}ꋐ–‘‹ÐDê€>ê dë^ë}둚ˆ‰ž“Àë}듐ˆ“–’–‹^ë dì}쑚ˆ‰ž“ì}쓐ˆ“–’–‹ dí ^í}푚ˆ‰ž“àí}í —–˜—“–’–‹^í dî}ˆ‰ž“î}î —–˜—“–’–‹ dï@^ï dð}ð‹–‘‹ð}𜗞‹†ÏÐð€ð}𑚈‰ž“Ðð}𓐈“–’–‹ð ð}𠆏–‘‹Œœž“š dñ}ñ†ŽŠšŠš°ñ}ñŽ–‘›š‡ÐñÐñ}ñ‹–‘‹ dò}òŽ–‘›š‡ò€ò}òŽ–‘›š‡°òòòÀò}ò ‘Š’›ž‹ž–‘‹Œ dó}óšš‘›š€óà^óó dôÐWô dõ dö d÷ dø dù`Kù€Wù}ù Œœž“ššŒ–…š€ù}ù‘šˆ“š‘˜ÐDù€>ùù°Wù°>ù dúÀWú}úžŠ‹Œœž“š šŒ–…ššŽŠšŒ‹ dû dü^ü€ü}ü˜’œ Š››†šŽŠšŒ‹Ðü}üŒœž“š•ü^ü dý}ý‘šˆ“š‘˜Ðý}ý‘šˆ“š‘˜°ýý dþ^þ}þ‘šˆ“š‘˜àþ}þ—š–˜—‹^þ dÿ}ÿ—š–˜—‹Ðÿ}ÿ‘šˆ“š‘˜ d„d ‹“} ‹“ šŒ–Œ‹€}—š–˜—‹ d d@^ d@^ d dð^1 dÐW d d`K€W} Š››†š–‘–‹€}ž’ÐD€>°W°> dÀW}žŠ‹Œœž“š Š››†š–‘–‹ d  d ^ € } Œœž“š•Ð } ˜’œ Š››†šŽŠšŒ‹ ` } –‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹^  d }  ›Š››†ž‹‹žœ—€   d ð^ 1  d @^  dð^A dÐW d d`KÀD}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹ÐD°> d`K€W} ›Š››†ž‹‹žœ—€ d^}Œœž“š•à}š’‹†^ d}–‘–‹–ž“ž‹‹žœ—šŽŠšŒ‹1 d}Œœž“š•à}ž‹‹žœ—‹€}‡ŒÀ}†Œ°À}‡Œ°}ˆ–›‹—ÐÀ}†Œ°}—š–˜—‹ÐÀ} —–˜—“–’–‹À}“ˆ“–’–‹ÀAÀà^À}žš‘‹À}š‘ž“𛐠d@^ dÐW d d„d ‹“ d€K€W}‹“˜š‹—ž‘›“šŒ€}‡œ›Œ°ÐÐDW W€>À}†œ›Œ°ÐÐDW W€>À}œŠŒŒ°ÐÐDW W} ˜Š–œŠŒŒÀ}œ“Œš›ÐDW W°> dÀW}’Œ˜ ‹“ ˜š‹—ž‘›“šŒ d dÀD}‡—ž‘›“š°ÐÐD€> d ÀD } †—ž‘›“š°  Ð ÐD €>  d!ÀD!}! œŠŒ‹†š°!!Ð!ÐD!}! ˜Š–œŠŒŒ d" d#ðD#}# œŠŒ‹†š#°#}# œŒ Š“š™‹À#}# œŒ Š›ˆ‘À#}# œŒ Š–˜—‹À#}# œŒ “š™‹–˜—‹À#}$ œŒ ›ˆ‘–˜—‹À$}$ œŒ Š›ˆ‘À$}$ œŒ ›ˆ‘“š™‹À$}$ œŒ “š™‹–˜—‹Ð$ d%}%‡—ž‘›“š°%%Ð%Ð%}%‡Œ d&}&†—ž‘›“š°&&Ð&Ð&}&†Œ d' d(}(‡—ž‘›“š°((Ð(Ð(}(‡Œ°(€(}(ˆ–›‹—Ð(((ð(( d)})†—ž‘›“š°))Ð)Ð)})†Œ d* d+}+‡—ž‘›“š°++Ð+Ð+}+‡Œ°+}+ˆ–›‹—Ð++ d,},†—ž‘›“š°,,Ð,Ð,},†Œ d- d.}.‡—ž‘›“š°..Ð.Ð.}.‡Œ°.}.ˆ–›‹—Ð.. d/}/†—ž‘›“š°//Ð/Ð/}/†Œ°/€/}/—š–˜—‹Ð///ð// d0 d1}1‡—ž‘›“š°11Ð1Ð1}1‡Œ°1}1ˆ–›‹—Ð11 d2}2†—ž‘›“š°22Ð2Ð2}2†Œ°2}2—š–˜—‹Ð22 d3 d4}4‡—ž‘›“š°44Ð4Ð4}4‡Œ°4€4}4ˆ–›‹—Ð444ð44 d5}5†—ž‘›“š°55Ð5Ð5}5†Œ°5}5—š–˜—‹Ð55 d6 d7}7‡—ž‘›“š°77Ð7Ð7}7‡Œ d8}8†—ž‘›“š°88Ð8Ð8}8†Œ°8}8—š–˜—‹Ð88 d9 d:}:‡—ž‘›“š°::Ð:Ð:}:‡Œ d;};†—ž‘›“š°;;Ð;Ð;};†Œ°;€;};—š–˜—‹Ð;;;ð;; d< d=}=‡œ›ŒÐ=}=‡—ž‘›“š d>}>†œ›ŒÐ>}>†—ž‘›“š d?}?œŠŒŒÐ?}? œŠŒ‹†š d@}@œ“Œš›@1@ dAÐWA dB dC€KC€WC}C‹“’‰š—ž‘›“š€C}C—ž‘›“šÐDCWC WC€>CÀC}C›‡ÐDC€>CÀC}C›†ÐDC€>CC dDÀWD}D’Œ˜ ‹“ ’‰š—ž‘›“š dEÀDE}E ‘Š’–‘‹ŒÐDE€>E dF^F}F›‡àFF^F dG}G ‘Š’–‘‹ŒG}G›‡ðG}G–‘‹Œšžž‹–‘°GG dH0^H dI}I ‘Š’–‘‹ŒI}I›‡ðI}I–‘‹Œšžž‹–‘ÐII dJ@^J dK dL^L}L—ž‘›“šÐLL^L dM^M}Mˆ–›‹—ÐM}M ‘Š’–‘‹Œ M}M–‘‹Œšžž‹–‘àMM^M dN}Nˆ–›‹—N}Nˆ–›‹—ÐN}N ‘Š’–‘‹Œ N}N–‘‹Œšžž‹–‘ dO}O‡ŒO}O‡Œ°O}O ‘Š’–‘‹Œ O}O–‘‹Œšžž‹–‘ dP@^P dQ^Q}Q—š–˜—‹ÐQ}Q›†àQQ^Q dR}R—š–˜—‹R}R—š–˜—‹ÐR}R›† dS}S†ŒS}S†Œ°S}S›† dT@^T dU ^U}U—ž‘›“šÐUU^U dV^V}V—š–˜—‹ÐV}V›†àVV^V dW}W—š–˜—‹W}W—š–˜—‹ÐW}W›† dX}X†ŒX}X†Œ°X}X›† dY@^Y dZ ^Z}Z—ž‘›“šÐZZ^Z d[^[}[ˆ–›‹—°[}[ ‘Š’–‘‹Œ [}[–‘‹Œšžž‹–‘à[[^[ d\}\ˆ–›‹—\}\ˆ–›‹—°\}\ ‘Š’–‘‹Œ \}\–‘‹Œšžž‹–‘ d]@^] d^^^}^—š–˜—‹Ð^}^›†à^^^^ d_}_—š–˜—‹_}_—š–˜—‹Ð_}_›† d`}`†Œ`}`†Œ°`}`›† da@^a db ^b}b—ž‘›“šÐbb^b dc^c}cˆ–›‹—°c}c ‘Š’–‘‹Œ c}c–‘‹Œšžž‹–‘àcc^c dd}dˆ–›‹—d}dˆ–›‹—°d}d ‘Š’–‘‹Œ d}d–‘‹Œšžž‹–‘ de@^e df ^f}f—ž‘›“šÐff^f dg^g}gˆ–›‹—°g}g ‘Š’–‘‹Œ g}g–‘‹Œšžž‹–‘àgg^g dh}hˆ–›‹—h}hˆ–›‹—°h}h ‘Š’–‘‹Œ h}h–‘‹Œšžž‹–‘ di@^i dj^j}j—š–˜—‹°j}j›†àjj^j dk}k—š–˜—‹k}k—š–˜—‹°k}k›† dl@^l dm ^m}m—ž‘›“šÐmm^m dn^n}n—š–˜—‹°n}n›†ànn^n do}o—š–˜—‹o}o—š–˜—‹°o}o›† dp@^p dq ^q}q—ž‘›“šÐqq^q dr^r}rˆ–›‹—Ðr}r ‘Š’–‘‹Œ r}r–‘‹Œšžž‹–‘àrr^r ds}sˆ–›‹—s}sˆ–›‹—Ðs}s ‘Š’–‘‹Œ s}s–‘‹Œšžž‹–‘ dt}t‡Œt}t‡Œ°t}t ‘Š’–‘‹Œ t}t–‘‹Œšžž‹–‘ du@^u dv^v}v—š–˜—‹°v}v›†àvv^v dw}w—š–˜—‹w}w—š–˜—‹°w}w›† dx@^x dy ^y}y—ž‘›“šÐyy^y dz^z}zˆ–›‹—Ðz}z ‘Š’–‘‹Œ z}z–‘‹Œšžž‹–‘àzz^z d{}{ˆ–›‹—{}{ˆ–›‹—Ð{}{ ‘Š’–‘‹Œ {}{–‘‹Œšžž‹–‘ d|}|‡Œ|}|‡Œ°|}| ‘Š’–‘‹Œ |}|–‘‹Œšžž‹–‘ d}@^} d~@^~ d} ‹“ šŒ–Œ‹€}‡Œ d€}€ ‹“ šŒ–Œ‹€€}€†Œ€ d} ‹“ šŒ–Œ‹€}ˆ–›‹— d‚}‚ ‹“ šŒ–Œ‹€‚}‚—š–˜—‹‚ dƒ d„}„Œ‹ž‹Š€„„ d…ÐW… d† d‡€K‡€W‡}‡‹“’‰š€‡}‡›‡ÐD‡€>‡À‡}‡›†ÐD‡€>‡‡ dˆÀWˆ}ˆ ’Œ˜ ‹“ ’‰š d‰ dŠ}ЇŒÐŠ}ЇŒ°Š}Š›‡ d‹}‹†ŒÐ‹}‹†Œ°‹}‹›† dŒ d} ‹“ šŒ–Œ‹€}‡Œ dŽ}Ž ‹“ šŒ–Œ‹€Ž}ކŒŽ d} ›Š››†ž‹‹žœ—€ dÐW d‘ d’€K’€W’}’ ‹“ž‹‹žœ—€’}’ž‹‹žœ—‹ÐD’à>’’ d“ÀW“}“’Œ˜ ‹“ ž‹‹žœ— d”}”ž‹‹žœ—€”à^”À”}”ž‹‹žœ—‹” d•ÐW• d– d—€K—€W—}— ‹“ž‹‹žœ—𛀗}— ‘šˆžš‘‹ÐD—à>—— d˜ÀW˜}˜’Œ˜ ‹“ ž‹‹žœ—š› d™}™žš‘‹Ð™}™ ‘šˆžš‘‹ dš}𠋐“ šŒ–Œ‹€š}šžš‘‹š d›}› ›Š››†ž‹‹žœ—€›› dœÐWœ d dž€Kž€Wž}ž‹“›ž˜œšž‹š€ž}ž žš‘‹•ÐDžà>žÀž}ž‡ÏÐDž€>žÀž}ž†ÏÐDž€>žÀž}Ÿ‡ÎÐDŸ€>ŸÀŸ}Ÿ†ÎÐDŸ€>ŸŸ d ÀW } ’Œ˜ ‹“ ›ž˜œšž‹š d¡ d¢^¢€¢}¢‡ÎÀ¢}¢‡Ï¢^¢ d£}£‡Œ£}£‡Î d€}€ˆ–›‹—€}€‡ÏЀ}€‡Î d¥0^¥ dŠ}ЇŒŠ}Š‡Ï d§}§ˆ–›‹—§}§‡ÎЧ}§‡Ï dš@^š d© dª^ª€ª}ª†ÎÀª}ª†Ïª^ª d«}«†Œ«}«†Î d¬}¬—š–˜—‹¬}¬†ÏЬ}¬†Î d­0^­ d®}®†Œ®}®†Ï d¯}¯—š–˜—‹¯}¯†ÎЯ}¯†Ï d°@^° d±}±žš‘‹±}± žš‘‹• d² d³ dŽ}Ž ‹“ šŒ–Œ‹€Ž}Žžš‘‹Ž dµ}µ ‹“ šŒ–Œ‹€µ}µ‡Œµ d¶}¶ ‹“ šŒ–Œ‹€¶}¶†Œ¶ d·}· ‹“ šŒ–Œ‹€·}·ˆ–›‹—· dž}ž ‹“ šŒ–Œ‹€ž}ž—š–˜—‹ž d¹}¹Œ‹ž‹Š€¹¹ dºÐWº d» d» dŒPKŒ dœ dŸ d¿ dÀ dÁ d dà dÄ dÅ dÆ dÇ dÈ dÉ dÊ dË dÌ dÍ dÎ dÏ dРdÐ dÑ dÒ°dÒ Define Area Object type GMCTrendChart dim enabled as boolean func enabled(newval as boolean) endfunc dim parent as objref func parent(newval as objref) endfunc dim xpos as integer func xpos(newval as integer) endfunc dim ypos as integer func ypos(newval as integer) endfunc dim width as integer func width(newval as integer) endfunc dim height as integer func height(newval as integer) endfunc dim fgcolor as color func fgcolor(newval as color) endfunc dim bgcolor as color func bgcolor(newval as color) endfunc dim bordercolor as color func bordercolor(newval as color) endfunc dim transparent as boolean func transparent(newval as boolean) endfunc #doc prop connectPoints ~Set connectPoints to true to draw a line between all points on the trend chart. Set this ~property to false to show the points simply as dots. dim connectpoints as boolean func connectpoints(newval as boolean) endfunc #doc prop pointSeparation ~This property determines how far apart data points are displayed. Larger values of ~pointSeparation result in a trendChart that shows fewer data points at any given time. dim pointseparation as integer func pointseparation(newval as integer) endfunc #doc prop highLimit ~This property helps determine the scale of the trend chart. HighLimit represents the ~topmost location in the trend chart. Data points that are logged that have the value of ~highLimit or larger are displayed in the top line of the trendChart. Normally you should ~choose a highLimit that is as large or larger than the largest possible data point. dim highlimit as float func highlimit(newval as float) endfunc #doc prop lowLimit ~This property helps determine the scale of the trend chart. LowLimit represents the ~bottommost location in the trend chart. Data points that are logged that have the value of ~lowLimit or smaller are displayed in the bottom line of the trendChart. Normally you should ~choose a lowLimit that is as small or smaller than the smallest possible data point. dim lowlimit as float func lowlimit(newval as float) endfunc #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication #doc prop inputType ~InputType determines which property of the motion controller will be reflected in the ~gauge. Select an appropriate type from the drop down list. If you need to poll data ~that is not in the dropdown list, then set the customCommand property to query the ~information and useCustomCommand property to true. dim inputType as GMC_DataType func inputType(newVal as GMC_DataType) endfunc #doc prop inputSource ~If the inputType property queries information related to an axis on the controller (i.e. ~GMC_Position), then use the inputSource property to select which axis to query. dim inputSource as GMC_Axis func inputSource (newVal as GMC_Axis) endfunc #doc prop useCustomCommand ~Set this value to true if you will be using a custom command to poll the controller.

If this ~value is true, then this object will poll the controller using the information in the ~customCommand property rather than the values of the inputType and ~inputSource properties.

If this value is false, then the customCommand ~property is ingored and the inputType and inputSource properties are used instead. dim useCustomCommand as boolean func useCustomCommand (newVal as boolean) endfunc #doc prop customCommand ~Use this property to send a custom polling command to the controller. You should use this ~property only if you cannot obtain the information you need by using the inputType and ~inputSource properties. The controller should return a single numeric value in decimal ~format in response to the custom command that you define.

Note: The customCommand ~property is ignored unless the useCustomCommand property is set to true. dim customCommand as string func CustomCommand (newval as string) endfunc #doc prop pollInterval ~pollInterval defines, in milliseconds, then amount of time that will elapse between ~polls to the controller. The minimum supported value is 40 ms. It is recommended that you ~use the highest possible value for this property as excessive polling will reduce the ~responsiveness of the terminal. Also, you may want to limit the total number of polling ~objects that can be visible (enabled) at once in order to enhance performance.

~In order to maximize performance, if this object, or the screen on which it resides is ~disabled, then it will cease polling. Once the object (or parent screen) is re-enabled, ~it will immediately poll the controller once to refresh its value, then resume normal polling. dim pollInterval as integer func pollInterval (newVal as integer) endfunc #doc prop scaleObj ~If you want a scale displayed next to this object, create a GMCAutoScale object, set its ~properties, then set the scaleObj to reference the GMCAutoScale that you created. ~The scale will automatically be placed next to this object and sized appropriately. dim scaleObj as objref GMCAutoScale func scaleObj(newVal as GMCAutoScale) endfunc func numdatapoints(newval as integer) endfunc func StartUp() handles MSG_INIT endfunc fixed func Draw() handles MSG_DRAW endfunc #undoc func precalc fixed func precalc() endfunc handles MSG_TIMETICK endfunc handles MSG_ZENABLED endfunc handles GMC_CommSuccess endfunc handles GMC_CommFailure endfunc #doc override ResponseReceived #param response: This contains the number polled from the controller. You may modify this value if you wish and the results will be displayed on the graph. ~This event called whenever this object receives receives a response from the controller as a ~result of a poll. The paramater response contains the value that was returned from ~the controller. You may modify response in order to change the final value which ~will be displayed in this object. func ResponseReceived (response as reference to float) endfunc #doc override FailureReceived #param response:The response returned by the controller minus the final colon terminator. If you modify this paramater, the final display will reflect the results of the modifications #param failReason:The reason why this event is generated. Either GMC_FailCommunications, GMC_FailBadCommand or GMC_FailUnexpectedData ~This event is triggered when a command has been sent to the controller, but the controller ~failed to respond, responded incorrectly, or returned an error response. func FailureReceived(response as string, failReason as GMC_FailureReason) endfunc #undoc func newDataPoint endfunc handles AutoScale_ResizeRequest endfunc handles AutoScale_BuddyReinit endfunc endfunc fixed func ToolGetHandles(xcoords[] as reference to integer, ycoords[] as reference to integer, -> cursors[] as reference to GuiCursors, closed as reference to boolean) handles MSG_TOOL_GETHANDLES endfunc fixed func ToolMoveHandle(handle as reference to integer, dx as integer, dy as integer) handles MSG_TOOL_MOVEHANDLE endfunc fixed func ToolMove(dx as integer, dy as integer) handles MSG_TOOL_MOVE endfunc fixed func ToolAttach(AttachTo as objref) handles MSG_TOOL_ATTACH endfunc fixed func ToolAttached(newparent as objref) handles MSG_TOOL_ATTACHED endfunc fixed func ToolDragCreate (parentobj as objref, x0 as integer, y0 as integer, -> x1 as integer, y1 as integer) handles MSG_TOOL_DRAGCREATE endfunc Enddef #endfile #ifnot Galil_mc_src_GMCStringAlloc #option Galil_mc_src_GMCStringAlloc 'test #ifnot stringAllocDefined #option stringAllocDefined Define Object type stringAlloc #doc object stringAlloc ~This object is used to assocate an integer handle with a string. The integer handle ~can easily be stored in an array, unlike standard strings. Initially, you call ~Allocstring to allocate a string and get a handle to it. You can access the string ~by calling Getstring and passing in the handle returned by Allocstring. When you ~are done with the string, call Freestring. After calling Freestring, the handle is ~no longer valid. You must call Freestring when you are done with a string, to avoid ~exhausting the terminal's memory.

~The stringAlloc object was designed with speed in mind, and is significantly faster than ~calling the various string Array functions when manipulating large sets of strings. The ~major limitation it suffers versus the string Array functions is that stringAlloc is ~limited to 256 byte strings only. #doc func Allocstring #param data:The string to copy. This parameter is limited to arrays (strings) of length 256 or less ~Allocates the string given by the data parameter. This function returns a handle to the ~allocated string. The allocated string can be retreived by a call to Getstring. func Allocstring (data[] as byte) returns integer dim handle as integer dim tmpLen as integer tmpLen = len(freeHandlelist) if tmpLen== 0 then 'Are there free slots in the pool? If not create some while poolLookupTop >= poolLookupSize do poolLookupSize := poolLookupSize * 2 redim (poolLookup, poolLookupSize) loop 'Take the topmost slot in the pool handle = poolLookupTop poolLookupTop := poolLookupTop + 1 else handle = freeHandleList[tmpLen-1] redim (freeHandleList, tmpLen-1) endif #if _DEBUG if poolLookup[handle] <> 0 then throw (str(me), "Big time error") endif #endif Setstring (handle, data) return handle endfunc #doc func Freestring #param handle:A string handle that was previously allocated with Allocstring ~Frees a string that was previously allocated with Allocstring. This releases the ~handle and reclaims the memory that was occupied by the string for reuse. func Freestring (handle as reference to integer) dim tmpLen as integer if handle == 0 then return endif 'Release the handle and point the poolLookup to the empty string 'All this is OK if handle is 0 ReleaseHandle (handle) poolLookup[handle] = 0 'Add the handle to the free handle list tmpLen = len(freeHandleList) redim (freeHandleList, tmpLen+1) freeHandleList[tmpLen] = handle handle = 0 endfunc #doc func Getstring #param handle: A handle to a string that was previously allocated with Allocstring ~Retreives a string that was allocated with Allocstring. func Getstring (handle as integer) returns string return mid (pool, poolLookup[handle]+4, pool[poolLookup[handle]]) endfunc #if _MEMSTATS library standard source formatfunctions #undoc func GetStates func GetStats() returns string dim retVal as string retVal := "Pool Size: " + str(poolSize) + "\n" retVal := retVal + "Pool Top: " + str(poolTop) + "\n" retVal := retVal + "Wasted space: " + str(wasted) + "\n" retVal := retVal + "Free List: " + str(len(freehandlelist)) + " " + str(freehandlelist) + "\n" retVal := retVal +"Pool Lookup stats: size: " + str(poolLookupSize) + " top: " + str(poolLookupTop) + "\n" retVal := retVal + "Free16 pool: " +str(len(free16)) + " " + str(free16) + "\n" retVal := retVal + "Free64 pool: " +str(len(free64)) + " " + str(free64) + "\n" retVal := retVal + "Free256 pool: " +str(len(free256)) + " " + str(free256) + "\n" return retVal endfunc func PrintHandleInfo (handle as integer) _print ("Handle #" + str(handle) + " at " +str(poolLookup[handle]) + " leng: " + str(pool[poolLookup[handle]]) + " alloc: " + str(pool[poolLookup[handle]+1]) + " is: " + str(getstring(handle))) endfunc #endif '_MEMSTATS '-------------------------------------------------- private func ReleaseHandle (handle as integer) dim poolIdx as integer dim tmp as integer dim tmpLen as integer 'Free existing handle! -- this does not add the handle to the free handle list 'But it does reclaim the memory in the pool that was associated with the handle poolIdx = poolLookup[handle] if poolIdx > 2 then tmp = pool[poolIdx+1] #if _MEMSTATS if tmp == 0 then wasted := wasted - (256-pool[poolIdx]) else wasted = wasted - (tmp-pool[poolIdx]) endif #endif if tmp == 16 then tmpLen = len(free16) redim(free16, tmpLen+1) free16[tmpLen] = poolIdx elseif tmp == 64 then tmpLen = len(free64) redim(free64, tmplen+1) free64[tmpLen] = poolIdx else 'should be zero tmpLen = len(free256) redim (free256, tmpLen+1) free256[tmpLen] = poolIdx endif endif endfunc #doc func Setstring #param handle: A handle previously returned from Allocstring #param data: The new string to assign to the handle. ~Reassigns the string associated with a string handle. You should pass in a handle ~received from the Allocstring function. func Setstring (handle as integer, data[] as byte) dim leng as integer leng = len(data) ReleaseHandle (handle) if leng == 0 then poolLookup[handle] = 0 return elseif leng <= 16 then if len(free16) == 0 then poolLookup[handle] = GetMemory (16) else poolLookup[handle] = GetMemFromPool (free16, 16) endif #if _MEMSTATS wasted=wasted+(16-leng) #endif elseif leng <= 64 then if len(free64) == 0 then poolLookup[handle] = GetMemory (64) else poolLookup[handle] = GetMemFromPool (free64, 64) endif #if _MEMSTATS wasted=wasted+(64-leng) #endif elseif leng < 256 then label twofivesix if len(free256) == 0 then poolLookup[handle] = GetMemory (256) else poolLookup[handle] = GetMemFromPool (free256, 256) endif #if _MEMSTATS wasted=wasted+(256-leng) #endif else data = left(data,255) leng = 255 goto twofivesix endif pool[poolLookup[handle]] = leng SetArrayData (pool, poolLookup[handle]+4, data, 0, -1) endfunc private func startup() handles msg_init redim (freeHandleList, 64) redim (freeHandleList, 0) endfunc private dim pool[1024] as byte private dim poolSize as integer init poolSize := 1024 private dim PoolTop as integer init poolTop := 4 private dim poolLookup[64] as integer private dim poolLookupSize as integer init poolLookupSize := 64 private dim poolLookupTop as integer init poolLookupTop := 1 '(handle #0 will always be an empty string) private dim freeHandleList[] as integer private dim free16[] as integer private dim free64[] as integer private dim free256[] as integer #if _MEMSTATS private dim wasted as integer #endif #undoc func GetMemory private func GetMemory (alloc as integer) returns integer dim retVal as integer retVal = poolTop poolTop = poolTop + alloc + 4 while poolTop >= poolSize do poolSize = poolSize * 2 Redim (pool, poolSize) loop pool[retVal+1] = alloc return retVal endfunc private func GetMemFromPool(freeBlock[] as reference to integer, alloc as integer) returns integer dim leng as integer dim retVal as integer leng = len(freeBlock) - 1 retVal = freeBlock[leng] redim (freeBlock, leng) pool[retVal+1] = alloc return retVal endfunc Enddef #endif 'stringAllocDefined #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œŒ‹–‘˜ž““œ dtd˜ž“–“ ’œ Œœ ˜’œŒ‹–‘˜ž““œ d d d d dTeŒ‹–‘˜ž““œ›š™–‘š› dtdŒ‹–‘˜ž““œ›š™–‘š› d d K K @K } Œ‹–‘˜ž““œ d d d d d d d d d d d d d d d d d d€W} ž““œŒ‹–‘˜€}›ž‹ž°ÐÐD >°W€> dÀD}—ž‘›“šÐD€> dÀD}‹’“š‘ÐD€> d d}‹’“š‘Ð}“š‘€}™šš—ž‘›“š“–Œ‹ d ^ } ‹’“š‘Ð  ^ d! d"€^"}" ““”Š‹ð"}"““”ŠŒ–…š^" d#}#““”ŠŒ–…š#}#““”ŠŒ–…š ## d$}$š›–’€$}$ ““”ŠÀ$}$““”ŠŒ–…š$ d% ^% d& d'}'—ž‘›“šÐ'}' ““”Š‹ d(}( ““”Š‹(}( ““”Š‹°(( d)0^) d*}*—ž‘›“šÐ*}*™šš—ž‘›“š“–Œ‹°*}*‹’“š‘Ð**Ð* d+}+š›–’€+}+™šš—ž‘›“š“–Œ‹À+}+‹’“š‘Ð+++ d,@^, d- d.„d. ›šŠ˜ d/^/}/ ““”Š°/}/—ž‘›“šÐ/à//^/ d0}0‹—ˆ€0}0Œ‹€0à^00À0C0œ–˜ß‹–’šßš0 d1@^1 d2 d2 d3 d4}4 Œš‹Œ‹–‘˜€4}4—ž‘›“šÀ4}4›ž‹ž4 d5 d6ð^6}6—ž‘›“š d7ÐW7 d8 d9 d: d; d< d=€W=}= ™ššŒ‹–‘˜€=}=—ž‘›“šÐD=W= W=€>== d>ÀD>}>‹’“š‘ÐD>€>> d? d@^@}@—ž‘›“šÐ@@^@ dAð^A dB@^B dC dD dE dF}F š“šžŒš—ž‘›“š€F}F—ž‘›“šF dG}G ““”Š°G}G—ž‘›“šÐGÐGG dH dI dJ}J‹’“š‘ÐJ}J“š‘€J}J™šš—ž‘›“š“–Œ‹J dK}Kš›–’€K}K™šš—ž‘›“š“–Œ‹ÀK}K‹’“š‘°KKK dL}L™šš—ž‘›“š“–Œ‹°L}L‹’“š‘ÐLÐL}L—ž‘›“š dM}M—ž‘›“šÐMM dNÐWN dO dP dQ dR dS€WS}S ˜š‹Œ‹–‘˜€S}S—ž‘›“šÐDS€>SS°WSÀ>S dTð^T}T’–›€T}T“ÀT}T ““”Š°T}T—ž‘›“šÐT°TTÀT}T“°T}T ““”Š°T}T—ž‘›“šÐTÐTT dUÐWU dV dW„dW  ’š’Œ‹ž‹Œ dXÀdX}XŒ‹ž‘›ž›ÐdX}X™’ž‹™Š‘œ‹–‘Œ dY dZ€WZ}Z˜š‹Œ‹ž‹Œ€ZZ°WZÀ>Z d[ÀD[}[š‹‰ž“ÐD[À>[ d\ d]}]š‹‰ž“]C] ¯“߬–…šÅß°]}]Œ‹€]}]“Œ–…š]°]C]õ d^}^š‹‰ž“^}^š‹‰ž“°^C^ ¯“ß«Åß°^}^Œ‹€^}^“‹^°^C^õ d_}_š‹‰ž“_}_š‹‰ž“°_C_šžŒ‹š›ßŒžœšÅß°_}_Œ‹€_}_ˆžŒ‹š›_°_C_õ d`}`š‹‰ž“`}`š‹‰ž“°`C` ¹ššß³–Œ‹Åß°`}`Œ‹€`}`“š‘€`}`™šš—ž‘›“š“–Œ‹``°`C`ßß°`}`Œ‹€`}`™šš—ž‘›“š“–Œ‹`°`C`õ da}aš‹‰ž“a}aš‹‰ž“°aCa¯“ß³”ŠßŒ‹ž‹ŒÅßßߌ–…šÅß°a}aŒ‹€a}a““”ŠŒ–…ša°aCaßߋÅß°a}aŒ‹€a}a ““”Š‹a°aCaõ db dc}cš‹‰ž“c}cš‹‰ž“°cCc ¹ššÎÉߏ“Åß°c}cŒ‹€c}c“š‘€c}c™ššÎɐcc°cCcßßß°c}cŒ‹€c}c™ššÎɐc°cCcõ dd}dš‹‰ž“d}dš‹‰ž“°dCd ¹ššÉËߏ“Åß°d}dŒ‹€d}d“š‘€d}d™ššÉːdd°dCdßßß°d}dŒ‹€d}d™ššÉːd°dCdõ de}eš‹‰ž“e}eš‹‰ž“°eCe¹ššÍÊÉߏ“Åß°e}eŒ‹€e}e“š‘€e}e™ššÍÊɐee°eCeßßß°e}eŒ‹€e}e™ššÍÊɐe°eCeõ df dgð^g}gš‹‰ž“ dhÐWh di dj€Wj}j–‘‹—ž‘›“š–‘™€j}j—ž‘›“šÐDj€>jj dk}k –‘‹€kCk·ž‘›“šßܰk}kŒ‹€k}k—ž‘›“šk°kCkߞ‹ß°k}kŒ‹€k}k ““”Š°k}k—ž‘›“šÐkk°kCkߓš‘˜Åß°k}kŒ‹€k}k“°k}k ““”Š°k}k—ž‘›“šÐkÐkk°kCkߞ““œÅß°k}kŒ‹€k}k“°k}k ““”Š°k}k—ž‘›“šÐk°kkÐkk°kCkߖŒÅß°k}kŒ‹€k}k ˜š‹Œ‹–‘˜€k}k—ž‘›“škkk dlÐWl dm dm dn do dp`Kp€Wp}p š“šžŒš—ž‘›“š€p}p—ž‘›“šÐDp€>pp dqÀDq}q“–›‡ÐDq€>q drÀDr}r‹’ÐDr€>r dsÀDs}s‹’“š‘ÐDs€>s dt du dv dw}w“–›‡Ðw}w ““”Š°w}w—ž‘›“šÐw dx^x}x“–›‡àxx^x dy}y‹’Ðy}y“°y}y“–›‡°yyÐy dz d{„d{  ’š’Œ‹ž‹Œ d|^|}|‹’Ð||^| d}}}ˆžŒ‹š›}}}ˆžŒ‹š›Ð}€}}Ð}}}“°}}}“–›‡Ð}} d~0^~ d}ˆžŒ‹š›Ð}ˆžŒ‹š›Ð€}‹’Ð}“°}“–›‡Ð d€@^€ d d d‚^‚}‚‹’Ð‚‚^‚ dƒ}ƒ‹’“š‘Ѓ}ƒ“š‘€ƒ}ƒ™ššÎɐƒ d„}„š›–’€„}„™ššÎÉÀ„}„‹’“š‘°„„„ d…}…™ššÎɰ…}…‹’“š‘Ð…Ð…}…“–›‡ d† ^†}†‹’Ð††@^† d‡}‡‹’“š‘Ї}‡“𑀇}‡™ššÉː‡ dˆ}ˆš›–’€ˆ}ˆ™ššÉËÀˆ}ˆ‹’“š‘°ˆˆˆ d‰}‰™ššÉ˰‰}‰‹’“š‘ЉЉ}‰“–›‡ dŠ0^Š d‹}‹‹’“š‘Ћ}‹“𑀋}‹™ššÍÊɐ‹ dŒ}Œš›–’€Œ}Œ™ššÍÊÉÀŒ}Œ‹’“š‘°ŒŒŒ d}™ššÍÊɰ}‹’“š‘ЍЍ}“–›‡ dŽ@^Ž d@^ dÐW d‘ d’ d“ d” d• d– d—€W—}— Œš‹Œ‹–‘˜€—}——ž‘›“šÐD—€>—À—}—›ž‹ž°—ЗÐD— >—— d˜ÀD˜}˜“š‘˜ÐD˜€>˜ d™ dš}š“š‘˜Ðš}š“š‘€š}š›ž‹žš d› dœ}œ š“šžŒš—ž‘›“š€œ}œ—ž‘›“šœ d dž^ž}ž“š‘˜Ðžž^ž dŸ}Ÿ ““”Š°Ÿ}Ÿ—ž‘›“šÐŸÐŸŸ d ð^  d¡ ^¡}¡“š‘˜¡¡^¡ d¢^¢}¢“š‘€¢}¢™ššÎɐ¢Ð¢¢^¢ d£}£ ““”Š°£}£—ž‘›“šÐ£Ð£}£ ˜š‹’š’†€£££ d€0^€ d¥}¥ ““”Š°¥}¥—ž‘›“šÐ¥Ð¥}¥˜š‹’š’™’“€¥}¥™ššÎÉÀ¥¥¥ dŠ@^Š d§ dš„dš  ’š’Œ‹ž‹Œ}šˆžŒ‹š›Ðš}šˆžŒ‹š›°š€ššÐš}š“š‘˜š dš d© ^©}©“š‘˜©©@^© dª^ª}ª“š‘€ª}ª™ššÉːªÐªª^ª d«}« ““”Š°«}«—ž‘›“šÐ«Ð«}« ˜š‹’š’†€««@« d¬0^¬ d­}­ ““”Š°­}­—ž‘›“šÐ­Ð­}­˜š‹’š’™’“€­}­™ššÉËÀ­­@­ d®@^® d¯ d°„d°  ’š’Œ‹ž‹Œ}°ˆžŒ‹š›Ð°}°ˆžŒ‹š›°°€°°@а}°“š‘˜° d° d± ^±}±“š‘˜À±±^± d²à]²}² ‹ˆ™–‰šŒ–‡ d³ dŽ^Ž}Ž“š‘€Ž}Ž™ššÍÊɐŽÐŽŽ^Ž dµ}µ ““”Š°µ}µ—ž‘›“šÐµÐµ}µ ˜š‹’š’†€µµµ d¶0^¶ d·}· ““”Š°·}·—ž‘›“šÐ·Ð·}·˜š‹’š’™’“€·}·™ššÍÊÉÀ··· dž@^ž d¹ dº„dº  ’š’Œ‹ž‹Œ}ºˆžŒ‹š›Ðº}ºˆžŒ‹š›°º€ººÐº}º“š‘˜º dº d»0^» dŒ}Œ›ž‹žÐŒ}Œ“𙋀Œ}Œ›ž‹žÀŒŒÿŒ dœ}œ“š‘˜Ðœœÿ dŸð]Ÿ}Ÿ ‹ˆ™–‰šŒ–‡ d¿@^¿ dÀ dÁ}Á“°Á}Á ““”Š°Á}Á—ž‘›“šÐÁÐÁÐÁ}Á“š‘˜ dÂ} Œš‹žž†›ž‹ž€Â}“ÀÂ} ““”Š°Â}—ž‘›“šÐ°ÂÂÀÂ}›ž‹žÀÂÂÀÂА dÃÐWà dÄ dÅ dÆ`KƀWÆ}ÆŒ‹ž‹Š€ƐÆ dÇÀWÇ}Ç’Œ˜ –‘–‹ dÈ dÉ}Éš›–’€É}É™šš—ž‘›“š“–Œ‹ÀÉÉ@É dÊ}Êš›–’€Ê}Ê™šš—ž‘›“š“–Œ‹ÀÊʐÊ dËÐWË dÌ dÍ dÎ`KÎÀDÎ}Ώ“°ÎÎÐÎÐDΠ>Î dÏ`KÏÀDÏ}Ϗ“Œ–…šÐDπ>Ï dÐðDÐ}Џ“Œ–…šÐÐ dÑ`KÑÀDÑ}я“‹ÐDр>Ñ dÒðDÒ}ҏ“‹ÒÒ dÓ dÔ`KÔÀDÔ}Ô ““”Š°ÔÔ@ÐÔÐDԀ>Ô dÕ`KÕÀDÕ}Տ““”ŠŒ–…šÐDՀ>Õ dÖðDÖ}֏““”ŠŒ–…šÖÖ@ d×`K×ÀD×}× ““”Š‹ÐD׀>× dØðDØ}Ø ““”Š‹ØØ dÙ dÚ`KÚÀDÚ}Ú™šš—ž‘›“š“–Œ‹°ÚÐÚÐDڀ>Ú dÛ dÜ`KÜÀDÜ}Ü™ššÎɰÜÐÜÐD܀>Ü dÝ`KÝÀDÝ}Ý™ššÉ˰ÝÐÝÐD݀>Ý dÞ`KÞÀDÞ}Þ™ššÍÊɰÞÐÞÐDހ>Þ dß dà„dà  ’š’Œ‹ž‹Œ`KàÀDà}àˆžŒ‹š›ÐDà€>à dà dá dâ dã`Kã€Wã}㠘š‹’š’†€ã}ãž““œÐDã€>ãã°Wã€>ã däÀDä}䍚‹‰ž“ÐDä€>ä då dæ dç}獚‹‰ž“Ðç}珐“‹ dè}菐“‹Ðè}菐“‹°è}èž““œ°èè dé dê€^ê}ꏐ“‹ðê}ꏐ“Œ–…š^ê dë}돐“Œ–…šÐë}돐“Œ–…š ëë dì}썚›–’€ì}쏐“Àì}쏐“Œ–…šì dí ^í dî dï}“°ï}‹‰ž“°ïïÐïÐï}ïž““œ dð dñð^ñ}ñš‹‰ž“ dòÐWò dó dô`Kô€Wô}ô˜š‹’š’™’“€ô}ô ™šš“œ”°ôÐôÐDôWô Wô€>ôÀô}ôž““œÐDô€>ôô°Wô€>ô dõÀDõ}õ“š‘˜ÐDõ€>õ döÀDö}öš‹‰ž“ÐDö€>ö d÷ dø}ø“š‘˜Ðø}ø“š‘€ø}ø ™šš“œ”øÐøø dù dú}úš‹‰ž“Ðú}ú ™šš“œ”°ú}ú“š‘˜Ðú dû}ûš›–’€û}û ™šš“œ”Àû}û“š‘˜û dü dý}ý“°ý}ýš‹‰ž“°ýýÐýÐý}ýž““œ dþ dÿð^ÿ}ÿš‹‰ž“ dÐW dPK d d d d d d d d°d Define Object type stringAlloc #doc object stringAlloc ~This object is used to assocate an integer handle with a string. The integer handle ~can easily be stored in an array, unlike standard strings. Initially, you call ~Allocstring to allocate a string and get a handle to it. You can access the string ~by calling Getstring and passing in the handle returned by Allocstring. When you ~are done with the string, call Freestring. After calling Freestring, the handle is ~no longer valid. You must call Freestring when you are done with a string, to avoid ~exhausting the terminal's memory.

~The stringAlloc object was designed with speed in mind, and is significantly faster than ~calling the various string Array functions when manipulating large sets of strings. The ~major limitation it suffers versus the string Array functions is that stringAlloc is ~limited to 256 byte strings only. #doc func Allocstring #param data:The string to copy. This parameter is limited to arrays (strings) of length 256 or less ~Allocates the string given by the data parameter. This function returns a handle to the ~allocated string. The allocated string can be retreived by a call to Getstring. func Allocstring (data[] as byte) returns integer endfunc #doc func Freestring #param handle:A string handle that was previously allocated with Allocstring ~Frees a string that was previously allocated with Allocstring. This releases the ~handle and reclaims the memory that was occupied by the string for reuse. func Freestring (handle as reference to integer) endfunc #doc func Getstring #param handle: A handle to a string that was previously allocated with Allocstring ~Retreives a string that was allocated with Allocstring. func Getstring (handle as integer) returns string endfunc #undoc func GetStates func GetStats() returns string endfunc func PrintHandleInfo (handle as integer) endfunc endfunc #doc func Setstring #param handle: A handle previously returned from Allocstring #param data: The new string to assign to the handle. ~Reassigns the string associated with a string handle. You should pass in a handle ~received from the Allocstring function. func Setstring (handle as integer, data[] as byte) endfunc handles msg_init endfunc #undoc func GetMemory endfunc endfunc Enddef #endfile #ifnot Galil_mc_src_GMCDownload #option Galil_mc_src_GMCDownload library Galil_MC source GalilCommunications enum _GMC_StopParms as _GMCDL_Stop, _GMCDL_SuspendedDL, _GMCDL_SuspendedUL Define Object type GMCDownload #ToolImage "00007FFE46FE5AFE5AFE5AFE5AFE463E7FFE7FDE6FEE54066FEE7FDE0000" '******************************************************************* 'Object: GMCDownload 'Author: Jeremy Richards 'Date: 27 May 2004 ' 'Description: ' 'Version: 1.52 'Copyright: 2004 QSI Corporation. Permission to modify and ' distribute this object is granted provided this ' copyright notice remains in tact. '******************************************************************* #doc object GMCDownload ~This is a simple object which can either download a program to a Galil Motion Controller ~or upload an existing program from the controller. To download a program, set the ~DLProgram property (either in Layout View, or at runtime) then call the Download ~method at runtime.

~The easiest way to add a motion controller program to your workspace, is to include the program as a Binary Resouce ~in Qlarity Foundry. You then use the LoadFromResource method to load the specified binary ~resource into the DLProgram property. You can then call Download() to send the program to the controller. ~You can also set the DLProgram property by calling the ~LoadFromFile method at runtime to load a program that has been saved to the terminal's ~flash file system. ~

To upload a file, simply call the Upload method at runtime. This ~will set the ULProgram property. You can then either examine the value of this property, ~or call the SaveToFile method to save the uploaded program to a file. #doc prop DLProgram ~DLProgram contains the text of the program to be downloaded to the motion controller ~If you wish to download multiple programs, you may either create multiple GMCDownload objects, ~or you may simply change this property prior to calling the Download() method of ~this object dim DLProgram as string #doc prop ULProgram ~This property contains the most recently uploaded program from the motion controller. While you ~can explicitly set this property to a value, doing so has no meaning for the object. (i.e. this ~object does not use this property, except to set it after performing an upload) dim ULProgram as string #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication init commObject := empty func Startup() handles MSG_INIT GMC_VerifyCommObj(commObject) Attach(me, default) Enable(me, true) endfunc #doc func LoadFromFile #param filename:The name of the file to read. It can be either an absolute path (beginning with a slash '/') or a relative path from the current directory. ~This function opens a file in the terminal flash file system and loads its contents into the ~DLProgram property of this object. The file should be saved in a binary format (files ~transferred using the FTP object meet these criteria).

~This function returns true if it is able to successfully load the file. It returns false ~if it is unable to open the file, or encounters another problem. func LoadFromFile(filename as string) returns boolean dim flags as fileinfo_flags dim size, ufs as integer dim desc as filedesc dim data[] as byte check error GetFileInfo(filename, size, ufs, flags) on error GMC_ClearException() return false enderr check error desc = OpenFile (filename, file_Read and file_no_Create and file_binary) on error GMC_ClearException() return false enderr check error redim(data, size) ReadFile (desc, data) on error CloseFile(Desc) return false enderr CloseFile(desc) DLProgram := data return true endfunc #doc func LoadFromResource #param resource:The identifier of the binary resource to load. ~This method sets the DLProgram property at runtime, but loading a binary resource that ~was included with the application. To include a motion controller program as a binary resource, ~open the Edit Resources window and select the Binary resource tab. Then press ~"New Binary Resource" and select your motion controller program file. func LoadFromResource(resource as _binary) DLProgram := GetBinaryResource(resource) endfunc #doc func SaveToFile #param filename:The name of the file to read. It can be either an absolute path (beginning with a slash '/') or a relative path from the current directory. ~This method writes the contents of ULProgram to the specified file. It is generally ~used after the Upload method is called and has completed to write the contents read ~from the controller to a file.

~If the contents are successfully saved, this function returns true. Otherwise it returns ~false. func SaveToFile (filename as string) returns boolean dim desc as filedesc dim data[] as byte check error desc = OpenFile (filename, file_Write and file_binary) on error GMC_ClearException() return false enderr check error WriteFile (desc, ULProgram) on error CloseFile(Desc) return false enderr CloseFile(desc) return true endfunc #doc func Download #param DLMethod:This specifies how the motion controller deals with the program. To replace the existing program in the controller, pass in an empty string (""). To append to the end of the existing program pass in "#". For more details on this paramater, see the motion control documentation on the DL command. ~This function stops the execution of any program currently running on the controller and ~downloads the program contained in the DLProgram property (which can be loaded from a file ~which was transferred to the terminal via FTP). What is done with the program that is ~currently in the motion controller is controlled by the DLMethod paramater to this function. ~

Once the download has completed, the DownloadComplete event is fired. Override that ~event to perform some action once the download is complete, such as starting the new program. ~

If this object is already downloading a program, then this method returns false. ~otherwise it returns true. private dim downloading as boolean private dim awaitingColon as boolean private dim DownloadMethod as string func Download(DLMethod as string) returns boolean if downloading or uploading then return false endif downloading := true awaitingColon := false foundColonCount := 0 downloadMethod := DLMethod if not commObject.SendAsciiCommandStream("ST;EO0", me, _GMCDL_Stop) then FinishDownload(false) return true endif return true endfunc private func Success(parm as integer) returns boolean handles GMC_CommSuccess handles GMC_SuspendSuccessNotify if parm == _GMCDL_STOP then 'Stopped execution on the controller, now to suspend communications for the download commObject.SuspendCommunications(me, _GMCDL_SuspendedDL) elseif parm == _GMCDL_SuspendedDL then 'Communications are now suspended, so commence the download commObject.SuspendTransmit("DL" + downloadMethod + "\r\n") TxProgramAsChunks() commObject.suspendTransmit("\x1A\r\n") awaitingColon := true RegisterMsgHandler(me, msg_timetick, commObject.timeout/20) elseif parm == _GMCDL_SuspendedUL then commObject.SuspendTransmit ("UL;") RegisterMsgHandler (me, msg_timetick, commObject.timeout/20) endif return true endfunc 'enum GMC_EnetStates as GMC_Serial := 1, GMC_Pending := 2, GMC_Enet := 3, GMC_Invalid := 4 'if (enetState <> GMC_Serial) and (enetState <> GMC_Enet) then 'Not connected private func TxProgramAsChunks() 'We need to break the program into managable chunks for download dim i as integer dim max as integer dim holder as string dim pos as integer max = len(dlProgram)-1 for i = 0 to max step 256 'Strip out blank lines (seems to cause problems) holder = mid(dlprogram, i, 256) pos := find(holder, 0, -1, "\r\n\r\n") while pos >= 0 do holder := left(holder, pos) + mid(holder, pos+2, -1) pos := find(holder, pos, -1, "\r\n\r\n") loop pos := find(holder, 0, -1, "\n\n") while pos >= 0 do holder := left(holder, pos) + mid(holder, pos+1, -1) pos := find(holder, pos, -1, "\n\n") loop commObject.suspendTransmit(holder) next endfunc private func Failure(parm as integer) returns boolean handles GMC_CommFailure FinishDownload(false) return true endfunc private dim foundColonCount as integer private func ReceiveFromController(parm as integer) returns boolean handles GMC_SuspendCommReceive dim pos as integer if parm == _GMCDL_SuspendedDL then if awaitingColon then label nextColon pos := find(commObject.suspendedRecv, 0, -1, ":") if pos >= 0 then foundColonCount := foundColonCount+1 if foundColonCount >= 2 then FinishDownload(True) else commObject.suspendedRecv = mid(commObject.suspendedRecv, pos+1, -1) goto nextColon endif elseif find(commObject.suspendedRecv, 0, -1, "?") >= 0 then FinishDownload(False) endif endif elseif parm == _GMCDL_SuspendedUL then pos := find (commObject.suspendedRecv, 0, -1, "\x1A") if pos >= 0 then ULProgram := ULProgram + left(commObject.suspendedRecv, pos) FinishUpload(true) else ULProgram := ULProgram + commObject.suspendedRecv RegisterMsgHandler(me, msg_timetick, commObject.timeout/20) endif endif return true endfunc private func Timeout() handles MSG_TIMETICK if (downloading) then FinishDownload(false) elseif (uploading) then FinishUpload(false) endif endfunc private func FinishDownload (success as boolean) ULDLFinish() DownloadComplete(success) endfunc private func FinishUpload (success as boolean) ULDLFinish() UploadComplete (success) endfunc private func ULDLFinish() UnRegisterMsgHandler(me, MSG_TIMETICK, 0) downloading := false uploading := false awaitingColon := false commObject.ResumeCommunications() endfunc #doc override DownloadComplete #param success:This paramater is true if the download completed successfully. If there was an error in downloading, this paramater will be false. ~This event is fired whenever a download to the motion controller has completed. You can ~handle this event to perform some action when the download has completed, such as using a ~GMCCommand object to begin executing the new program. func DownloadComplete(success as boolean) return endfunc #doc override UploadComplete #param success:This paramater is true if the upload completed successfully. If there was an error in uploading, this paramater will be false. ~This event is fired whenever an upload from the motion controller has completed. You can ~handle this event to perform some action when the upload has completed. func UploadComplete(success as boolean) return endfunc #doc func Upload ~This method is used to retrieve the current program that is resident in the controller. ~Once the upload has completed, the UploadComplete event will fire and the ULProgram ~property will contain the uploaded program, which can then optionally be saved to the flash ~file system using the SaveToFile method. private dim Uploading as boolean func Upload() returns boolean if uploading or downloading then return false endif if commObject.SuspendCommunications(me, _GMCDL_SuspendedUL) then uploading := true ULProgram := "" endif return true endfunc private func ToolDragcreate (parent as objref) handles MSG_TOOL_DRAGCREATE Startup() return endfunc Enddef #endif #endfile Te˜ž“–“ ’œ Œœ ˜’œ›ˆ‘“ž› dtd˜ž“–“ ’œ Œœ ˜’œ›ˆ‘“ž› d dÀd}˜ž“–“ ’œÐd}˜ž“–“œ’’Š‘–œž‹–‘Œ d dd} ˜’œ Œ‹ž’ŒÐD}  ˜’œ›“ Œ‹À} ˜’œ›“ ŒŠŒš‘›š››“À} ˜’œ›“ ŒŠŒš‘›š›Š“ dK K@K} ˜’œ›ˆ‘“ž› d@dC<ÏÏÏÏȹ¹ºËɹºÊŸ¹ºÊŸ¹ºÊŸ¹ºÊŸ¹ºËÉ̺ȹ¹ºÈ¹»ºÉ¹ººÊËÏÉɹººÈ¹»ºÏÏÏÏ d d d d d d d d d d d d d d d d d d d d d d d d d d! d" d# d$ d% d& d' d( d)ÀD)}) ›“˜ž’ÐD)À>) d* d+ d, d- d. d/ÀD/}/ Š“˜ž’ÐD/À>/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9ÀD9}9 œ’’•šœ‹ÐD9à>9}9˜ž“–“œ’’Š‘–œž‹–‘ d:ðD:}: œ’’•šœ‹:}:š’‹† d; d<€W<}<Œ‹ž‹Š€<< d=ÀW=}=’Œ˜ –‘–‹ d> d?}?˜’œ ‰š–™†œ’’•€?}? œ’’•šœ‹? d@}@ž‹‹žœ—€@à^@À@P@@ dA}Aš‘ž“š€Aà^AÀA1AA dBÐWB dC dD dE dF dG dH dI dJ dK dL€WL}L “ž›™’™–“š€L}L™–“š‘ž’šÐDLÀ>LL°WL°>L dMÀDM}M™“ž˜ŒÐDM}M™–“š–‘™ ™“ž˜Œ dNÀDN}NŒ–…šÀN}NŠ™ŒÐDN€>N dOÀDO}O›šŒœÐDO}O™–“š›šŒœ dPÀDP}P›ž‹ž°PÐPÐDP >P dQ dR°^R_R dS}S ˜š‹™–“š–‘™€S}S™–“š‘ž’šÀS}SŒ–…šÀS}SŠ™ŒÀS}S™“ž˜ŒS dTÀ^T_T dU}U˜’œ œ“šžš‡œš‹–‘€UU dVð^VAV dWÐ^W dX dY°^Y_Y dZ}Z›šŒœÐZ}Zš‘™–“š€Z}Z™–“š‘ž’šÀZ}Z ™–“š šž›`Z}Z™–“𠑐 œšž‹š`Z}Z ™–“š –‘ž†Z d[À^[_[ d\}\˜’œ œ“šžš‡œš‹–‘€\\ d]ð^]A] d^Ð^^ d_ d`°^`_` da}aš›–’€a}a›ž‹žÀa}aŒ–…ša db}bšž›™–“š€b}b›šŒœÀb}b›ž‹žb dcÀ^c_c dd}d œ“Œš™–“š€d}d›šŒœd deð^eAe dfÐ^f dg}g œ“Œš™–“š€g}g›šŒœg dh di}i ›“˜ž’i}i›ž‹ž djð^j1j dkÐWk dl dm dn do dp dq dr ds€Ws}s“ž›™’šŒŠœš€s}sšŒŠœšÐDs?ss dt}t ›“˜ž’t}t˜š‹–‘ž†šŒŠœš€t}tšŒŠœšt duÐWu dv dw dx dy dz d{ d| d} d~€W~}~ Œž‰š‹™–“š€~}~™–“š‘ž’šÐD~À>~~°W~°>~ dÀD}›šŒœÐD}™–“š›šŒœ d€ÀD€}€›ž‹ž°€Ð€ÐD€ >€ d d‚°^‚_‚ dƒ}ƒ›šŒœÐƒ}ƒš‘™–“š€ƒ}ƒ™–“š‘ž’šÀƒ}ƒ ™–“š ˆ–‹š`ƒ}ƒ ™–“š –‘ž†ƒ d„À^„_„ d…}…˜’œ œ“šžš‡œš‹–‘€…… d†ð^†A† d‡Ð^‡ dˆ d‰°^‰_‰ dŠ}Š ˆ–‹š™–“š€Š}Š›šŒœÀŠ}Š Š“˜ž’Š d‹À^‹_‹ dŒ}Œ œ“Œš™–“š€Œ}Œ›šŒœŒ dð^A dŽÐ^Ž d} œ“Œš™–“š€}›šŒœ d d‘ð^‘1‘ d’ÐW’ d“ d” d• d– d— d˜ d™ dš d› dœ d dž`KžÀDž}ž ›ˆ‘“ž›–‘˜ÐDž°>ž dŸ`KŸÀDŸ}Ÿ žˆž–‹–‘˜œ“‘ÐDŸ°>Ÿ d `K ÀD } ›ˆ‘“ž›’š‹—›ÐD À>  d¡€W¡}¡›ˆ‘“ž›€¡}¡›“’š‹—›ÐD¡À>¡¡°W¡°>¡ d¢^¢}¢ ›ˆ‘“ž›–‘˜À¢}¢ Š“ž›–‘˜^¢ d£ð^£A£ d€@^€ d¥}¥ ›ˆ‘“ž›–‘˜¥1¥ dŠ}Š žˆž–‹–‘˜œ“‘ŠAŠ d§}§™Š‘›œ“‘œŠ‘‹§§ dš}š›ˆ‘“ž›’š‹—›š}š›“’š‹—› d©^©©}© œ’’•šœ‹à©}©Œš‘›žŒœ––œ’’ž‘›Œ‹šž’€©C©¬«Äº°ÏÀ©à^©À©}©  ˜’œ›“ Œ‹©^© dª}ª™–‘–Œ—›ˆ‘“ž›€ªAªª d«ð^«1« d¬@^¬ d­ d®ð^®1® d¯ÐW¯ d° d±`K±€W±}±ŒŠœœšŒŒ€±}±ž’ÐD±€>±±°W±°>± d²ÀW²}²˜’œ œ’’ŒŠœœšŒŒ d³ÀW³}³˜’œ ŒŠŒš‘›ŒŠœœšŒŒ‘‹–™† dŽ dµ^µ}µž’е}µ  ˜’œ›“ Œ‹^µ d¶ d·}· œ’’•šœ‹à·}·ŒŠŒš‘›œ’’Š‘–œž‹–‘Œ€·à^·À·}· ˜’œ›“ ŒŠŒš‘›š››“· dž ^ž}žž’О}ž ˜’œ›“ ŒŠŒš‘›š››“^ž d¹ dº}º œ’’•šœ‹àº}ºŒŠŒš‘›‹ž‘Œ’–‹€ºCº»³°º}º›ˆ‘“ž›’š‹—›°ºCºòõº d»}»‹‡˜ž’žŒœ—Š‘”Œ€»» dŒ}Œ œ’’•šœ‹àŒ}ŒŒŠŒš‘›‹ž‘Œ’–‹€ŒCŒåòõŒ dœ}œ žˆž–‹–‘˜œ“‘œ1œ dŸ}Ÿš˜–Œ‹š’Œ˜—ž‘›“š€Ÿà^ŸÀŸ}Ÿ ’Œ˜ ‹–’š‹–œ”ÀŸ}Ÿ œ’’•šœ‹àŸ}Ÿ‹–’šŠ‹ðŸŸŸ d¿ ^¿}¿ž’п}¿ ˜’œ›“ ŒŠŒš‘›š›Š“^¿ dÀ}À œ’’•šœ‹àÀ}ÀŒŠŒš‘›‹ž‘Œ’–‹€ÀCÀª³ÄÀ dÁ}Áš˜–Œ‹š’Œ˜—ž‘›“š€Áà^ÁÀÁ}Á ’Œ˜ ‹–’š‹–œ”ÀÁ}Á œ’’•šœ‹àÁ}Á‹–’šŠ‹ðÁÁÁ dÂ@^ dà dÄð^Ä1Ä dÅÐWÅ dÆ dÇ dÈ dÉ`KɀWÉ}É‹‡˜ž’žŒœ—Š‘”Œ€ɐÉ dÊ dËÀDË}Ë–ÐDˀ>Ë dÌÀDÌ}Ì’ž‡ÐD̀>Ì dÍÀDÍ}Í—“›šÐDÍÀ>Í dÎÀDÎ}ΏŒÐD΀>Î dÏ dÐ}Ð’ž‡ÐÐ}Гš‘€Ð}Ð ›“˜ž’ÐÐÐÐ dÑP^Ñ}Ñ–ÐÑÑ WÑ}Ñ’ž‡p^ÑÑ dÒ dÓ}Ó—“›šÐÓ}Ó’–›€Ó}Ó ›“˜ž’ÀÓ}Ó–ÀÓÓÓ dÔ}ԏŒÔ}Ô™–‘›€Ô}Ô—“›šÀÔÔÀÔÐÔÔÀÔCÔòõòõÔ dՀ^Õ}ՏŒðÕՐ^Õ dÖ}Ö—“›šÖ}Ö“𙋀Ö}Ö—“›šÀÖ}֏ŒÖ°Ö}Ö’–›€Ö}Ö—“›šÀÖ}֏Œ°ÖÖÀÖÐÖÖÖ d×}׏Œ×}×™–‘›€×}×—“›šÀ×}׏ŒÀ×Ð××À×C×òõòõ× dØ ^Ø dÙ}ُŒÙ}Ù™–‘›€Ù}Ù—“›šÀÙÙÀÙÐÙÙÀÙCÙõõÙ dڀ^Ú}ڏŒðÚڐ^Ú dÛ}Û—“›šÛ}Û“𙋀Û}Û—“›šÀÛ}ۏŒÛ°Û}Û’–›€Û}Û—“›šÀÛ}ۏŒ°ÛÛÀÛÐÛÛÛ dÜ}܏ŒÜ}Ü™–‘›€Ü}Ü—“›šÀÜ}܏ŒÀÜÐÜÜÀÜCÜõõÜ dÝ ^Ý dÞ}Þ œ’’•šœ‹àÞ}ÞŒŠŒš‘›‹ž‘Œ’–‹€Þ}Þ—“›šÞ dß`^ß dàÐWà dá dâ`Kâ€Wâ}♞–“Šš€â}⏞’ÐDâ€>ââ°Wâ°>â dãÀWã}㘒œ œ’’™ž–“Šš dä}ä™–‘–Œ—›ˆ‘“ž›€äAää dåð^å1å dæÐWæ dç dè`KèÀDè}è™Š‘›œ“‘œŠ‘‹ÐDè€>è dé`Ké€Wé}鍚œš–‰š™’œ‘‹““š€é}鏞’ÐDé€>éé°Wé°>é dêÀWê}ꘒœ ŒŠŒš‘›œ’’šœš–‰š dëÀDë}돐ŒÐDë€>ë dì dí^í}폞’Ðí}í ˜’œ›“ ŒŠŒš‘›š››“^í dî^î}î žˆž–‹–‘˜œ“‘^î dïà]ï}ï ‘š‡‹œ“‘ dð}ðŒð}ð™–‘›€ð}𠜐’’•šœ‹àð}𠌊Œš‘›š›šœ‰ÀððÀðÐððÀðCðŐð dñ^ñ}ñŒðññ^ñ dò}ò™Š‘›œ“‘œŠ‘‹ò}ò™Š‘›œ“‘œŠ‘‹°òò dó^ó}󙐊‘›œ“‘œŠ‘‹ðóó^ó dô}ô™–‘–Œ—›ˆ‘“ž›€ô1ôô dõ0^õ dö}ö œ’’•šœ‹àö}ö ŒŠŒš‘›š›šœ‰Ðö}ö’–›€ö}ö œ’’•šœ‹àö}ö ŒŠŒš‘›š›šœ‰Àö}öŒ°ööÀöÐööö d÷ð]÷}÷ ‘š‡‹œ“‘ dø@^ø dù ^ù}ù™–‘›€ù}ù œ’’•šœ‹àù}ù ŒŠŒš‘›š›šœ‰ÀùùÀùÐùùÀùCùÀùðùù^ù dú}ú™–‘–Œ—›ˆ‘“ž›€úAúú dû@^û dü@^ü dý ^ý}ýž’Ðý}ý ˜’œ›“ ŒŠŒš‘›š›Š“^ý dþ}þŒþ}þ™–‘›€þ}þ œ’’•šœ‹àþ}þ ŒŠŒš‘›š›šœ‰ÀþþÀþÐþþÀþCþåþ dÿ^ÿ}ÿŒðÿÿ^ÿ d} Š“˜ž’} Š“˜ž’°}“𙋀} œ’’•šœ‹à} ŒŠŒš‘›š›šœ‰À}Œ d} ™–‘–Œ—Š“ž›€1 d0^ d} Š“˜ž’} Š“˜ž’°} œ’’•šœ‹à} ŒŠŒš‘›š›šœ‰ d}š˜–Œ‹š’Œ˜—ž‘›“š€à^À} ’Œ˜ ‹–’š‹–œ”À} œ’’•šœ‹à}‹–’šŠ‹ð d@^ d@^ d dð^1 d ÐW  d  d `K €W } ‹–’šŠ‹€   d ÀW }  ’Œ˜ ‹–’š‹–œ” d  d^€} ›ˆ‘“ž›–‘˜^ d}™–‘–Œ—›ˆ‘“ž›€A d ^€} Š“ž›–‘˜^ d} ™–‘–Œ—Š“ž›€A d@^ dÐW d d`K€W}™–‘–Œ—›ˆ‘“ž›€}ŒŠœœšŒŒÐD°> d} Š“›“™–‘–Œ—€ d d}›ˆ‘“ž›œ’“š‹š€}ŒŠœœšŒŒ dÐW d d`K€W} ™–‘–Œ—Š“ž›€}ŒŠœœšŒŒÐD°> d} Š“›“™–‘–Œ—€ d d}Š“ž›œ’“š‹š€}ŒŠœœšŒŒ dÐW d  d!`K!€W!}! Š“›“™–‘–Œ—€!! d"}"Š‘š˜–Œ‹š’Œ˜—ž‘›“š€"à^"À"}" ’Œ˜ ‹–’š‹–œ”À""" d#}# ›ˆ‘“ž›–‘˜#A# d$}$ Š“ž›–‘˜$A$ d%}% žˆž–‹–‘˜œ“‘%A% d&}& œ’’•šœ‹à&}&šŒŠ’šœ’’Š‘–œž‹–‘Œ€&& d'ÐW' d( d) d* d+ d, d- d.€W.}.›ˆ‘“ž›œ’“š‹š€.}.ŒŠœœšŒŒÐD.°>.. d/ð^/ d0ÐW0 d1 d2 d3 d4 d5 d6€W6}6Š“ž›œ’“š‹š€6}6ŒŠœœšŒŒÐD6°>66 d7ð^7 d8ÐW8 d9 d: d; d< d= d> d?`K?ÀD?}? Š“ž›–‘˜ÐD?°>? d@€W@}@Š“ž›€@@°W@°>@ dA^A}A Š“ž›–‘˜ÀA}A ›ˆ‘“ž›–‘˜^A dBð^BAB dC@^C dD dE^E}E œ’’•šœ‹àE}EŒŠŒš‘›œ’’Š‘–œž‹–‘Œ€Eà^EÀE}E ˜’œ›“ ŒŠŒš‘›š›Š“E^E dF}F Š“ž›–‘˜F1F dG}G Š“˜ž’GCG dH@^H dI dJð^J1J dKÐWK dL dM`KM€WM}M‹“›ž˜œšž‹š€M}Mžš‘‹ÐDMà>MM dNÀWN}N’Œ˜ ‹“ ›ž˜œšž‹š dO dP}PŒ‹ž‹Š€PP dQð^Q dRÐWR dSPKS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df df dg dh°dh Define Object type GMCDownload #doc object GMCDownload ~This is a simple object which can either download a program to a Galil Motion Controller ~or upload an existing program from the controller. To download a program, set the ~DLProgram property (either in Layout View, or at runtime) then call the Download ~method at runtime.

~The easiest way to add a motion controller program to your workspace, is to include the program as a Binary Resouce ~in Qlarity Foundry. You then use the LoadFromResource method to load the specified binary ~resource into the DLProgram property. You can then call Download() to send the program to the controller. ~You can also set the DLProgram property by calling the ~LoadFromFile method at runtime to load a program that has been saved to the terminal's ~flash file system. ~

To upload a file, simply call the Upload method at runtime. This ~will set the ULProgram property. You can then either examine the value of this property, ~or call the SaveToFile method to save the uploaded program to a file. #doc prop DLProgram ~DLProgram contains the text of the program to be downloaded to the motion controller ~If you wish to download multiple programs, you may either create multiple GMCDownload objects, ~or you may simply change this property prior to calling the Download() method of ~this object dim DLProgram as string #doc prop ULProgram ~This property contains the most recently uploaded program from the motion controller. While you ~can explicitly set this property to a value, doing so has no meaning for the object. (i.e. this ~object does not use this property, except to set it after performing an upload) dim ULProgram as string #doc prop commObject ~commObject defines which GalilCommunication object will be used to communicate with ~the controller. You should create one GalilCommunication object for each motion controller ~you wish to communicate with. By setting the commObject property, you can control wich ~motion controller this object communicates with.

Most projects will require only ~one GalilCommunication object, and this property will automatically be set to refer to that ~communication object. dim commObject as objref GalilCommunication func Startup() handles MSG_INIT endfunc #doc func LoadFromFile #param filename:The name of the file to read. It can be either an absolute path (beginning with a slash '/') or a relative path from the current directory. ~This function opens a file in the terminal flash file system and loads its contents into the ~DLProgram property of this object. The file should be saved in a binary format (files ~transferred using the FTP object meet these criteria).

~This function returns true if it is able to successfully load the file. It returns false ~if it is unable to open the file, or encounters another problem. func LoadFromFile(filename as string) returns boolean endfunc #doc func LoadFromResource #param resource:The identifier of the binary resource to load. ~This method sets the DLProgram property at runtime, but loading a binary resource that ~was included with the application. To include a motion controller program as a binary resource, ~open the Edit Resources window and select the Binary resource tab. Then press ~"New Binary Resource" and select your motion controller program file. func LoadFromResource(resource as _binary) endfunc #doc func SaveToFile #param filename:The name of the file to read. It can be either an absolute path (beginning with a slash '/') or a relative path from the current directory. ~This method writes the contents of ULProgram to the specified file. It is generally ~used after the Upload method is called and has completed to write the contents read ~from the controller to a file.

~If the contents are successfully saved, this function returns true. Otherwise it returns ~false. func SaveToFile (filename as string) returns boolean endfunc #doc func Download #param DLMethod:This specifies how the motion controller deals with the program. To replace the existing program in the controller, pass in an empty string (""). To append to the end of the existing program pass in "#". For more details on this paramater, see the motion control documentation on the DL command. ~This function stops the execution of any program currently running on the controller and ~downloads the program contained in the DLProgram property (which can be loaded from a file ~which was transferred to the terminal via FTP). What is done with the program that is ~currently in the motion controller is controlled by the DLMethod paramater to this function. ~

Once the download has completed, the DownloadComplete event is fired. Override that ~event to perform some action once the download is complete, such as starting the new program. ~

If this object is already downloading a program, then this method returns false. ~otherwise it returns true. func Download(DLMethod as string) returns boolean endfunc handles GMC_CommSuccess handles GMC_SuspendSuccessNotify endfunc endfunc handles GMC_CommFailure endfunc handles GMC_SuspendCommReceive endfunc handles MSG_TIMETICK endfunc endfunc endfunc endfunc #doc override DownloadComplete #param success:This paramater is true if the download completed successfully. If there was an error in downloading, this paramater will be false. ~This event is fired whenever a download to the motion controller has completed. You can ~handle this event to perform some action when the download has completed, such as using a ~GMCCommand object to begin executing the new program. func DownloadComplete(success as boolean) endfunc #doc override UploadComplete #param success:This paramater is true if the upload completed successfully. If there was an error in uploading, this paramater will be false. ~This event is fired whenever an upload from the motion controller has completed. You can ~handle this event to perform some action when the upload has completed. func UploadComplete(success as boolean) endfunc #doc func Upload ~This method is used to retrieve the current program that is resident in the controller. ~Once the upload has completed, the UploadComplete event will fire and the ULProgram ~property will contain the uploaded program, which can then optionally be saved to the flash ~file system using the SaveToFile method. func Upload() returns boolean endfunc handles MSG_TOOL_DRAGCREATE endfunc Enddef #endfile