' ****************************************** ' * * ' * 2014 - 2019 * ' * test and evaluation code * ' * Prof.dr.Godfried-Willem Raes * ' * belongs to the slagwerk compilation * ' ****************************************** ' robots for Ballet Mechanique by George Antheil ' 06.01.2014: first coding. ' 08.01.2014: Propeller 1 ready for testing. ' 07.03.2015: Propeller 2 board ready for testing. ' 27.03.2015: Propeller 2 ready and Prop 3 ready for testing. ' 30.03.2015: Bello test code added. ' 02.04.2015: Bello lites test added. ' 07.04.2015: All firmware for Bello upgraded. ' new velo lookups and periodity lookups. ' 14.05.2015: Prop1 hardware changed. ' 03.06.2015: Changes in : new bells added, firmware changed. ' odd behaviour on test board... ' 19.07.2015: all firmware checked. Should be fine now. ' 29.08.2017: procedures added for ' 07.12.2018: implementation changed. Now uses channel 15. ' 08.12.2018: resources upgraded to include Balsi. ' 04.01.2019: further components added for Balsi ' 05.01.2019: claxon test added ' Wersi horn added ' 10.01.2019: Third siren added, note 25 ' note repeats added for orange light and horns. %Propeller1 = 32 ' note 40 %Propeller1_Speed = 33 %Propeller1_lites = 34 %Propeller2 = 35 ' note 38 %Propeller2_Speed = 36 %Propeller2_lites = 37 %Propeller3 = 38 ' note 36 %Propeller3_Speed = 39 %Propeller3_lites = 40 %Balmec_Bells = 42 %Bello_lites = 43 %bello_repeats =44 %bello_Board1 = 45 %bello_Board2 = 46 %bello_Board3 = 47 %Balsi_Siren = 48 ' - large siren motorboard1 - pw1 %Balsi_Siren2 = 49 ' medium siren note 24 motorboard2 - pw1 %Balsi_siren3 = 50 ' small siren note 25 motorboard2 - pw3 %Balsi_Horn1 = 51 ' note 96 hub %Balsi_Horn2 = 52 ' note 97 hub %Balsi_GreyHorn = 53 ' note 99 Werma motorboard2 %Balsi_Claxon = 54 ' note 98 motorboard1 %Balsi_Bell = 55 ' motor bell note 28 motorboard2 - pw2 %Balsi_Blue = 56 ' note 122 hub %Balsi_RotOrange = 57 ' note 120 hub %Balsi_Pinkers = 58 ' notes 123, 124 hub DECLARE FUNCTION Init_Balmec () AS LONG DECLARE SUB Propeller1 () DECLARE SUB Propeller1_Speed () DECLARE SUB Propeller1_Speed_Stop () DECLARE SUB Propeller1_Lites () DECLARE SUB Propeller1_Lites_Stop () DECLARE SUB Propeller2 () DECLARE SUB Propeller2_Speed () DECLARE SUB Propeller2_Speed_Stop () DECLARE SUB Propeller2_Lites () DECLARE SUB Propeller2_Lites_Stop () DECLARE SUB Propeller3 () DECLARE SUB Propeller3_Speed () DECLARE SUB Propeller3_Speed_Stop () DECLARE SUB Propeller3_Lites () DECLARE SUB Propeller3_Lites_Stop () DECLARE SUB Balmec_Bells () DECLARE SUB Balmec_Bells_Stop () DECLARE SUB Bello_repeats() DECLARE SUB Balme_controlroom() DECLARE SUB Bello_lites () DECLARE SUB bello_board1 () DECLARE SUB bello_board2 () DECLARE SUB bello_board3 () DECLARE SUB Balsi_Siren () ' 2018-2019 DECLARE SUB Balsi_Siren_stop () DECLARE SUB Balsi_Horns () DECLARE SUB Balsi_Horns_Stop () DECLARE SUB Balsi_RotOrange () DECLARE SUB Balsi_Rotorange_Stop () DECLARE SUB Balsi_Pinkers () DECLARE SUB Balsi_Pinkers_Stop () DECLARE SUB Balsi_Blue () DECLARE SUB balsi_Blue_Stop () DECLARE SUB Balsi_Siren2 () DECLARE SUB Balsi_Siren2_Stop () DECLARE SUB Balsi_Siren3 () DECLARE SUB Balsi_Siren3_Stop () DECLARE SUB Balsi_Bell () DECLARE SUB Balsi_Bell_Stop () DECLARE SUB Balsi_Claxon () DECLARE SUB Balsi_Claxon_Stop () DECLARE SUB Balsi_Greyhorn () DECLARE SUB Balsi_Greyhorn_Stop () GLOBAL hwCtrlBalmec AS DWORD FUNCTION Init_Balmec () AS LONG LOCAL retval AS LONG LOCAL m AS ASCIIZ * 20 LOCAL i AS LONG m = " test code" Sendmessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' cockpit titel ' hardware tests: Task(%Propeller1).naam = "SmallProp" Task(%Propeller1).cptr = CODEPTR(Propeller1) Task(%Propeller1).freq = 1 Task(%Propeller1).flags = %False TaskEX(%Propeller1).stopcptr = CODEPTR(Propeller1_Speed_Stop) Task(%Propeller1_Speed).naam = "RPM_1" Task(%Propeller1_Speed).cptr = CODEPTR(Propeller1_Speed) Task(%Propeller1_Speed).freq = 1 Task(%Propeller1_Speed).flags = %False TaskEX(%Propeller1_Speed).stopcptr = CODEPTR(Propeller1_Speed_Stop) Task(%Propeller1_lites).naam = "Lites1" Task(%Propeller1_lites).cptr = CODEPTR(Propeller1_lites) Task(%Propeller1_lites).freq = 4 Task(%Propeller1_lites).flags = %False TaskEX(%Propeller1_lites).stopcptr = CODEPTR(Propeller1_Lites_Stop) Task(%Propeller2).naam = "Prop_2" Task(%Propeller2).cptr = CODEPTR(Propeller2) Task(%Propeller2).freq = 1 Task(%Propeller2).flags = %False TaskEX(%Propeller2).stopcptr = CODEPTR(Propeller2_Speed_Stop) Task(%Propeller2_Speed).naam = "RPM_2" Task(%Propeller2_Speed).cptr = CODEPTR(Propeller2_Speed) Task(%Propeller2_Speed).freq = 1 Task(%Propeller2_Speed).flags = %False TaskEX(%Propeller2_Speed).stopcptr = CODEPTR(Propeller2_Speed_Stop) Task(%Propeller2_lites).naam = "Lites2" Task(%Propeller2_lites).cptr = CODEPTR(Propeller2_lites) Task(%Propeller2_lites).freq = 4 Task(%Propeller2_lites).flags = %False TaskEX(%Propeller2_lites).stopcptr = CODEPTR(Propeller2_Lites_Stop) Task(%Propeller3).naam = "Prop_3" Task(%Propeller3).cptr = CODEPTR(Propeller3) Task(%Propeller3).freq = 1 Task(%Propeller3).flags = %False TaskEX(%Propeller3).stopcptr = CODEPTR(Propeller3_Speed_Stop) Task(%Propeller3_Speed).naam = "RPM_3" Task(%Propeller3_Speed).cptr = CODEPTR(Propeller3_Speed) Task(%Propeller3_Speed).freq = 1 Task(%Propeller3_Speed).flags = %False TaskEX(%Propeller3_Speed).stopcptr = CODEPTR(Propeller3_Speed_Stop) Task(%Propeller3_lites).naam = "Lites3" Task(%Propeller3_lites).cptr = CODEPTR(Propeller3_lites) Task(%Propeller3_lites).freq = 4 Task(%Propeller3_lites).flags = %False TaskEX(%Propeller3_lites).stopcptr = CODEPTR(Propeller3_Lites_Stop) ' tests for : Task(%Balmec_Bells).cptr = CODEPTR(Balmec_Bells) Task(%Balmec_Bells).naam = "Bells" Task(%Balmec_Bells).freq = 1 Task(%Balmec_Bells).flags = %False TaskEX(%Balmec_Bells).stopcptr = CODEPTR(Balmec_Bells_Stop) Task(%Bello_lites).cptr = CODEPTR(Bello_lites) Task(%Bello_lites).naam = "BelLite" Task(%Bello_lites).freq = 10 Task(%Bello_lites).flags = %False TaskEX(%Bello_lites).stopcptr = CODEPTR(Balmec_Bells_Stop) Task(%Bello_repeats).cptr = CODEPTR(Bello_Repeats) Task(%Bello_repeats).naam = "Repeats" Task(%Bello_repeats).freq = 50 ButnSW(7).tag0 = "BalmecCtrl tog" ButnSW(7).tag1 = "BalmecCtrl tog" ButnSW(7).cptr = CODEPTR(Balmec_Controlroom) ButnSW(8).tag0 = "CC30" ButnSW(8).tag1 = "CC30 tog" ButnSW(8).cptr = CODEPTR(Balmec_Cc30) Task(%Bello_board1).cptr = CODEPTR(Bello_board1) Task(%Bello_board1).naam = "Puls1" Task(%Bello_board1).freq = 1 Task(%Bello_board1).flags = %False Task(%Bello_board2).cptr = CODEPTR(Bello_board2) Task(%Bello_board2).naam = "Puls2" Task(%Bello_board2).freq = 1 Task(%Bello_board2).flags = %False Task(%Bello_board3).cptr = CODEPTR(Bello_board3) Task(%Bello_board3).naam = "Puls3" Task(%Bello_board3).freq = 1 Task(%Bello_board3).flags = %False ' tasks for , Balmec siren, added 2018-2019 Task(%Balsi_Siren).cptr = CODEPTR(Balsi_Siren) Task(%Balsi_Siren).naam = "Siren" Task(%Balsi_Siren).freq = 20 Task(%Balsi_Siren).flags = %False TaskEX(%Balsi_Siren).stopcptr = CODEPTR(Balsi_Siren_Stop) Task(%Balsi_Horn1).cptr = CODEPTR(Balsi_Horn1) Task(%Balsi_Horn1).naam = "Horn1" Task(%Balsi_Horn1).freq = 2 Task(%Balsi_Horn1).flags = %False TaskEX(%Balsi_Horn1).stopcptr = CODEPTR(Balsi_Horn1_Stop) Task(%Balsi_Horn2).cptr = CODEPTR(Balsi_Horn2) Task(%Balsi_Horn2).naam = "Horn2" Task(%Balsi_Horn2).freq = 2 Task(%Balsi_Horn2).flags = %False TaskEX(%Balsi_Horn2).stopcptr = CODEPTR(Balsi_Horn2_Stop) Task(%Balsi_Rotorange).cptr = CODEPTR(Balsi_RotOrange) Task(%Balsi_Rotorange).naam = "RotOran" Task(%Balsi_Rotorange).freq = 20 Task(%Balsi_Rotorange).flags = %False TaskEX(%Balsi_Rotorange).stopcptr = CODEPTR(Balsi_Rotorange_Stop) Task(%Balsi_Pinkers).cptr = CODEPTR(Balsi_Pinkers) Task(%Balsi_Pinkers).naam = "Pinkers" Task(%Balsi_Pinkers).freq = 2 Task(%Balsi_Pinkers).flags = %False TaskEX(%Balsi_Pinkers).stopcptr = CODEPTR(Balsi_Pinkers_Stop) Task(%Balsi_Blue).cptr = CODEPTR(Balsi_Blue) Task(%Balsi_Blue).naam = "RotBlue" Task(%Balsi_Blue).freq = 2 Task(%Balsi_Blue).flags = %False TaskEX(%Balsi_Blue).stopcptr = CODEPTR(Balsi_Blue_Stop) Task(%Balsi_Siren2).cptr = CODEPTR(Balsi_Siren2) Task(%Balsi_Siren2).naam = "Siren2" Task(%Balsi_Siren2).freq = 20 Task(%Balsi_Siren2).flags = %False TaskEX(%Balsi_Siren2).stopcptr = CODEPTR(Balsi_Siren2_Stop) Task(%Balsi_Siren3).cptr = CODEPTR(Balsi_Siren3) Task(%Balsi_Siren3).naam = "Siren3" Task(%Balsi_Siren3).freq = 20 Task(%Balsi_Siren3).flags = %False TaskEX(%Balsi_Siren3).stopcptr = CODEPTR(Balsi_Siren3_Stop) Task(%Balsi_Bell).cptr = CODEPTR(Balsi_Bell) Task(%Balsi_Bell).naam = "Bell" Task(%Balsi_Bell).freq = 2 Task(%Balsi_Bell).flags = %False TaskEX(%Balsi_Bell).stopcptr = CODEPTR(Balsi_Bell_Stop) Task(%Balsi_Claxon).cptr = CODEPTR(Balsi_Claxon) Task(%Balsi_Claxon).naam = "Klakson" Task(%Balsi_Claxon).freq = 2 Task(%Balsi_Claxon).flags = %False TaskEX(%Balsi_Claxon).stopcptr = CODEPTR(Balsi_Claxon_Stop) Task(%Balsi_Greyhorn).cptr = CODEPTR(Balsi_Greyhorn) Task(%Balsi_Greyhorn).naam = "Werma" Task(%Balsi_Greyhorn).freq = 2 Task(%Balsi_Greyhorn).flags = %False TaskEX(%Balsi_Greyhorn).stopcptr = CODEPTR(Balsi_Greyhorn_Stop) MM_Balmec_On ' send ctrl 66 MM_Balsi_On FUNCTION = %True END FUNCTION SUB Propeller1 () ' test propeller 1 - small propeller ' on/off test with speed control STATIC cnt AS INTEGER LOCAL velo, brake AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Propeller1).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Speed" TaskParamLabels(2) = "Brake" IF ISFALSE Task(%Propeller1).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller1,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller1).SliderNumbers(0) Task(%Propeller1).freq = 1 Slider(slnr).value = Task(%propeller1).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low speed on init. SendMessage Slider(slnr+2).h, %TBM_SETPOS,%True, 0 ' no braking on init END IF ' MM_Balmec_On RESET cnt Task(%Propeller1).tog = %True END IF IF ISFALSE cnt MOD 2 THEN velo = Slider(slnr+1).value mPlay Balmec.channel, 40, velo ELSE brake = Slider(slnr+2).value Release Balmec.channel, 40, brake 'mPlay Balmec.channel, 40, %False END IF INCR cnt Task(%Propeller1).freq = 0.05 +((Slider(slnr).value) / 64!) END SUB SUB Propeller2 () ' test propeller 2 - large wood propeller ' on/off test with speed control STATIC cnt AS INTEGER LOCAL velo AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Propeller2).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Speed" IF ISFALSE Task(%Propeller2).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller2,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller2).SliderNumbers(0) Task(%Propeller2).freq = 1 Slider(slnr).value = Task(%propeller2).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low speed on init. END IF ' MM_Balmec_On RESET cnt Task(%Propeller2).tog = %True END IF IF ISFALSE cnt MOD 2 THEN velo = Slider(slnr+1).value mPlay Balmec.channel, 38, velo ELSE mPlay Balmec.channel, 38, %False END IF INCR cnt Task(%Propeller2).freq = 0.05 +((Slider(slnr).value) / 64!) END SUB SUB Propeller3 () ' test propeller 3 - large metal propeller ' on/off test with speed control STATIC cnt AS INTEGER LOCAL velo, brake AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Propeller3).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Speed" TaskParamLabels(2) = "Brake" IF ISFALSE Task(%Propeller3).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller3,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller3).SliderNumbers(0) Task(%Propeller3).freq = 1 Slider(slnr).value = Task(%propeller3).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low speed on init. SendMessage Slider(slnr+2).h, %TBM_SETPOS, %True, 0 ' no braking on init END IF MM_Balmec_On RESET cnt Task(%Propeller3).tog = %True END IF IF ISFALSE cnt MOD 2 THEN velo = Slider(slnr+1).value mPlay Balmec.channel, 36, velo ELSE brake = Slider(slnr+2).value Release Balmec.channel, 36, brake ' added 14.05.2015 END IF INCR cnt Task(%Propeller3).freq = 0.05 +((Slider(slnr).value) / 64!) END SUB SUB Propeller1_Speed () ' kontinu test STATIC slnr, rpm AS LONG IF ISFALSE Task(%Propeller1_Speed).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Propeller1_Speed).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller1_Speed,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller1_Speed).SliderNumbers(0) Slider(slnr).value = 0 rpm = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, rpm END IF Task(%Propeller1_Speed).freq = 20 Task(%Propeller1_Speed).tog = %True END IF IF Slider(slnr).value <> rpm THEN mPlay Balmec.channel, 40, Slider(slnr).value rpm = Slider(slnr).value END IF END SUB SUB Propeller1_Speed_Stop () NoteOff Balmec.channel, 40 END SUB SUB Propeller1_lites () ' to test autoflashing. 'STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC vel1, vel2 AS DWORD IF ISFALSE Task(%Propeller1_Lites).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo1" TaskParamlabels(1) = "Tempo2" IF ISFALSE Task(%Propeller1_lites).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller1_lites,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller1_lites).SliderNumbers(0) Task(%Propeller1_lites).freq = 4 Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 100 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF 'cnt = %False Task(%Propeller1_lites).tog = %True END IF IF vel1 <> Slider(slnr).value THEN mPlay Balmec.channel, 120, Slider(slnr).value vel1 = Slider(slnr).value END IF IF vel2 <> Slider(slnr+1).value THEN mPlay Balmec.channel, 121, Slider(slnr+1).value vel2 = Slider(slnr+1).value END IF END SUB SUB Propeller1_lites_Stop () NoteOff Balmec.channel, 120 NoteOff Balmec.channel, 121 END SUB SUB Propeller2_Speed () ' kontinu test STATIC slnr, rpm AS LONG IF ISFALSE Task(%Propeller2_Speed).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Propeller2_Speed).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller2_Speed,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller2_Speed).SliderNumbers(0) Slider(slnr).value = 0 rpm = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, rpm END IF Task(%Propeller2_Speed).freq = 20 Task(%Propeller2_Speed).tog = %True END IF IF Slider(slnr).value <> rpm THEN mPlay Balmec.channel, 38, Slider(slnr).value rpm = Slider(slnr).value END IF END SUB SUB Propeller2_Speed_Stop () NoteOff Balmec.channel, 38 END SUB SUB Propeller2_lites () ' to test autoflashing. STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC vel1, vel2 AS DWORD IF ISFALSE Task(%Propeller2_Lites).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo1" TaskParamlabels(1) = "Tempo2" IF ISFALSE Task(%Propeller2_lites).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller2_lites,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller2_lites).SliderNumbers(0) Task(%Propeller2_lites).freq = 4 Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 100 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF cnt = %False Task(%Propeller2_lites).tog = %True END IF IF vel1 <> Slider(slnr).value THEN mPlay Balmec.channel, 122, Slider(slnr).value vel1 = Slider(slnr).value END IF IF vel2 <> Slider(slnr+1).value THEN mPlay Balmec.channel, 123, Slider(slnr+1).value vel2 = Slider(slnr+1).value END IF END SUB SUB Propeller2_lites_Stop () NoteOff Balmec.channel, 122 NoteOff Balmec.channel, 123 END SUB SUB Propeller3_Speed () ' kontinu test ' grote metalen propeller, 1.5kW motor. STATIC slnr, rpm AS LONG IF ISFALSE Task(%Propeller3_Speed).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Propeller3_Speed).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller3_Speed,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller3_Speed).SliderNumbers(0) Slider(slnr).value = 0 rpm = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, rpm END IF Task(%Propeller3_Speed).freq = 20 Task(%Propeller3_Speed).tog = %True END IF IF Slider(slnr).value <> rpm THEN mPlay Balmec.channel, 36, Slider(slnr).value rpm = Slider(slnr).value END IF END SUB SUB Propeller3_Speed_Stop () NoteOff Balmec.channel, 36 END SUB SUB Propeller3_lites () ' to test autoflashing. STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC vel1, vel2 AS DWORD IF ISFALSE Task(%Propeller3_Lites).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo1" TaskParamlabels(1) = "Tempo2" IF ISFALSE Task(%Propeller3_lites).hParam THEN slnr = %False MakeTaskParameterDialog %Propeller3_lites,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Propeller3_lites).SliderNumbers(0) Task(%Propeller3_lites).freq = 4 Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 100 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF cnt = %False Task(%Propeller3_lites).tog = %True END IF IF vel1 <> Slider(slnr).value THEN mPlay Balmec.channel, 124, Slider(slnr).value vel1 = Slider(slnr).value END IF IF vel2 <> Slider(slnr+1).value THEN mPlay Balmec.channel, 125, Slider(slnr+1).value vel2 = Slider(slnr+1).value END IF END SUB SUB Propeller3_lites_Stop () NoteOff Balmec.channel, 124 NoteOff Balmec.channel, 125 END SUB SUB Balmec_Bells () ' this is mapped on the midi note range 51-96 ' rewritten for the bell machine ' as yet, the note range is discontinuous: ' 51, [55], 57 (69), 60, 64, 67, 85, 87, 88, 89 ' 03.06.2015: Updated for changes in firmware. STATIC cnt AS DWORD STATIC slnr, udnr AS DWORD STATIC noot, velo, rep AS BYTE DIM reps(127) AS STATIC BYTE IF ISFALSE Task(%Balmec_Bells).tog THEN DIM TaskParamLabels(4) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" TaskParamlabels(2) = "RepRat" TaskParamLabels(3) = "Note" TaskParamLabels(4) = "66" IF ISFALSE Task(%Balmec_Bells).hParam THEN slnr = %False MakeTaskParameterDialog %Balmec_Bells,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balmec_Bells).SliderNumbers(0) Slider(slnr).value = 8 Task(%Balmec_Bells).freq = 1 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' velo's SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value RESET velo Slider(slnr+2).value = 0 ' repetition rate SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%Balmec_Bells).UpdownNumbers(0)).cptr = CODEPTR(Bello_Note_UD1) ' note UDctrl(TaskEX(%Balmec_Bells).UpDownNumbers(0)).value = 51 UDctrl(TaskEX(%Balmec_Bells).UpDownNumbers(0)).minval = 51 UDctrl(TaskEX(%Balmec_Bells).UpDownNumbers(0)).maxval = 96 udnr = TaskEX(%Balmec_Bells).UpDownNumbers(0) UDctrl(TaskEX(%Balmec_Bells).UpdownNumbers(1)).cptr = CODEPTR(Bello_CC66_UD2) ' on/off UDctrl(TaskEX(%Balmec_Bells).UpDownNumbers(1)).value = 0 UDctrl(TaskEX(%Balmec_Bells).UpDownNumbers(1)).minval = 0 UDctrl(TaskEX(%Balmec_Bells).UpDownNumbers(1)).maxval = 1 END IF cnt = %False noot = 51 IF ISFALSE Balmec.ctrl(66) THEN Controller Balmec.channel, 66, 64 Balmec.ctrl(66) = 64 END IF Task(%Balmec_Bells).tog = %True END IF IF slider(slnr+2).value <> reps(noot) THEN reps(noot) = Slider(slnr+2).value KeyPress Balmec.channel, noot, reps(noot) END IF IF ISFALSE cnt THEN mPlay Balmec.channel, noot, Slider(slnr+1).value ' note ON cnt = %True ELSE NoteOff Balmec.channel, noot noot = UDCtrl(udnr).value cnt = %False END IF Task(%Balmec_Bells).freq = MAX((Slider(slnr).value) / 8!, 0.125) END SUB SUB Bello_Note_UD1 () ' controls the note to be played. LOCAL noot AS BYTE STATIC oldnoot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Balmec_Bells).UpDownNumbers(0) noot = UDCtrl(udnr).value SetDlgItemText Task(%Balmec_Bells).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Bello_CC66_UD2 () ' controller 66 LOCAL udnr, value AS DWORD udnr = TaskEX(%Balmec_Bells).UpDownNumbers(1) value = UDCtrl(udnr).value Controller Balmec.channel, 66, value Balmec.ctrl(66) = value SetDlgItemText Task(%Balmec_Bells).hparam, %GMT_TEXT0_ID + 17, "66" & STR$(value) END SUB SUB Balmec_Bells_Stop () ' should also stop the lites Controller Balmec.channel, 123, %False END SUB SUB Bello_Repeats () ' only sends keypressure to selected note.. no note on.. ' had bug: wrong task constants. (KL) ' 03.06.2015: corrected gwr. STATIC cnt AS DWORD STATIC slnr, udnr AS DWORD STATIC noot, rep AS BYTE IF ISFALSE Task(%Bello_Repeats).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "KeyPres" TaskParamlabels(1) = "Note" IF ISFALSE Task(%Bello_Repeats).hParam THEN slnr = %False MakeTaskParameterDialog %Bello_Repeats,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Bello_Repeats).SliderNumbers(0) Slider(slnr).value = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value 'bug: 'Slider(slnr+1).value = 51 'SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN udnr = TaskEX(%Bello_Repeats).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Bello_Rep_Note) ' note UDCtrl(udnr).value = 51 UDctrl(udnr).maxval = 96 UDctrl(udnr).minval = 51 END IF cnt = %False noot = 51 IF ISFALSE Balmec.ctrl(66) THEN Controller Balmec.channel, 66, 64 Balmec.ctrl(66) = 64 END IF Task(%Bello_Repeats).tog = %True END IF ' following would send it all the time... 'noot = UDCtrl(udnr).value 'rep = Slider(slnr).value 'KeyPress Balmec.channel, noot, rep ' so we changed it to: (gwr, 03.06.2015) IF (UDCtrl(udnr).value <> noot) OR (Slider(slnr).value <> rep) THEN noot = UDCtrl(udnr).value rep = Slider(slnr).value KeyPress Balmec.channel, noot, rep END IF END SUB SUB Bello_rep_Note () ' controls the note to be played. LOCAL noot AS BYTE STATIC oldnoot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bello_Repeats).UpDownNumbers(0) noot = MAX(51, MIN(96, UDCtrl(udnr).value)) UDCtrl(udnr).value = noot SetDlgItemText Task(%Bello_Repeats).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Bello_lites () ' to test pwm '06.04.2015: bottom light added. '14.05.2015: Bottom lite now mapped on note 119 STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC vel1, vel2,vel3 AS DWORD IF ISFALSE Task(%Bello_Lites).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Lite1" TaskParamlabels(1) = "Lite2" TaskParamlabels(2) = "Lite3" IF ISFALSE Task(%Bello_lites).hParam THEN slnr = %False MakeTaskParameterDialog %Bello_lites,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bello_lites).SliderNumbers(0) Task(%Bello_lites).freq = 10 Slider(slnr).value = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = %False SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = %False SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF cnt = %False Task(%Bello_lites).tog = %True END IF IF vel1 <> Slider(slnr).value THEN mPlay Balmec.channel, 126, Slider(slnr).value vel1 = Slider(slnr).value END IF IF vel2 <> Slider(slnr+1).value THEN mPlay Balmec.channel, 127, Slider(slnr+1).value vel2 = Slider(slnr+1).value END IF IF vel3 <> Slider(slnr+2).value THEN mPlay Balmec.channel, 119, Slider(slnr+2).value vel3 = Slider(slnr+2).value END IF END SUB SUB balmec_controlroom LOCAL i AS LONG LOCAL x AS LONG IF ISFALSE hwCtrlbalmec THEN DIALOG NEW 0, "balmec Control",1,1 ,600, 60, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwCtrlbalmec x = 5 FOR i = 51 TO 96 ' enkel bellen! balmec.lowtes TO balmec.HighTes SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "C", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "C#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "D", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "D#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "E", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "F", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "F#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "G", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "G#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "A", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "Bb", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlbalmec, i, "B", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT NEXT CONTROL ADD LABEL, hwCtrlbalmec, 500, "Velo:", 5, 45, 30, 12 CONTROL ADD "msctls_trackbar32", hwCtrlbalmec, 501, _ "velo", 36, 45, 135, 12, %WS_CHILD OR %WS_VISIBLE OR _ %TBS_HORZ OR %TBS_BOTTOM CONTROL SEND hwCtrlbalmec, 500, %TBM_SETRANGE, %TRUE, MAKDWD(1,127) CONTROL SEND hwCtrlbalmec, 500, %TBM_SETPAGESIZE, 0, 5 CONTROL ADD LABEL, hwCtrlbalmec, 503, "?", 174, 45, 30, 12 CONTROL ADD BUTTON, hwCtrlbalmec, 600, "All Off", 206, 45, 30, 12 DIALOG SHOW MODELESS hwCtrlbalmec CALL CB_balmec_Controlroom ELSE DIALOG END hwCtrlbalmec hwCtrlbalmec = 0 END IF END SUB SUB balmec_cc30 STATIC hwcc30 AS DWORD IF ISFALSE hwcc30 THEN DIALOG NEW 0, "balmec Control",1,1 ,60, 30, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwcc30 CONTROL ADD TEXTBOX, hwcc30, 1, "0", 1, 1, 58, 12, %ES_NUMBER CONTROL ADD BUTTON, hwcc30, 2, "&send", 1, 15, 58, 12 DIALOG SHOW MODELESS hwcc30 CALL cb_balmec_cc30 ELSE DIALOG END hwcc30 RESET hwcc30 END IF END SUB CALLBACK FUNCTION cb_balmec_cc30 LOCAL b$ LOCAL v AS BYTE IF CBCTL <> 2 THEN EXIT FUNCTION IF CBMSG <> %WM_COMMAND THEN EXIT FUNCTION IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION CONTROL GET TEXT CBHNDL, 1 TO b$ v = VAL(b$) IF v < 0 THEN v = 0 CONTROL SET TEXT CBHNDL, 1, "0" ELSEIF v > 127 THEN v = 127 CONTROL SET TEXT CBHNDL, 1, "127" END IF Controller Balmec.channel, 30, v CONTROL SET TEXT gh.cockpit, %GMT_MSG1, "CC30 " + STR$(v) END FUNCTION CALLBACK FUNCTION CB_balmec_Controlroom STATIC velo AS BYTE STATIC oldvelo AS BYTE LOCAL i AS LONG, j AS LONG LOCAL note AS BYTE SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTL CASE 51 TO 96 ' énkel bellen! balmec.Lowtes TO balmec.hightes 'checkboxes CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL mPlay balmec.channel, note, CHOOSE(1 + i, 0, velo) CASE 600 FOR i = balmec.lowtes TO balmec.hightes CONTROL SET CHECK CBHNDL, i, 0 DIALOG DOEVENTS NEXT Controller balmec.channel, 123, %False CONTROL HANDLE CBHNDL, 501 TO i SendMessage i, %TBM_SETPOS, %true, 0 MM_balmec_Off %MM_Motor CONTROL SET TEXT CBHNDL, 503, "0" END SELECT CASE %WM_HSCROLL, %WM_VSCROLL 'note: id doesn't correspond at all with the one given at creation IF (LOWRD(CBWPARAM) = %TB_THUMBPOSITION) OR (LOWRD(CBWPARAM) = %TB_THUMBTRACK) THEN velo = HIWRD(CBWPARAM) ELSE velo = SendMessage (CBLPARAM, %TBM_GETPOS,%Null, %Null) END IF CONTROL SET TEXT CBHNDL, 503, STR$(velo) 'vraag van gwr: bij iedere velo update worden de noten opnieuw gezonden IF velo <> oldvelo THEN oldvelo = velo FOR note = 51 TO 96 CONTROL GET CHECK CBHNDL, note TO i IF i THEN mPlay balmec.channel, note, velo NEXT END IF IF ISFALSE velo THEN FOR note = 51 TO 96 mPlay balmec.channel, note, 0 NEXT END IF CASE %WM_CLOSE, %WM_QUIT hwCtrlbalmec = 0 FOR i = 51 TO 96 'balmec.lowtes TO balmec.hightes DIALOG DOEVENTS NEXT Controller balmec.channel, 123, %False END SELECT END FUNCTION SUB Bello_Board1 () ' hardware test for board 1 STATIC cnt AS DWORD STATIC slnr, udnr AS DWORD STATIC noot AS BYTE DIM Notes(11) AS STATIC BYTE IF ISFALSE Task(%Bello_Board1).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" TaskParamlabels(2) = "RepRat" IF ISFALSE Task(%Bello_board1).hParam THEN slnr = %False MakeTaskParameterDialog %Bello_Board1,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bello_Board1).SliderNumbers(0) Slider(slnr).value = 8 Task(%Bello_Board1).freq = 1 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' velo's SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 0 ' repetition rate SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF Notes(0) = 51 Notes(1) = 52 ' nc Notes(2) = 57 Notes(3) = 60 Notes(4) = 65 Notes(5) = 67 Notes(6) = 68 Notes(7) = 72 Notes(8) = 85 Notes(9) = 87 Notes(10) = 88 Notes(11) = 89 cnt = %False noot = Notes(0) - 1 IF ISFALSE Balmec.ctrl(66) THEN Controller Balmec.channel, 66, 64 Balmec.ctrl(66) = 64 END IF Task(%Bello_Board1).tog = %True END IF NoteOff Balmec.channel, noot INCR cnt cnt = cnt MOD 12 noot = Notes(cnt) KeyPress Balmec.channel,noot, Slider(slnr+2).value mPlay Balmec.channel, noot, Slider(slnr+1).value Task(%Bello_Board1).freq = MAX((Slider(slnr).value) / 8!, 0.125) END SUB SUB Bello_Board2 () ' hardware test for board 2 STATIC cnt AS DWORD STATIC slnr, udnr AS DWORD STATIC noot AS BYTE DIM Notes(11) AS STATIC BYTE IF ISFALSE Task(%Bello_Board2).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" TaskParamlabels(2) = "RepRat" IF ISFALSE Task(%Bello_board2).hParam THEN slnr = %False MakeTaskParameterDialog %Bello_Board2,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bello_Board2).SliderNumbers(0) Slider(slnr).value = 8 Task(%Bello_Board2).freq = 1 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' velo's SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 0 ' repetition rate SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF Notes(0) = 70 Notes(1) = 71 Notes(2) = 58 Notes(3) = 73 Notes(4) = 74 Notes(5) = 75 Notes(6) = 76 Notes(7) = 77 Notes(8) = 78 Notes(9) = 79 Notes(10) = 80 Notes(11) = 81 cnt = %False noot = Notes(0) - 1 IF ISFALSE Balmec.ctrl(66) THEN Controller Balmec.channel, 66, 64 Balmec.ctrl(66) = 64 END IF Task(%Bello_Board2).tog = %True END IF NoteOff Balmec.channel, noot INCR cnt cnt = cnt MOD 12 noot = Notes(cnt) KeyPress Balmec.channel,noot, Slider(slnr+2).value mPlay Balmec.channel, noot, Slider(slnr+1).value Task(%Bello_Board2).freq = MAX((Slider(slnr).value) / 8!, 0.125) END SUB SUB Bello_Board3 () ' hardware test for board 3 STATIC cnt AS DWORD STATIC slnr, udnr AS DWORD STATIC noot AS BYTE DIM Notes(11) AS STATIC BYTE IF ISFALSE Task(%Bello_Board3).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" TaskParamlabels(2) = "RepRat" IF ISFALSE Task(%Bello_board3).hParam THEN slnr = %False MakeTaskParameterDialog %Bello_Board3,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bello_Board3).SliderNumbers(0) Slider(slnr).value = 8 Task(%Bello_Board3).freq = 1 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' velo's SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 0 ' repetition rate SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF Notes(0) = 82 Notes(1) = 83 Notes(2) = 84 Notes(3) = 86 Notes(4) = 90 Notes(5) = 91 Notes(6) = 92 Notes(7) = 93 Notes(8) = 119 Notes(9) = 94 Notes(10) = 95 Notes(11) = 96 cnt = %False noot = Notes(0) - 1 IF ISFALSE Balmec.ctrl(66) THEN Controller Balmec.channel, 66, 64 Balmec.ctrl(66) = 64 END IF Task(%Bello_Board3).tog = %True END IF NoteOff Balmec.channel, noot INCR cnt cnt = cnt MOD 12 noot = Notes(cnt) IF noot <> 119 THEN KeyPress Balmec.channel,noot, Slider(slnr+2).value END IF mPlay Balmec.channel, noot, Slider(slnr+1).value Task(%Bello_Board3).freq = MAX((Slider(slnr).value) / 8!, 0.125) END SUB ' procedures for robot --------------------------------------------------------- SUB Balsi_Siren () ' test code. ' 2017: ' Siren is mapped on note 24 ' kontinu test ' Note: if CC66 if OFF the siren can be controlled with the potmeter. ' 31.08.2017: Tested on PCB - 3-phase motor implementation - board failure. ' 2018-2019: ' 07.12.2018: Implementation fully changed!!! ' now separate robot on channel 15 ' velo byte steers damper. Further ctrl. mogelijk met ctrl 7 ' ctrl 67 switches PID on or off ' ctrl 68 sets the PID catch window (1 - 11) ' 07.01.2019: Hardware seems o.k. now, so we can improve the firmware now... ' Test code improved. ' 10.01.2019: range limited. STATIC slnr, udnr, rpm, volume, noot, lsb AS LONG IF ISFALSE Task(%Balsi_Siren).tog THEN DIM TaskParamLabels(4) AS ASCIIZ * 8 TaskParamLabels(0) = "Pitch" TaskParamlabels(1) = "Damper" TaskParamlabels(2) = "lsb" TaskParamLabels(3) = "PID" TaskParamlabels(4) = "Win" ' PID catch window IF ISFALSE Task(%Balsi_Siren).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Siren,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Siren).SliderNumbers(0) Slider(slnr).value = 55 rpm = 55 '%False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, rpm Slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 64 volume = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, 0 lsb = 0 udnr = TaskEX(%Balsi_Siren).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Balsi_PID) UDCtrl(udnr).value = 0 UDctrl(udnr).maxval = 1 UDctrl(udnr).minval = 0 UDctrl(udnr+1).cptr = CODEPTR(Balsi_PID_Window) UDCtrl(udnr+1).value = 1 UDctrl(udnr+1).maxval = 11 UDctrl(udnr+1).minval = 1 Balsi.ctrl(67) = 0 END IF Controller Balsi.channel, 66, 64 Balsi.ctrl(66) = 64 Task(%Balsi_Siren).freq = 10 Task(%Balsi_Siren).tog = %True END IF IF Slider(slnr).value <> rpm THEN 'IF rpm THEN ' NoteOff Balsi.channel, rpm ' not required ' rpm = %False 'END IF IF Slider(slnr).value >= 41 AND slider(slnr).value <= 84 THEN volume = Slider(slnr+1).value IF volume < 1 THEN volume = 1 mPlay Balsi.channel, Slider(slnr).value, volume 'Slider(slnr+1).value noot = Slider(slnr).value rpm = Slider(slnr).value ELSE IF noot THEN Noteoff Balsi.channel, noot ' any note within range lsb = %False noot = %False END IF END IF END IF IF Slider(slnr+1).value <> volume THEN Controller Balsi.channel, 7, Slider(slnr+1).value volume = Slider(slnr+1).value Balsi.ctrl(7) = volume END IF IF Slider(slnr+2).value <> lsb THEN Controller Balsi.channel, 48, Slider(slnr+2).value lsb = Slider(slnr+2).value Balsi.ctrl(48) = lsb END IF END SUB SUB Balsi_PID () ' PID autoregulation on/off switch LOCAL udnr AS LONG udnr = TaskEX(%Balsi_Siren).UpDownNumbers(0) IF UDCtrl(udnr).value = 0 THEN Balsi.ctrl(67) = 0 Controller Balsi.channel, 67, 0 ELSE Balsi.ctrl(67) = 64 Controller Balsi.channel, 67, 64 END IF SetDlgItemText Task(%Balsi_Siren).hparam, %GMT_TEXT0_ID + 16, STR$(Balsi.ctrl(67)) END SUB SUB Balsi_PID_Window () ' PID autoregulation catch window size LOCAL udnr AS LONG udnr = TaskEX(%Balsi_Siren).UpDownNumbers(1) IF UDCtrl(udnr).value <= 1 THEN Balsi.ctrl(68) = 1 Controller Balsi.channel, 68, 1 ELSE Balsi.ctrl(68) = UDctrl(udnr).value Controller Balsi.channel, 68, Balsi.ctrl(68) END IF SetDlgItemText Task(%Balsi_Siren).hparam, %GMT_TEXT0_ID + 17, STR$(Balsi.ctrl(68)) END SUB SUB Balsi_Siren_Stop () 'Controller Balsi.channel, 123, 0 NoteOff Balsi.channel, 60 ' any note will do, if withing the range END SUB 'SUB Balsi_Horns () ' ' alternating horns test - 2 12V black horns on hub board ' ' keypressure implemented for repeats ' ' 05.01.2019: first tests: not working. ' ' 06.01.2019: Failures caused by excessive noise from orange light... ' ' 07.01.2019: testcode improved. ' STATIC slnr, freq, cnt, rep AS LONG ' IF ISFALSE Task(%Balsi_Horns).tog THEN ' DIM TaskParamLabels(1) AS ASCIIZ * 8 ' TaskParamLabels(0) = "Speed" ' TaskParamLabels(1) = "repeats" ' IF ISFALSE Task(%Balsi_Horns).hParam THEN ' slnr = %False ' MakeTaskParameterDialog %Balsi_Horns,2,Slider(),0,UDctrl(),TaskParamLabels() ' END IF ' IF slnr = %False THEN ' slnr = TaskEX(%Balsi_Horns).SliderNumbers(0) ' Slider(slnr).value = 0 ' freq = %False ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq ' Slider(slnr+1).value = 127 ' SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, 127 ' rep = 127 ' END IF ' Task(%Balsi_Horns).freq = 2 ' Task(%Balsi_Horns).tog = %True ' END IF ' ' IF cnt MOD 2 = 0 THEN ' NoteOff Balsi.channel, 97 ' mPlay Balsi.channel, 96, rep ' ELSE ' NoteOff Balsi.channel, 96 ' mPlay Balsi.channel, 97, rep ' END IF ' IF rep <> slider(slnr+1).value THEN ' rep = slider(slnr+1).value ' KeyPress Balsi.channel, 96, rep ' KeyPress Balsi.channel, 97, rep ' END IF ' INCR cnt ' Task(%Balsi_Horns).freq = 0.5 + Slider(slnr).value / 20 'END SUB ' 'SUB Balsi_Horns_Stop () ' NoteOff Balsi.channel, 96 ' NoteOff Balsi.channel, 97 'END SUB SUB Balsi_Horn1 () ' horns test - 12V black horns on hub board STATIC slnr, freq, cnt, rep AS LONG IF ISFALSE Task(%Balsi_Horn1).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "repeats" IF ISFALSE Task(%Balsi_Horn1).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Horn1,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Horn1).SliderNumbers(0) Slider(slnr).value = 0 freq = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq Slider(slnr+1).value = 127 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, 127 rep = 127 END IF Task(%Balsi_Horn1).freq = 2 Task(%Balsi_Horn1).tog = %True END IF IF cnt MOD 2 = 0 THEN mPlay Balsi.channel, 96, rep ELSE NoteOff Balsi.channel, 96 END IF IF rep <> slider(slnr+1).value THEN rep = slider(slnr+1).value KeyPress Balsi.channel, 96, rep END IF INCR cnt Task(%Balsi_Horn1).freq = 0.5 + Slider(slnr).value / 20 END SUB SUB Balsi_Horn1_Stop () NoteOff Balsi.channel, 96 END SUB SUB Balsi_Horn2 () ' horns test - 12V black horns on hub board STATIC slnr, freq, cnt, rep AS LONG IF ISFALSE Task(%Balsi_Horn2).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "repeats" IF ISFALSE Task(%Balsi_Horn2).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Horn2,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Horn2).SliderNumbers(0) Slider(slnr).value = 0 freq = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq Slider(slnr+1).value = 127 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, 127 rep = 127 END IF Task(%Balsi_Horn2).freq = 2 Task(%Balsi_Horn2).tog = %True END IF IF cnt MOD 2 = 0 THEN mPlay Balsi.channel, 97, rep ELSE NoteOff Balsi.channel, 97 END IF IF rep <> slider(slnr+1).value THEN rep = slider(slnr+1).value KeyPress Balsi.channel, 97, rep END IF INCR cnt Task(%Balsi_Horn2).freq = 0.5 + Slider(slnr).value / 20 END SUB SUB Balsi_Horn2_Stop () NoteOff Balsi.channel, 97 END SUB SUB Balsi_RotOrange () ' test code. ' orange rotating light ' 05.01.2019: first tests: motor works fine, no light... ' 06.01.2019: changed to on/off functionality , as the PWM causes way too much EMI noise ' 07.01.2019: auto-repeats can be implemented here... ' 10.01.2019: Repeats added. Could become slow pwm as well... STATIC slnr, udnr, pwm, spd AS LONG IF ISFALSE Task(%Balsi_Rotorange).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Light" TaskParamlabels(1) = "Speed" IF ISFALSE Task(%Balsi_Rotorange).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Rotorange,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Rotorange).SliderNumbers(0) Slider(slnr).value = 1 pwm = 1 '%False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, pwm Slider(slnr).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 64 slider(slnr+1).value = 64 spd = 64 END IF Task(%Balsi_Rotorange).freq = 20 Task(%Balsi_Rotorange).tog = %True END IF IF Slider(slnr).value <> pwm THEN pwm = slider(slnr).value IF pwm THEN mPlay Balsi.channel, 120, pwm ' steers flashing speed ELSE NoteOff Balsi.channel, 120 END IF END IF IF slider(slnr+1).value <> spd THEN ' this works fine spd = Slider(slnr+1).value controller Balsi.channel, 120, spd Balsi.ctrl(120) = spd END IF END SUB SUB Balsi_Rotorange_Stop () NoteOff Balsi.channel, 120 END SUB SUB Balsi_Pinkers () ' alternating pinker test - 2 12V orange lights on hub board ' keypressure implemented for repeats ' 05.01.2019: first tests: of/off works well, repeats not working... ' 06.01.2019: Works fine now. STATIC slnr, freq, cnt, rep AS LONG IF ISFALSE Task(%Balsi_Pinkers).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "repeats" IF ISFALSE Task(%Balsi_Pinkers).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Pinkers,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Pinkers).SliderNumbers(0) Slider(slnr).value = 0 freq = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq Slider(slnr+1).value = 127 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, 127 rep = 127 END IF Task(%Balsi_Pinkers).freq = 2 Task(%Balsi_Pinkers).tog = %True END IF IF cnt MOD 2 = 0 THEN NoteOff Balsi.channel, 123 mPlay Balsi.channel, 124, slider(slnr+1).value '127 ELSE NoteOff Balsi.channel, 124 mPlay Balsi.channel, 123, slider(slnr+1).value '127 END IF IF rep <> slider(slnr+1).value THEN rep = slider(slnr+1).value KeyPress Balsi.channel, 123, rep KeyPress Balsi.channel, 124, rep END IF INCR cnt Task(%Balsi_Pinkers).freq = 0.5 + Slider(slnr).value / 20 END SUB SUB Balsi_Pinkers_Stop () NoteOff Balsi.channel, 123 NoteOff Balsi.channel, 124 END SUB SUB Balsi_Blue () ' blue rotating light test - 12V light on hub board ' 05.01.2019: first tests passed o.k. STATIC slnr, freq, cnt AS LONG IF ISFALSE Task(%Balsi_Blue).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Balsi_Blue).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Blue,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Blue).SliderNumbers(0) Slider(slnr).value = 8 freq = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq END IF Task(%Balsi_Blue).freq = 1 Task(%Balsi_Blue).tog = %True END IF IF cnt MOD 2 = 0 THEN mPlay Balsi.channel, 122, 127 ELSE NoteOff Balsi.channel, 122 END IF INCR cnt Task(%Balsi_Blue).freq = 0.5 + Slider(slnr).value / 20 END SUB SUB Balsi_Blue_Stop () NoteOff Balsi.channel, 122 END SUB SUB Balsi_Siren2 () ' 230V DC siren - speed controlled with ctrl 24 - gives 14 bit resolution ' limits should be implemented on the PIC level. STATIC slnr, freq, ctrl AS LONG IF ISFALSE Task(%Balsi_Siren2).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Pitch" ' steers the msb with the velo byte TaskParamLabels(1) = "ctrl24" ' steers the lsb with the controller value IF ISFALSE Task(%Balsi_Siren2).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Siren2,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Siren2).SliderNumbers(0) Slider(slnr).value = 0 freq = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq Slider(slnr+1).value = 0 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, 0 ctrl = 0 END IF Task(%Balsi_Siren2).freq = 2 Task(%Balsi_Siren2).tog = %True END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(slider(slnr).value) + STR$(slider(slnr + 1).value) IF freq <> slider(slnr).value THEN freq =slider(slnr).value mPlay Balsi.channel, 24, freq END IF IF ctrl <> slider(slnr+1).value THEN ctrl = slider(slnr+1).value Controller Balsi.channel, 24, ctrl Balsi.ctrl(24) = ctrl END IF END SUB SUB Balsi_Siren2_Stop () NoteOff Balsi.channel, 24 Controller Balsi.channel, 24, 0 Balsi.ctrl(24) = %False END SUB SUB Balsi_Bell () ' motor driven bell - rotation speed pwm controlled ' motor board 2 - 24V STATIC slnr, freq AS LONG IF ISFALSE Task(%Balsi_Bell).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Balsi_Bell).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Bell,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Bell).SliderNumbers(0) Slider(slnr).value = 16 freq = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq END IF mPlay Balsi.channel, 28, freq Task(%Balsi_Bell).freq = 18 Task(%Balsi_Bell).tog = %True END IF IF slider(slnr).value <> freq THEN freq = slider(slnr).value mPlay Balsi.channel, 28, freq END IF END SUB SUB Balsi_Bell_Stop () NoteOff Balsi.channel, 28 END SUB SUB Balsi_Claxon () ' 24V claxon motorboard 1 - note 98 ' 05.01.2019: first test: not working. ' 06.01.2019: PCB checked... ' 07.01.2019: problem not yet solved... maybe mosfet gate shorted? ' 09.01.2019: it works now... ' 10.01.2019: autorepeats added STATIC slnr, freq, cnt AS LONG IF ISFALSE Task(%Balsi_Claxon).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamlabels(1) = "Repeats" IF ISFALSE Task(%Balsi_Claxon).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Claxon,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Claxon).SliderNumbers(0) Slider(slnr).value = 32 freq = 32 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 64 END IF Task(%Balsi_Claxon).freq = 1 Task(%Balsi_Claxon).tog = %True END IF IF cnt MOD 2 = 0 THEN mPlay Balsi.channel, 98, Slider(slnr+1).value ELSE NoteOff Balsi.channel, 98 END IF INCR cnt Task(%Balsi_Claxon).freq = 0.5 + Slider(slnr).value / 20 END SUB SUB Balsi_Claxon_Stop () NoteOff Balsi.channel, 98 END SUB SUB Balsi_Greyhorn () ' 24V werma horn motorboard 2 STATIC slnr, freq, cnt AS LONG IF ISFALSE Task(%Balsi_Greyhorn).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Repeats" IF ISFALSE Task(%Balsi_Greyhorn).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Greyhorn,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Greyhorn).SliderNumbers(0) Slider(slnr).value = 32 freq = 32 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq slider(slnr+1).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 64 END IF Task(%Balsi_Greyhorn).freq = 1 Task(%Balsi_Greyhorn).tog = %True END IF IF cnt MOD 2 = 0 THEN mPlay Balsi.channel, 99, slider(slnr+1).value ELSE NoteOff Balsi.channel, 99 END IF INCR cnt Task(%Balsi_Greyhorn).freq = 0.5 + Slider(slnr).value / 20 END SUB SUB Balsi_Greyhorn_Stop () NoteOff Balsi.channel, 99 END SUB SUB Balsi_Siren3 () ' 24V DC siren - note 25, speed lsb controlled with ctrl 25 - gives 14 bit resolution ' Klaxon siren, 103dB, 24V - 0.5A @ 1KHz. STATIC slnr, freq, ctrl AS LONG IF ISFALSE Task(%Balsi_Siren3).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Pitch3" ' steers the msb with the velo byte TaskParamLabels(1) = "ctrl25" ' steers the lsb with the controller value IF ISFALSE Task(%Balsi_Siren3).hParam THEN slnr = %False MakeTaskParameterDialog %Balsi_Siren3,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Balsi_Siren3).SliderNumbers(0) Slider(slnr).value = 0 freq = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, freq Slider(slnr+1).value = 0 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, 0 ctrl = 0 END IF Task(%Balsi_Siren3).freq = 2 Task(%Balsi_Siren3).tog = %True END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(slider(slnr).value) + STR$(slider(slnr + 1).value) IF freq <> slider(slnr).value THEN freq =slider(slnr).value mPlay Balsi.channel, 25, freq END IF IF ctrl <> slider(slnr+1).value THEN ctrl = slider(slnr+1).value Controller Balsi.channel, 25, ctrl warning "send cc25"+ STR$(ctrl) Balsi.ctrl(25) = ctrl END IF END SUB SUB Balsi_Siren3_Stop () NoteOff Balsi.channel, 25 Controller Balsi.channel, 25, 0 Balsi.ctrl(25) = %False END SUB 'EOF