'******************************************** '* < FLEX > * '* musical robot by dr.Godfried-Willem Raes * '* 2002-2003 * '* User interface and driver code * '******************************************** '29.08.2002: start coding '09.09.2002: tests for stepping motors '27.12.2002: pincode test o.k. '28.12.2002: test session bending motors. Using USB on putty. '01.01.2003: test bow motor code. '04.01.2003: flex_beat rewritten in DLL. '07.01.2003: centers in sliders widened. '12.01.2003: param-window arranger added. '13.01.2003: exact mapping of hardware components checked '18.01.2003: midi listen task implemented. '29.05.2003: test coding for softpush solenoids added. '01.06.2003: practical test on flex. '07.06.2003: debug session. '08.06.2003: start coding ' we still have an inconsistency in the numbering of bows, blades and motors in the different functions. '10.06.2003: start double coding (in part in Faust) '22.07.2003: ADXL port opened automatically from listen task for '27.07.2007: adapted to new AXE3 sensor. - flexes code moved to flexes in Faust. %Flexing = 18 ' demo voor %Flex_PiMot = 32 ' Pi-saw threadmotor - low level test task, varispeed %Flex_eMot = 48 ' e-saw threadmotor - low level test task, varispeed %Flex_PiMotPos = 33 ' Pi-motor positioning task %Flex_eMotPos = 49 ' e -motor positioning task %Flex_BackBow = 50 %Flex_FrontBow = 51 %Flex_PushBackBow = 52 ' back bow pushers %Flex_PushFrontBow = 53 ' front bow pushers %Flex_SoftPushBackBow = 54 ' softshift solenoids %Flex_SoftPushFrontBow = 55 %Flex_H12 = 40 ' beaters 1,2 Pi bow - front %Flex_H34 = 56 ' beaters 3,4 e -bow - front %Flex_H56 = 57 ' beaters 5,6 e -bow - back %Flex_H78 = 41 ' beaters 7,8 Pi bow - back %Flex_H1 = 44 ' Pi-front 1 %Flex_H2 = 45 ' Pi-front-2 %Flex_H3 = 60 %Flex_H4 = 61 %Flex_H5 = 62 %Flex_H6 = 63 %Flex_H7 = 46 ' Pi-Back 1 %Flex_H8 = 47 ' Pi Back 2 %Flex_Vel1 = 28 %Flex_Vel2 = 29 %Flex_Vel3 = 30 %Flex_Vel4 = 31 GLOBAL pFlex AS Flextype PTR GLOBAL pAXE3 AS Axe_Type PTR ' new version 27.10.2007 DECLARE FUNCTION Init_Flex () AS LONG DECLARE SUB Flex_Power () DECLARE SUB FlexPiMot () DECLARE SUB FlexeMot () DECLARE SUB Flex_PiMotStop () DECLARE SUB Flex_eMotStop () DECLARE SUB Flex_BackBow () DECLARE SUB Flex_FrontBow () DECLARE SUB Flex_BackBowStop () DECLARE SUB Flex_FrontBowStop () DECLARE SUB Flex_PushBackBow () DECLARE SUB Flex_PushFrontBow () DECLARE SUB Flex_PushBackBowStop () DECLARE SUB Flex_PushFrontBowStop () DECLARE SUB Flex_SoftPushBackBow () ' 29.05.2003 DECLARE SUB Flex_SoftPushFrontBow () DECLARE SUB Flex_SoftPushBackBowStop () DECLARE SUB Flex_SoftPushFrontBowStop () DECLARE SUB FlexBeaters12 () DECLARE SUB FlexBeaters34 () DECLARE SUB FlexBeaters56 () DECLARE SUB FlexBeaters78 () DECLARE SUB FlexBeaters1 () DECLARE SUB FlexBeaters2 () DECLARE SUB FlexBeaters3 () DECLARE SUB FlexBeaters4 () DECLARE SUB FlexBeaters5 () DECLARE SUB FlexBeaters6 () DECLARE SUB FlexBeaters7 () DECLARE SUB FlexBeaters8 () DECLARE SUB Flex_Vel1 () DECLARE SUB Flex_Vel2 () DECLARE SUB Flex_Vel3 () DECLARE SUB Flex_Vel4 () DECLARE SUB Flex_MoveWindows () DECLARE SUB Flex_Messagehandler () DECLARE FUNCTION Flex_Reset(OPT BYVAL abort AS LONG) AS LONG DECLARE CALLBACK FUNCTION Flex_AbortReset ' demo piece: DECLARE SUB Flexing () '08.06.2003 DECLARE SUB Flexing_Stop () FUNCTION Init_Flex () AS LONG LOCAL m AS ASCIIZ * 40 LOCAL i AS DWORD #IF %DEF(%Klungsim) i = Flex_Init_Dll (gh, %True) ' we pass a parameter for simulator mode! #ELSE i = Flex_Init_Dll (gh,%False) #ENDIF IF ISFALSE i THEN EXIT FUNCTION pFlex = i @pFlex.pMessagehandler = CODEPTR(Flex_MessageHandler) ' required in dll 'delete unnecessary buttons ButnSW(2).tag0 = "PowOff" ' switches solenoid voltage on/off ButnSW(2).tag1 = "Pow ON" ButnSW(2).cptr = CODEPTR(Flex_Power) ButnSW(3).tag0 = "" ButnSW(4).tag0 = "" ButnSW(5).tag0 = "" ButnSW(6).tag0 = "" ButnSW(7).tag0 = "" ButnSW(8).tag0 = "" ButnSW(9).tag0 = "" ButnSW(10).tag0 = "" ButnOS(3).tag = "RESET" ButnOS(3).cptr = CODEPTR(Flex_Reset) ButnOS(4).tag = "" ButnOS(5).tag = "" ButnOS(6).tag = "" ButnOS(8).tag = "" ButnOS(9).tag = "ArrWin" ButnOS(9).cptr = CODEPTR(Flex_MoveWindows) #IF NOT %DEF(%klungSim) ButnOS(7).tag = "PANIC" m = UCASE$("Flex_AllOff") ButnOs(7).cptr = GetProcAddress(gh.gnh,m) #ELSE ' FlexIniSim ' overwrites settings... #ENDIF Task(5).cptr = %False Task(5).naam = "" ' Task(9).cptr = %False ' Task(9).naam = "" Task(14).cptr = %False Task(14).naam = "" ' Task(15).cptr = %False ' Task(15).naam = "" Task(%Flexing).naam = "Flexing" Task(%flexing).cptr = CODEPTR(Flexing) Task(%Flexing).freq = 50 TaskEX(%Flexing).StopCptr = CODEPTR(Flexing_Stop) Task(%Flex_PiMot).naam = "Pi-Mot" Task(%Flex_PiMot).freq = 4 Task(%Flex_PiMot).cptr = CODEPTR(flexPiMot) TaskEx(%Flex_PiMot).Stopcptr = CODEPTR(flex_PiMotStop) Task(%Flex_eMot).naam = "e-Mot" Task(%Flex_eMot).freq = 4 Task(%Flex_eMot).cptr = CODEPTR(flexeMot) TaskEx(%Flex_eMot).Stopcptr = CODEPTR(flex_eMotStop) Task(%Flex_PiMotPos).naam = "Pi-pos" Task(%Flex_PiMotPos).freq = 4 Task(%Flex_PiMotPos).cptr = CODEPTR(flexPos_Pi) Task(%Flex_eMotPos).naam = "e-pos" Task(%Flex_eMotPos).freq = 4 Task(%Flex_eMotPos).cptr = CODEPTR(flexPos_e) Task(%Flex_BackBow).naam = "BackBow" Task(%Flex_BackBow).freq = 6 Task(%Flex_BackBow).cptr = CODEPTR(flex_BackBow) TaskEX(%Flex_Backbow).Stopcptr = CODEPTR(flex_BackBowStop) Task(%Flex_FrontBow).naam = "FrontBow" Task(%Flex_FrontBow).freq = 6 Task(%Flex_FrontBow).cptr = CODEPTR(flex_FrontBow) TaskEX(%Flex_Frontbow).Stopcptr = CODEPTR(flex_FrontBowStop) ' Task(%Flex_PushBackBow).naam = "PushBack" ' wrong! ' Task(%Flex_PushBackBow).cptr = CODEPTR(Flex_PushBackBow) ' Task(%Flex_PushBackBow).freq = 10 ' TaskEX(%Flex_PushBackBow).Stopcptr = CODEPTR(Flex_PushBackBowStop) ' Task(%Flex_PushFrontBow).naam = "PushFront" ' Task(%Flex_PushFrontBow).cptr = CODEPTR(Flex_PushFrontBow) ' Task(%Flex_PushFrontBow).freq = 10 ' TaskEX(%Flex_PushFrontBow).Stopcptr = CODEPTR(Flex_PushFrontBowStop) Task(%Flex_SoftPushBackBow).naam = "PuSBack" Task(%Flex_SoftPushBackBow).cptr = CODEPTR(Flex_SoftPushBackBow) Task(%Flex_SoftPushBackBow).freq = 4 TaskEX(%Flex_SoftPushBackBow).Stopcptr = CODEPTR(Flex_SoftPushBackBowStop) Task(%Flex_SoftPushFrontBow).naam = "PuSFront" Task(%Flex_SoftPushFrontBow).cptr = CODEPTR(Flex_SoftPushFrontBow) Task(%Flex_SoftPushFrontBow).freq = 4 TaskEX(%Flex_SoftPushFrontBow).Stopcptr = CODEPTR(Flex_SoftPushFrontBowStop) Task(%Flex_H12).naam = "Pi-beatF" Task(%Flex_H12).cptr = CODEPTR(FlexBeaters12) Task(%Flex_H12).freq = 30 Task(%Flex_H34).naam = "eBeatF" Task(%Flex_H34).cptr = CODEPTR(FlexBeaters34) Task(%Flex_H34).freq = 30 Task(%Flex_H56).naam = "eBeatB" Task(%Flex_H56).cptr = CODEPTR(FlexBeaters56) Task(%Flex_H56).freq = 30 Task(%Flex_H78).naam = "Pi-BeatB" Task(%Flex_H78).cptr = CODEPTR(FlexBeaters78) Task(%Flex_H78).freq = 30 Task(%Flex_H1).naam = "Pi-F-in" ' binnenkant (naar centrale buis) Task(%Flex_H1).cptr = CODEPTR(FlexBeater1) Task(%Flex_H1).freq = 30 Task(%Flex_H2).naam = "Pi-F-out" ' buitenkant Task(%Flex_H2).cptr = CODEPTR(FlexBeater2) ' this one still has a hardware fault! Task(%Flex_H2).freq = 30 Task(%Flex_H7).naam = "Pi-B-in" ' binnenkant Task(%Flex_H7).cptr = CODEPTR(FlexBeater7) Task(%Flex_H7).freq = 30 Task(%Flex_H8).naam = "Pi-B-out" ' buitenkant Task(%Flex_H8).cptr = CODEPTR(FlexBeater8) Task(%Flex_H8).freq = 30 Task(%Flex_H3).naam = "e-F-in" ' binnenkant Task(%Flex_H3).cptr = CODEPTR(FlexBeater3) Task(%Flex_H3).freq = 30 Task(%Flex_H4).naam = "e-F-out" ' buitenkant Task(%Flex_H4).cptr = CODEPTR(FlexBeater4) Task(%Flex_H4).freq = 30 Task(%Flex_H5).naam = "e-B-in" ' binnenkant Task(%Flex_H5).cptr = CODEPTR(FlexBeater5) Task(%Flex_H5).freq = 30 Task(%Flex_H6).naam = "e-B-out" ' buitenkant Task(%Flex_H6).cptr = CODEPTR(FlexBeater6) Task(%Flex_H6).freq = 30 ' for hardware debug only: Task(%Flex_Vel1).naam = "Ft @ e" Task(%Flex_Vel1).cptr = CODEPTR(Flex_Vel1) Task(%Flex_Vel1).freq = 0.5 Task(%Flex_Vel2).naam = "Ft @ Pi" Task(%Flex_Vel2).cptr = CODEPTR(Flex_Vel2) Task(%Flex_Vel2).freq = 0.5 Task(%Flex_Vel3).naam = "Bk @ e" Task(%Flex_Vel3).cptr = CODEPTR(Flex_Vel3) Task(%Flex_Vel3).freq = 0.5 Task(%Flex_Vel4).naam = "Bk @ Pi" Task(%Flex_Vel4).cptr = CODEPTR(Flex_Vel4) Task(%Flex_Vel4).freq = 0.5 SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr FUNCTION = %true END FUNCTION SUB Flex_Power () ' buttonswitch handler ' on/off switch STATIC init AS DWORD STATIC onoff AS DWORD LOCAL i AS LONG IF ISFALSE init THEN onoff = %True init = %True END IF BIT TOGGLE onoff,0 IF onoff THEN ButnSW(2).tag0 = "PowOff" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 2, ButnSW(2).tag0 Flex_On 1 ' on ELSE ButnSW(2).tag1 = "PowOn" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 2, ButnSW(2).tag1 i = Flex_Reset ' MSGBOX "click here if reset finished",,FUNCNAME$ Flex_On 0 ' off END IF END SUB SUB FlexPos_Pi () ' test dll positioning code. '%Flex_PiMotPos = 33 ' Pi-motor positioning task STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "PiPos" IF ISFALSE Task(%Flex_PiMotPos).hParam THEN MakeTaskParameterDialog %Flex_PiMotPos,1,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Flex_PiMotPos).SliderNumbers(0) ' we should set the range of this slider to 0-100 Slider(slnr).minval = 0 Slider(slnr).maxval = 100 Slider(Slnr).value = @pFlex.pipos '0 SendMessage Slider(slnr).h, %TBM_SETRANGE,%True, MakeLong(Slider(slnr).minval, Slider(slnr).maxval) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows END IF IF ISFALSE Task(%Flex_PiMotPos).tog THEN Task(%Flex_PiMotPos).tog = %True END IF IF @pFlex.PiPos <> Slider(slnr).value THEN '... IF ISFALSE Task(%Flex_PiRotTask).swit THEN Task(%Flex_PiRotTask).level = Slider(slnr).value starttask %Flex_PiRotTask END IF ELSE 'DON'T let task stop itself, or motor keeps running.. kl030123 'IF Task(%Flex_PiRotTask).swit THEN stoptask %Flex_PiRotTask EXIT SUB END IF END SUB SUB FlexPos_e () ' test dll positioning code. '%Flex_eMotPos = 49 ' e -motor positioning task STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "e-Pos" IF ISFALSE Task(%Flex_eMotPos).hParam THEN MakeTaskParameterDialog %Flex_eMotPos,1,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Flex_eMotPos).SliderNumbers(0) ' we should set the range of this slider to 0-100 Slider(slnr).minval = 0 Slider(slnr).maxval = 100 Slider(Slnr).value = @pFlex.epos SendMessage Slider(slnr).h, %TBM_SETRANGE,%True, MakeLong(Slider(slnr).minval, Slider(slnr).maxval) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows END IF IF ISFALSE Task(%Flex_eMotPos).tog THEN Task(%Flex_eMotPos).tog = %True END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(@pFlex.ePos) + " - " + STR$(Slider(slnr).value) IF @pFlex.ePos <> Slider(slnr).value THEN '... IF ISFALSE Task(%Flex_eRotTask).swit THEN Task(%Flex_eRotTask).level = Slider(slnr).value starttask %Flex_eRotTask END IF ELSE 'IF Task(%Flex_eRotTask).swit THEN stoptask %Flex_eRotTask EXIT SUB END IF END SUB SUB FlexPiMot () ' 10.09.2002 : tested and debugged in collaboration with the flexstepper.bs2 program for the stamp. ' 28.12.2002 : bug: motors are 1 and 2, not 0 and 1. Now o.k. ' when end of traject is reached, motor will stop. ' duration of traject depends on speed. ' maximum speed values cause slip on motor. STATIC oldspeed0 AS LONG STATIC speed0 AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL i AS LONG IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Pi-Mot" IF Task(%Flex_PiMot).hParam = %Null THEN MakeTaskParameterDialog %Flex_PiMot,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr= TaskEX(%Flex_PiMot).SliderNumbers(0) Flex_Movewindows EXIT SUB END IF IF ISFALSE Task(%Flex_PiMot).tog THEN Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Task(%Flex_PiMot).tog = %True END IF IF Slider(Slnr).value <> oldspeed0 THEN SELECT CASE Slider(Slnr).value CASE < 60 ' opspannen bladveer (toonhoogte omhoog) speed0 = 255 - (Slider(Slnr).value * 2) ' 255 ---> 129 'IF speed0 = 1 THEN INCR speed0 onmogelijk Flex_Bend 1, speed0 CASE 60 TO 68 Flex_Bend 1, %False speed0 = %False CASE > 68 ' strekken bladveer (toonhoogte omlaag) speed0 = (Slider(Slnr).value - 64) * 2 ' 2 ----> 126 speed0 = speed0 AND 127 ' mask bit 7 Flex_Bend 1, speed0 END SELECT SetDlgItemText gh.CockPit,%GMT_MSG1, "Pi-Mot=" & STR$(speed0) oldspeed0 = Slider(Slnr).value END IF Task(%Flex_PiMot).freq = 4 END SUB SUB FlexeMot () ' 10.09.2002 : tested and debugged in collaboration with the flexstepper.bs2 program for the stamp. ' 28.12.2002 : bug: motors are 1 and 2, not 0 and 1. Now o.k. ' when end of traject is reached, motor will stop. ' duration of traject depends on speed. ' maximum speed values cause slip on motor. STATIC oldspeed0 AS LONG STATIC speed0 AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL i AS LONG IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="e-Mot" IF Task(%Flex_eMot).hParam = %Null THEN MakeTaskParameterDialog %Flex_eMot,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr= TaskEX(%Flex_eMot).SliderNumbers(0) Flex_Movewindows EXIT SUB END IF IF ISFALSE Task(%Flex_eMot).tog THEN Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Task(%Flex_eMot).tog = %True END IF IF Slider(Slnr).value <> oldspeed0 THEN SELECT CASE Slider(Slnr).value CASE < 60 ' opspannen bladveer (toonhoogte omhoog) speed0 = 255 - (Slider(Slnr).value * 2) ' 255 ---> 129 'IF speed0 = 1 THEN INCR speed0 onmogelijk Flex_Bend 2, speed0 CASE 60 TO 68 Flex_Bend 2, %False speed0 = %False CASE > 68 ' strekken bladveer (toonhoogte omlaag) speed0 = (Slider(Slnr).value - 64) * 2 ' 2 ----> 126 speed0 = speed0 AND 127 ' mask bit 7 Flex_Bend 2, speed0 END SELECT SetDlgItemText gh.CockPit,%GMT_MSG2, "E-Mot=" & STR$(speed0) oldspeed0 = Slider(Slnr).value END IF Task(%Flex_EMot).freq = 4 END SUB SUB Flex_BackBow () STATIC oldspeed AS LONG STATIC SPEED AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Pi-e" ' brown rim - back bow IF Task(%Flex_BackBow).hParam = %Null THEN MakeTaskParameterDialog %Flex_Backbow,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_Backbow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows EXIT SUB END IF IF ISFALSE Task(%Flex_Backbow).tog THEN oldspeed = 64 Task(%Flex_Backbow).tog = %True END IF IF Slider(Slnr).value <> oldspeed THEN SELECT CASE Slider(Slnr).value CASE < 58 '64 SPEED = 255 - (Slider(Slnr).value * 2) ' so we send values > 127 Flex_Bow 1, SPEED ' back bow - counterclockwize CASE 58 TO 69 '64 Flex_Bow 1,%False CASE > 69 ' >64 SPEED = (Slider(Slnr).value - 64) * 2 SPEED = SPEED AND 127 ' mask bit 7 - so we have values < 128 Flex_Bow 1, SPEED ' backbow runs clockwize ' dll proc. - the real resolution is 8 bits, not seven as used here. END SELECT oldspeed = Slider(Slnr).value END IF Task(%Flex_Backbow).freq = 6 END SUB SUB Flex_FrontBow () STATIC oldspeed AS LONG STATIC SPEED AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="e-Pi" ' orange rim - front bow IF Task(%Flex_FrontBow).hParam = %Null THEN MakeTaskParameterDialog %Flex_Frontbow,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_Frontbow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows EXIT SUB END IF IF ISFALSE Task(%Flex_Frontbow).tog THEN oldspeed = 64 Task(%Flex_Frontbow).tog = %True END IF IF Slider(Slnr).value <> oldspeed THEN SELECT CASE Slider(Slnr).value CASE < 58 '64 SPEED = 255 - (Slider(Slnr).value * 2) ' > 127 Flex_Bow 2, SPEED ' front bow runs counterclockwize CASE 58 TO 69 '64 Flex_Bow 2,%False CASE > 69 ' >64 SPEED = (Slider(Slnr).value - 64) * 2 SPEED = SPEED AND 127 ' mask bit 7 Flex_Bow 2, SPEED ' front bow runs clockwize ' dll proc. - the real resolution is 8 bits, not seven as used here. END SELECT oldspeed = Slider(Slnr).value END IF Task(%Flex_Frontbow).freq = 6 END SUB SUB Flex_PiMotStop () Flex_Bend 1, %False END SUB SUB Flex_eMotStop () Flex_Bend 2, %False END SUB SUB FlexStepperStop () Flex_Bend 1, %False Flex_Bend 2, %False END SUB SUB Flex_BackBowStop () Flex_Bow 1, %False END SUB SUB Flex_FrontBowStop () Flex_Bow 2, %False END SUB SUB Flex_PushBackBow () ' %Flex_PushBackBow - backbowpusher LOCAL velo AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 STATIC old AS DWORD STATIC t AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="e-Pi" IF Task(%Flex_PushBackBow).hParam = %Null THEN MakeTaskParameterDialog %Flex_PushBackBow,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_PushBackBow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows old = 64 EXIT SUB END IF IF ISFALSE Task(%Flex_PushBackBow).tog THEN 'old = 64 Task(%Flex_PushBackBow).tog = %True END IF IF Slider(Slnr).value <> old THEN velo = ABS(Slider(slnr).value - 64) SELECT CASE Slider(Slnr).value CASE < 60 ' e-kant Flex_Beat 10, 255 'velo *4 Flex_PushBow 2, 1 CASE 60 TO 68 SELECT CASE old CASE < 60 ' stond links, dus geven we een extra impuls naar rechts... Flex_Beat 11, 255 CASE > 68 ' stond rechts, dus geven we een extra impuls naar links... Flex_Beat 10, 255 END SELECT Flex_PushBow 2, 3 ' both solenoids - center position CASE > 68 ' naar Pi-blad Flex_Beat 11, 255 'velo *4 Flex_PushBow 2, 2 END SELECT old = Slider(Slnr).value END IF Task(%Flex_PushBackBow).freq = 10 END SUB SUB Flex_PushFrontBow () ' %Flex_PushFrontBow LOCAL velo AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 STATIC old AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="e-Pi" IF Task(%Flex_PushFrontBow).hParam = %Null THEN MakeTaskParameterDialog %Flex_PushFrontBow,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_PushFrontBow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows old = 64 EXIT SUB END IF IF ISFALSE Task(%Flex_PushFrontBow).tog THEN ' old = 64 Task(%Flex_PushFrontBow).tog = %True END IF IF Slider(Slnr).value <> old THEN velo = ABS(Slider(slnr).value - 64) SELECT CASE Slider(Slnr).value CASE < 60 ' naar e-blad kant Flex_Beat 8, 255 'velo *4 Flex_PushBow 1, 1 CASE 60 TO 68 SELECT CASE old CASE < 60 ' stond naar e, dus geven we een extra impuls naar pi... Flex_Beat 9, 255 CASE > 68 ' stond rechts, dus geven we een extra impuls naar links... Flex_Beat 8, 255 END SELECT Flex_PushBow 1, 3 ' both solenoids - center position CASE > 68 ' duw tegen Pi-blad Flex_Beat 9, 255 'velo * 4 Flex_PushBow 1, 2 END SELECT old = Slider(Slnr).value END IF Task(%Flex_PushFrontBow).freq = 10 END SUB SUB Flex_PushBackBowStop () Flex_PushBow 2, %False ' back END SUB SUB Flex_PushFrontBowStop () Flex_PushBow 1, %False ' front END SUB SUB FlexBeaters12 () '%Flex_H12 = 51 ' beaters 1,2 'alternating beating task. STATIC b AS DWORD STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H12).hParam = %Null THEN MakeTaskParameterDialog %Flex_H12,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H12).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat b, Slider(slnr+1).value BIT TOGGLE b, 0 Task(%Flex_H12).freq = Slider(slnr).value / 4 IF Task(%Flex_H12).freq < 0.25 THEN Task(%Flex_H12).freq = 0.25 END SUB SUB FlexBeaters34 () '%Flex_H34 = 52 'alternating beating task. STATIC b AS DWORD STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H34).hParam = %Null THEN MakeTaskParameterDialog %Flex_H34,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H34).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat b+ 2, Slider(slnr+1).value BIT TOGGLE b, 0 Task(%Flex_H34).freq = Slider(slnr).value / 4 IF Task(%Flex_H34).freq < 0.25 THEN Task(%Flex_H34).freq = 0.25 END SUB SUB FlexBeaters56 () '%Flex_H56 = 53 'alternating beating task. STATIC b AS DWORD STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H56).hParam = %Null THEN MakeTaskParameterDialog %Flex_H56,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H56).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat b+4, Slider(slnr+1).value BIT TOGGLE b, 0 Task(%Flex_H56).freq = Slider(slnr).value / 4 IF Task(%Flex_H56).freq < 0.25 THEN Task(%Flex_H56).freq = 0.25 END SUB SUB FlexBeaters78 () '%Flex_H78 = 54 'alternating beating task. STATIC b AS DWORD STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H78).hParam = %Null THEN MakeTaskParameterDialog %Flex_H78,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H78).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat b+ 6, Slider(slnr+1).value BIT TOGGLE b, 0 Task(%Flex_H78).freq = Slider(slnr).value / 4 IF Task(%Flex_H78).freq < 0.25 THEN Task(%Flex_H78).freq = 0.25 END SUB SUB FlexBeater1 () ' frontaal, binnenkant, Pi blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H1).hParam = %Null THEN MakeTaskParameterDialog %Flex_H1,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H1).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 0, Slider(slnr+1).value Task(%Flex_H1).freq = Slider(slnr).value / 4 IF Task(%Flex_H1).freq < 0.25 THEN Task(%Flex_H1).freq = 0.25 END SUB SUB FlexBeater2 () ' frontaal, buitenkant, Pi blad - ' this one still has a hardware fault STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H2).hParam = %Null THEN MakeTaskParameterDialog %Flex_H2,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H2).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 1, Slider(slnr+1).value Task(%Flex_H2).freq = Slider(slnr).value / 4 IF Task(%Flex_H2).freq < 0.25 THEN Task(%Flex_H2).freq = 0.25 END SUB SUB FlexBeater3 () ' frontaal, binnenkant, e blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H3).hParam = %Null THEN MakeTaskParameterDialog %Flex_H3,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H3).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 2, Slider(slnr+1).value Task(%Flex_H3).freq = Slider(slnr).value / 4 IF Task(%Flex_H3).freq < 0.25 THEN Task(%Flex_H3).freq = 0.25 END SUB SUB FlexBeater4 () ' frontaal, buitenkant, e-blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H4).hParam = %Null THEN MakeTaskParameterDialog %Flex_H4,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H4).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 3, Slider(slnr+1).value Task(%Flex_H4).freq = Slider(slnr).value / 4 IF Task(%Flex_H4).freq < 0.25 THEN Task(%Flex_H4).freq = 0.25 END SUB SUB FlexBeater5 () ' achter, binnenkant, e-blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H5).hParam = %Null THEN MakeTaskParameterDialog %Flex_H5,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H5).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 4, Slider(slnr+1).value Task(%Flex_H5).freq = Slider(slnr).value / 4 IF Task(%Flex_H5).freq < 0.25 THEN Task(%Flex_H5).freq = 0.25 END SUB SUB FlexBeater6 () ' achter, buitenkant, e-blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H6).hParam = %Null THEN MakeTaskParameterDialog %Flex_H6,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H6).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 5, Slider(slnr+1).value Task(%Flex_H6).freq = Slider(slnr).value / 4 IF Task(%Flex_H6).freq < 0.25 THEN Task(%Flex_H6).freq = 0.25 END SUB SUB FlexBeater7 () ' achter, binnenkant, Pi blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H7).hParam = %Null THEN MakeTaskParameterDialog %Flex_H7,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H7).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 6, Slider(slnr+1).value Task(%Flex_H7).freq = Slider(slnr).value / 4 IF Task(%Flex_H7).freq < 0.25 THEN Task(%Flex_H7).freq = 0.25 END SUB SUB FlexBeater8 () ' achter, buitenkant, Pi blad STATIC slnr AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " IF Task(%Flex_H8).hParam = %Null THEN MakeTaskParameterDialog %Flex_H8,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_H8).SliderNumbers(0) Flex_Movewindows END IF Flex_Beat 7, Slider(slnr+1).value Task(%Flex_H8).freq = Slider(slnr).value / 4 IF Task(%Flex_H8).freq < 0.25 THEN Task(%Flex_H8).freq = 0.25 END SUB SUB Flex_MoveWindows () LOCAL i AS DWORD LOCAL p AS DWORD LOCAL p1 AS DWORD LOCAL p2 AS DWORD LOCAL x AS DWORD LOCAL y AS DWORD LOCAL xp AS DWORD LOCAL yp AS DWORD LOCAL xc AS DWORD ' cockpit size LOCAL yc AS DWORD ' cockpit size p = %False FOR i = 32 TO 47 IF Task(i).hparam THEN DIALOG GET SIZE Task(i).hparam TO x,y DIALOG UNITS Task(i).hparam,x,y TO PIXELS xp,yp MoveWindow Task(i).hparam,0,p,xp,yp,%True p = p + yp END IF NEXT i p = %False FOR i = 48 TO 63 SELECT CASE i CASE %Flex_BackBow, %Flex_PushBackBow, %Flex_SoftPushBackBow DIALOG GET SIZE gh.cockpit TO x,y DIALOG UNITS gh.cockpit, x,y TO PIXELS xc,yc IF Task(i).hparam THEN DIALOG GET SIZE Task(i).hparam TO x,y DIALOG UNITS Task(i).hParam, x,y TO PIXELS xp,yp IF ISFALSE p1 THEN p1 = yc Movewindow Task(i).hparam,xc,p1,xp,yp,%True p1 = p1 + yp ' does not work: ' if i = %Flex_Backbow then ' dialog set color Task(i).hparam, -1&,%Red ' dialog redraw Task(i).hparam ' end if END IF CASE %Flex_FrontBow, %Flex_PushFrontBow, %Flex_SoftPushFrontBow DIALOG GET SIZE gh.cockpit TO x,y DIALOG UNITS gh.cockpit, x,y TO PIXELS xc,yc IF Task(i).hparam THEN DIALOG GET SIZE Task(i).hparam TO x,y DIALOG UNITS Task(i).hParam, x,y TO PIXELS xp,yp IF ISFALSE p2 THEN p2 = yc Movewindow Task(i).hparam,xc+ xp,p2,xp,yp,%True p2 = p2 + yp ' if i = %Flex_FrontBow then ' dialog set color Task(i).hparam, -1&,%RED ' dialog redraw Task(i).hparam ' end if END IF CASE ELSE IF Task(i).hparam THEN DIALOG GET SIZE Task(i).hparam TO x,y DIALOG UNITS Task(i).hparam,x,y TO PIXELS xp,yp MoveWindow Task(i).hparam,xp,p,xp,yp,%True p = p+yp END IF END SELECT NEXT i END SUB SUB Flex_Vel1() 'frontbow tegen e-blad 'Flex_Beat 8, 255 'velo Flex_SoftShiftBow 1,1, 15 stoptask %Flex_Vel1 END SUB SUB Flex_Vel2() 'frontbow tegen pi-blad 'Flex_Beat 9, 255 'velo Flex_SoftShiftBow 1,2,15 stoptask %Flex_Vel2 END SUB SUB Flex_Vel3() 'backbow tegen e -blad 'Flex_Beat 10, 255 'velo Flex_SoftShiftBow 2,1, 15 Stoptask %Flex_Vel3 END SUB SUB Flex_Vel4() 'backbow tegen Pi-blad 'Flex_Beat 11, 255 'velo Flex_SoftShiftBow 2,2,15 Stoptask %Flex_Vel4 END SUB SUB Flex_SoftPushBackBow () ' %Flex_SoftPushBackBow - backbowpusher LOCAL velo AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 STATIC old AS DWORD STATIC t AS DWORD IF ISFALSE slnr THEN DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="e-Pi" IF Task(%Flex_SoftPushBackBow).hParam = %Null THEN MakeTaskParameterDialog %Flex_SoftPushBackBow,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_SoftPushBackBow).SliderNumbers(0) Slider(Slnr).value = 64 old = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows EXIT SUB END IF IF ISFALSE Task(%Flex_SoftPushBackBow).tog THEN Task(%Flex_SoftPushBackBow).tog = %True END IF IF TimeGetTime < t THEN EXIT SUB ' Flex_SoftshiftBow 2,1, %False ' Flex_SoftShiftBow 2,2, %False END IF IF Slider(Slnr).value <> old THEN velo = ABS(Slider(slnr).value - 64) SELECT CASE Slider(Slnr).value CASE < 60 ' e-kant ' Flex_Beat 10,255 'velo *4 ' old code for normal pushers - done in DLL Flex_SoftShiftBow 2,1, 15 'MAX(MIN(velo / 4,15),1) ' new t = TimeGetTime + 600 '@pFlex.backbowpos = %Flex_eSaw CASE 60 TO 68 ' SELECT CASE old ' CASE < 60 ' ' stond links, dus geven we een extra impuls naar rechts... ' Flex_Beat 11, 255 ' CASE > 68 ' ' stond rechts, dus geven we een extra impuls naar links... ' Flex_Beat 10, 255 ' CASE ELSE ' Flex_Pushbow 2,3 ' both solenoids - center position ' END SELECT 'Flex_PushBow 2, 3 ' both solenoids - center position - old code ' Flex_Pushbow 2, %False ' inactivate the vertical pushers Flex_SoftShiftBow 2, 3, 15 ' new t = TimeGetTime + 1200 '@pFlex.backBowPos = %Flex_Center CASE > 68 ' naar Pi-blad ' Flex_Beat 11, 255 'velo *4 ' Flex_PushBow 2, 2 ' Flex_SoftShiftBow 2,1, %False Flex_SoftShiftBow 2,2, 15 'MAX(MIN(velo / 4,15),1) ' new t = TimeGetTime + 600 '@pFlex.backbowpos = %Flex_PiSaw END SELECT old = Slider(Slnr).value END IF Task(%Flex_SoftPushBackBow).freq = 4 END SUB SUB Flex_SoftPushFrontBow () ' %Flex_SoftPushFrontBow LOCAL velo AS LONG STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 STATIC old AS DWORD STATIC t AS DWORD IF ISFALSE slnr THEN old = 64 DIM TaskParamLabels(0) AS STATIC ASCIIZ*8 TaskParamLabels(0)="e-Pi" IF Task(%Flex_SoftPushFrontBow).hParam = %Null THEN MakeTaskParameterDialog %Flex_SoftPushFrontBow,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_SoftPushFrontBow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Flex_Movewindows EXIT SUB END IF IF ISFALSE Task(%Flex_SoftPushFrontBow).tog THEN Task(%Flex_SoftPushFrontBow).tog = %True END IF IF TimeGetTime < t THEN EXIT SUB END IF IF Slider(Slnr).value <> old THEN velo = ABS(Slider(slnr).value - 64) SELECT CASE Slider(Slnr).value CASE < 60 ' naar e-blad kant 'Flex_Beat 8, 255 'velo *4 - done in dll Flex_SoftShiftBow 1,1, 15 'MAX(MIN(velo / 4,15),1) t = TimeGetTime + 600 ' @pFlex.frontbowpos = %Flex_eSaw CASE 60 TO 68 ' SELECT CASE old ' CASE < 60 ' ' stond naar e, dus geven we een extra impuls naar pi... ' Flex_Beat 9, 255 ' CASE > 68 ' ' stond rechts, dus geven we een extra impuls naar links... ' Flex_Beat 8, 255 ' CASE ELSE ' Flex_PushBow 1,3 ' both solenoids - center position ' END SELECT Flex_SoftShiftBow 1,3, 15 t = TimeGetTime + 1200 ' @pFlex.frontbowpos = %Flex_Center CASE > 68 ' duw tegen Pi-blad ' Flex_Beat 9, 255 Flex_SoftShiftBow 1,2, 15 'MAX(MIN(velo / 4,15), 1) t = TimeGetTime + 600 ' @pFlex.frontbowpos = %Flex_PiSaw END SELECT old = Slider(Slnr).value END IF Task(%Flex_SoftPushFrontBow).freq = 4 END SUB SUB Flex_SoftPushBackBowStop () Flex_PushBow 2, %False ' back Flex_SoftShiftBow 2, %False, %False END SUB SUB Flex_SoftPushFrontBowStop () Flex_PushBow 1, %False ' front Flex_SoftShiftBow 1, %False, %False END SUB SUB Flexing () ' demo piece for the functions of flex. STATIC epos AS INTEGER STATIC pipos AS INTEGER LOCAL t AS DWORD STATIC ecnt AS DWORD STATIC picnt AS DWORD STATIC r1cnt AS DWORD STATIC r2cnt AS DWORD LOCAL SPEED AS DWORD IF ISFALSE Task(%Flexing).tog THEN epos = 0 pipos = 0 ecnt = 3 picnt = 4 r1cnt = 2 r2cnt = 3 Task(%Flexing).freq = 1 Task(%Flexing).tog = %True END IF t = TimeGetTime / 1000 ' bows: IF ISFALSE t MOD ecnt THEN SELECT CASE @pFlex.frontbowpos CASE %Flex_PiSaw, %False IF @pFlex.backbowpos <> %Flex_eSaw THEN Flex_SoftShiftBow 1,1,15 'to e-saw END IF CASE %Flex_eSaw, %Flex_Center IF @pFlex.backbowpos <> %Flex_PiSaw THEN Flex_SoftShiftBow 1,2,15 ' to pi saw END IF END SELECT INCR ecnt IF ecnt > 17 THEN ecnt = 3 END IF IF ISFALSE t MOD picnt THEN SELECT CASE @pFlex.backbowpos CASE %Flex_ESaw, %False IF @pFlex.frontbowpos <> %Flex_PiSaw THEN Flex_SoftShiftBow 2,2,15 ' to pi-saw END IF CASE %Flex_PiSaw, %Flex_Center IF @pFlex.frontbowpos <> %Flex_eSaw THEN Flex_SoftShiftBow 2,1,15 END IF END SELECT INCR picnt IF picnt > 19 THEN picnt = 3 END IF IF ISFALSE t MOD r1cnt THEN SPEED = 30 + (RND(1) * 50) SELECT CASE @pFlex.frontbowpos CASE %Flex_Pisaw Flex_Bow 2, SPEED CASE %Flex_eSaw Flex_Bow 2, 127 + SPEED CASE ELSE Flex_Bow 2,%False END SELECT INCR r1cnt IF r1cnt > 13 THEN r1cnt = 2 END IF IF ISFALSE t MOD r2cnt THEN SPEED = 30 + (RND(1) * 50) SELECT CASE @pFlex.backbowpos CASE %Flex_Pisaw Flex_Bow 1, SPEED CASE %Flex_eSaw Flex_Bow 1, 127 + SPEED CASE ELSE Flex_Bow 1,%False END SELECT INCR r2cnt IF r2cnt > 11 THEN r2cnt = 3 END IF IF ISFALSE t MOD 37 THEN IF epos = @pFlex.epos THEN epos = epos + (RND(1) * 20) IF epos >= 100 THEN epos = 100 - (RND(1) * 20) END IF END IF ELSEIF ISFALSE t MOD 41 THEN IF @pFlex.epos < 20 THEN Flex_Beat 2, 60 + (RND(1) * 63) ' front - eblad klopper ELSE Flex_Beat 4, 60 + (RND(1) * 63) ' back - eblad klopper END IF ELSEIF ISFALSE t MOD 43 THEN IF pipos = @pFlex.pipos THEN pipos = pipos + (RND(1) * 20) IF pipos >= 100 THEN pipos = 100 - (RND(1) * 20) END IF END IF ELSEIF ISFALSE t MOD 47 THEN IF @pFlex.epos < 20 THEN Flex_Beat 3, 60 + (RND(1) * 63) ' front - eblad klopper ELSE Flex_Beat 5, 60 + (RND(1) * 63) ' back - eblad klopper END IF ELSEIF ISFALSE t MOD 53 THEN IF epos = @pFlex.epos THEN epos = epos - (RND(1) * 20) IF epos <= 0 THEN epos = (RND(1) * 20) END IF END IF ELSEIF ISFALSE t MOD 59 THEN IF @pFlex.pipos < 20 THEN Flex_Beat 0, 60 + (RND(1) * 63) ' front - piblad klopper ELSE Flex_Beat 6, 60 + (RND(1) * 63) ' back - piblad klopper END IF ELSEIF ISFALSE t MOD 61 THEN IF pipos = @pFlex.pipos THEN pipos = pipos - (RND(1) * 20) IF pipos <= 0 THEN pipos = (RND(1) * 20) END IF END IF ELSEIF ISFALSE t MOD 67 THEN IF @pFlex.pipos < 20 THEN Flex_Beat 1, 60 + (RND(1) * 63) ' front - piblad klopper ELSE Flex_Beat 7, 60 + (RND(1) * 63) ' back - piblad klopper END IF ELSEIF ISFALSE t MOD 71 THEN Flex_SoftShiftBow 1,3,15 ' center ELSEIF ISFALSE t MOD 73 THEN Flex_SoftShiftBow 2,3,15 ' center ELSEIF ISFALSE t MOD 79 THEN ELSEIF ISFALSE t MOD 83 THEN ELSEIF ISFALSE t MOD 89 THEN ELSEIF ISFALSE t MOD 97 THEN ' largest prime smaller then 100 ] ELSE EXIT SUB END IF IF epos <> @pFlex.epos THEN IF ISFALSE Task(%Flex_eRotTask).swit THEN Task(%Flex_eRotTask).level = epos starttask %Flex_eRotTask END IF END IF IF pipos <> @pFlex.pipos THEN IF ISFALSE Task(%Flex_PiRotTask).swit THEN Task(%Flex_PiRotTask).level = Pipos starttask %Flex_PiRotTask END IF END IF END SUB SUB Flexing_Start () ' startup code for Flex_SoftshiftBow 1,3,15 Flex_SoftshiftBow 2,3,15 END SUB SUB Flexing_Stop () Flex_Reset END SUB FUNCTION Flex_Reset(OPT BYVAL abort AS LONG) AS LONG STATIC tt AS DWORD STATIC beeindig AS LONG LOCAL hw AS LONG LOCAL cnt AS DWORD IF abort = -1 THEN beeindig = %true IF (ISFALSE beeindig) AND (tt > 0) THEN EXIT FUNCTION Stoptask %Flex_PiMot Stoptask %Flex_eMot Stoptask %Flex_PiMotPos Stoptask %Flex_eMotPos StopTask @pFlex.ListenTask Flex_PushBow 1, %False ' front Flex_SoftShiftBow 1, %False, %False Flex_PushBow 2, %False ' back Flex_SoftShiftBow 2, %False, %False Flex_Bow 1, %False Flex_Bow 2, %False Task(%Flex_PirotTask).level = 0 Task(%Flex_ErotTask).level = 0 @pflex.epos = 126 'force a complete reset, whatever the values where @pflex.pipos = 126 StartTask %Flex_PirotTask StartTask %Flex_ErotTask tt = timegettime + 105000 DIALOG NEW gh.cockpit, "Please wait while Flex is resetting", 1, 1, 200, 200 TO hw CONTROL ADD LABEL, hw, 1, "Please wait while Flex is resetting", 5, 5, 190, 12 CONTROL ADD LABEL, hw, 2, "", 5, 20, 190, 12 CONTROL ADD BUTTON, hw, 3, "If the blades are completely stretched you can click hereto stop the reset process", _ 5, 150, 190, 42, %BS_CENTER OR %BS_MULTILINE CALL Flex_AbortReset DIALOG SHOW MODELESS hw DO IF beeindig THEN EXIT LOOP INCR cnt IF ISFALSE (cnt MOD 10000) THEN DIALOG DOEVENTS CONTROL SET TEXT hw, 2, FORMAT$((tt - timegettime)/1000, "0000.00") + " seconds to go.." DIALOG DOEVENTS DIALOG DOEVENTS END IF SLEEP 0 LOOP WHILE tt > timegettime DIALOG END hw tt = %false @pflex.epos = 0 @pflex.pipos = 0 beeindig = 0 StartTask @pFlex.listentask FUNCTION = %true END FUNCTION CALLBACK FUNCTION Flex_AbortReset IF (CBMSG <> %WM_COMMAND) OR (CBCTLMSG <> %BN_CLICKED) THEN EXIT FUNCTION Flex_Reset -1 END FUNCTION SUB Flex_Messagehandler () ' for remote controlled playing of pieces. ' called from the flex listen task in the dll. LOCAL i AS LONG STATIC CurrentPiece AS LONG LOCAL msg AS WORD LOCAL value AS BYTE msg = @pFlex.messagevalue value = LOBYT(msg) SELECT CASE HIBYT(msg) CASE HIBYT(%WSB_CHANGE_PIECE) ' = 5 want %WSB_CHANGE_PIECE = &H500 SELECT CASE value CASE %False IF Currentpiece THEN StopTask Currentpiece Currentpiece = %False END IF CASE %Flexing IF ISFALSE Task(%Flexing).swit THEN starttask %Flexing Currentpiece = %Flexing END SELECT CASE HIBYT(%WSB_CHANGE_VELO) '... SELECT CASE value END SELECT CASE HIBYT(%WSB_CHANGE_DENSITY) '... SELECT CASE value END SELECT CASE HIBYT(%WSB_CHANGE_SPEED) ' ... SELECT CASE value END SELECT END SELECT END SUB