<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="v_forward">forward</variable>
<variable id="v_strafe">strafe</variable>
<variable id="v_turn">turn</variable>
<variable id="v_speed">speed</variable>
<variable id="v_denominator">denominator</variable>
</variables>
<block type="procedures_defnoreturn" id=",7k!xn{4Jst{#}^|Wc+D" deletable="false" x="25" y="125">
<field name="NAME">runOpMode</field>
<comment pinned="true" h="100" w="460">BASIC MECANUM TELEOP

Left stick: drive forward/backward and strafe left/right.
Right stick X: rotate.
Hold the left bumper: slow mode.

The loop repeats until STOP is pressed.</comment>
<data>{"commentPositionLeft":-115,"commentPositionTop":-125}</data>
<statement name="STACK">
<block type="comment" id="student_start_setup">
<field name="COMMENT">MOTOR SETUP — WHY DIRECTIONS MATTER
The motors on opposite sides are mounted as mirror images. If all four received +1 without correction, one side would spin backward. Reversing the left motors in software makes +1 mean forward for every wheel. BRAKE means the motor actively holds still at zero power instead of coasting.</field>
<next>
<block type="dcMotor_setProperty_Direction" id="HkgyB~+Kn!dp|4Ms{DUh">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">Direction</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_direction" id="f3c4]H:Nr8~1j/yBb+W#">
<field name="DIRECTION">REVERSE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Direction" id="P})Kf6K@4uf:Hni1M`=t">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">Direction</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_direction" id="v6S3vwi^EJ#STebsMXC7">
<field name="DIRECTION">REVERSE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Direction" id="+S/b]2c)U[EG,|BnE9[Z">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">Direction</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_direction" id=")`IJmKFj72{oc7*t~zTS">
<field name="DIRECTION">FORWARD</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Direction" id="g%Z]9AhSS=;a1hHyk*Dt">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">Direction</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_direction" id="dB#*2~z7-xJyMUjA]UyA">
<field name="DIRECTION">REVERSE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_ZeroPowerBehavior" id="5.*r{?i.102{/g@_qRrN">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">ZeroPowerBehavior</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_zeroPowerBehavior" id="J6VKh(};oo[jHH`Q$ZJI">
<field name="ZERO_POWER_BEHAVIOR">BRAKE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_ZeroPowerBehavior" id="ZXL{V%18}vZG8JZYkR:G">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">ZeroPowerBehavior</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_zeroPowerBehavior" id="In73Z3~9hJG99Z9YwR#e">
<field name="ZERO_POWER_BEHAVIOR">BRAKE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_ZeroPowerBehavior" id="Vo#.liN4TOk^tIu]Z,^e">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">ZeroPowerBehavior</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_zeroPowerBehavior" id="YS_R)^n/y^({d/OJG57b">
<field name="ZERO_POWER_BEHAVIOR">BRAKE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_ZeroPowerBehavior" id="T@[^mpvr;G8Wp]cVdIk7">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">ZeroPowerBehavior</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_zeroPowerBehavior" id="4_l1}UH^Vi,#~EzJ}f,D">
<field name="ZERO_POWER_BEHAVIOR">BRAKE</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_RunMode" id="4#Xzn585Q8nx1I`O|,Gj">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">Mode</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_runMode" id="0{RhjMB.TuvJU$M4yAYK">
<field name="RUN_MODE">RUN_WITHOUT_ENCODER</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_RunMode" id="_#Bup/)5zCd4fv7iTylV">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">Mode</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_runMode" id="67}gkRn-Ws4=#ASju]^R">
<field name="RUN_MODE">RUN_WITHOUT_ENCODER</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_RunMode" id="b~-N[,w188/c$y5uFdtV">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">Mode</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_runMode" id="fBZ8c.gY=%3cj$2:m.t{">
<field name="RUN_MODE">RUN_WITHOUT_ENCODER</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_RunMode" id="n[tu*9#z$/aoQ~)j0-(t">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">Mode</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
<value name="VALUE">
<block type="dcMotor_typedEnum_runMode" id="Ki.Hkhpv^z4{@M5=`ZFq">
<field name="RUN_MODE">RUN_WITHOUT_ENCODER</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="23o2;tl4Ms_Mo.u@HhtS">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
<value name="VALUE">
<block type="math_number" id="NR`9[k9p?OU`o-lntB#5">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="N4/4T~X,_axH|E/YO.;6">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
<value name="VALUE">
<block type="math_number" id="d$W)O16xgNQ-yiCrP58t">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="f;Mzdb/oi+wrx%W_;;;-">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
<value name="VALUE">
<block type="math_number" id="-~FF_2qalqNEg~ubEgad">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="OU`6Vd*6N,}lc*)Prj6A">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
<value name="VALUE">
<block type="math_number" id="El;0K@q_2:9im,Ej6A8e">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="telemetry_addLine" id="readyTelemetryLine">
<value name="TEXT">
<shadow type="text" id="~Zz6WH(Gt@Rzz*@T:X^!">
<field name="TEXT">READY - basic mecanum drive</field>
</shadow>
</value>
<next>
<block type="telemetry_update" id="readyTelemetryUpdate">
<next>
<block type="comment" id="student_start_wait">
<field name="COMMENT">INIT AND START
INIT means initialize: prepare the robot without allowing it to drive. waitForStart pauses here until the human presses START on the Driver Station. This safety boundary prevents joystick noise or unfinished setup from moving the robot early.</field>
<next>
<block type="linearOpMode_waitForStart" id="Nn}{i{$Ge0l,MZ]u[.Cb">
<next>
<block type="controls_whileUntil" id="i+sK2^HF9pX3Un)N.Y+[">
<field name="MODE">WHILE</field>
<value name="BOOL">
<block type="linearOpMode_opModeIsActive" id="lGSLNCZ4l)}?:T%kt]eW"/>
</value>
<statement name="DO">
<block type="comment" id="student_start_controls">
<field name="COMMENT">JOYSTICK COORDINATES
Each joystick axis reports a decimal from -1 to +1. Left-stick X means side-to-side, and left-stick Y means up/down. Controllers report pushing upward as a negative Y number, so the program multiplies it by -1 to make pushing forward produce positive forward motion. Right-stick X becomes rotation.</field>
<next>
<block type="variables_set" id="iTWdCUy-+2gE1.5*2Pl1">
<field name="VAR" id="v_forward">forward</field>
<value name="VALUE">
<block type="math_single" id="41)eJ3kuq.Bpa7!i{T30">
<field name="OP">NEG</field>
<value name="NUM">
<block type="gamepad_getProperty" id="I.3*rH+0q/$TL8L$P5G2">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">LeftStickY</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
</block>
</value>
<next>
<block type="variables_set" id="4N:sEftFN9?~zU@co}!v">
<field name="VAR" id="v_strafe">strafe</field>
<value name="VALUE">
<block type="gamepad_getProperty" id="yqcNH}h@Ipr.|4F59Mj$">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">LeftStickX</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<next>
<block type="variables_set" id="f{ot5PeP^3VYV`^!Fk2V">
<field name="VAR" id="v_turn">turn</field>
<value name="VALUE">
<block type="gamepad_getProperty" id="9O3yChi)=8AOqD|sB#Ct">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">RightStickX</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<next>
<block type="variables_set" id="RUM-R*9wx{^k(7M48q*f">
<field name="VAR" id="v_speed">speed</field>
<value name="VALUE">
<block type="math_number" id="3t4:wPJ@_bH!TJeHBY@%">
<field name="NUM">1</field>
</block>
</value>
<next>
<block type="comment" id="student_start_slow">
<field name="COMMENT">SLOW MODE
Normally speed is 1.0, meaning 100% of the calculated power. Holding the left bumper changes the scale to 0.35, or 35%. Multiplying every wheel by the same scale keeps the movement direction the same while making practice safer and more precise.</field>
<next>
<block type="controls_if" id="(tg$q@,KRD|X!Gp1!_Ga">
<value name="IF0">
<block type="gamepad_getProperty" id="8fQ##=BvO.%*XXc_IM1A">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">LeftBumper</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<statement name="DO0">
<block type="variables_set" id="@_=m}J4#{xESZ{T.B1-k">
<field name="VAR" id="v_speed">speed</field>
<value name="VALUE">
<block type="math_number" id="+*QpMGLJw7f9;(5u#fwD">
<field name="NUM">0.35</field>
</block>
</value>
</block>
</statement>
<next>
<block type="comment" id="student_start_denominator">
<field name="COMMENT">WHY ADD ABSOLUTE VALUES?
Absolute value removes the plus or minus sign, because we only need the size of each request. Adding |forward| + |strafe| + |turn| estimates the largest combined demand. A diagonal joystick command can otherwise ask a wheel for more than 1.0 power.</field>
<next>
<block type="variables_set" id="1[7P0yvh*^Jc3WYBnU^k">
<field name="VAR" id="v_denominator">denominator</field>
<value name="VALUE">
<block type="math_arithmetic" id="kE`Da[|8?F2!4P8#R3HN">
<field name="OP">ADD</field>
<value name="A">
<block type="math_arithmetic" id="}.q4bT_qYsExI!-gUAhe">
<field name="OP">ADD</field>
<value name="A">
<block type="math_single" id="1=j@~?-E-[.l?7P-c|k2">
<field name="OP">ABS</field>
<value name="NUM">
<block type="variables_get" id="L.l@Lfh67Io@`7Y.P~=A">
<field name="VAR" id="v_forward">forward</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="math_single" id="$bgO6=$WF~;hVcG@^.A4">
<field name="OP">ABS</field>
<value name="NUM">
<block type="variables_get" id="n9]PlpVP*^kpgIoFB7)w">
<field name="VAR" id="v_strafe">strafe</field>
</block>
</value>
</block>
</value>
</block>
</value>
<value name="B">
<block type="math_single" id="M,S1PwLr#KyMwcWQZ:98">
<field name="OP">ABS</field>
<value name="NUM">
<block type="variables_get" id="Y8Uk0soYqp()?WG@-82f">
<field name="VAR" id="v_turn">turn</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="comment" id="student_start_normalize">
<field name="COMMENT">NORMALIZATION — SHRINK WITHOUT CHANGING SHAPE
Motor power must stay between -1 and +1. If the denominator is less than 1, we replace it with 1 so we never make small commands larger. Dividing all wheels by the same denominator shrinks oversized values equally, preserving the intended direction and rotation.</field>
<next>
<block type="controls_if" id="@/,!]~9,=WXjRAE7/E?2">
<value name="IF0">
<block type="logic_compare" id="+kti(wXs@x/D;-5(beV6">
<field name="OP">LT</field>
<value name="A">
<block type="variables_get" id="7Gnm0)=@|~!KcxzHhwA$">
<field name="VAR" id="v_denominator">denominator</field>
</block>
</value>
<value name="B">
<block type="math_number" id="JoqD1rE=}llP%?2|0Nt[">
<field name="NUM">1</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="variables_set" id="Fp^U13wNe,8;;{QE_J9o">
<field name="VAR" id="v_denominator">denominator</field>
<value name="VALUE">
<block type="math_number" id="kTrZK4c@o$[+BvK5;NWN">
<field name="NUM">1</field>
</block>
</value>
</block>
</statement>
<next>
<block type="comment" id="student_start_mecanum">
<field name="COMMENT">MECANUM WHEEL MIXING
Mecanum rollers let the robot combine three motions: forward, sideways, and turning. Each wheel needs a different plus/minus combination. For example, adding sideways power to one diagonal and subtracting it from the other diagonal creates a strafe without rotating the robot.</field>
<next>
<block type="dcMotor_setProperty_Number" id="JjE.YAola@n-ueLQZher">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
<value name="VALUE">
<block type="math_arithmetic" id="8;TAtf~~Wb*=7^R!Rm@h">
<field name="OP">MULTIPLY</field>
<value name="A">
<block type="variables_get" id="iQ:khC~HlFUXz(jHMwJp">
<field name="VAR" id="v_speed">speed</field>
</block>
</value>
<value name="B">
<block type="math_arithmetic" id="vh@gUSSbTkI=2t%/iW|{">
<field name="OP">DIVIDE</field>
<value name="A">
<block type="math_arithmetic" id="i/1[dh8;^*//2tRy91`s">
<field name="OP">ADD</field>
<value name="A">
<block type="math_arithmetic" id="*h{[/;aewNVqhQVxH{!)">
<field name="OP">ADD</field>
<value name="A">
<block type="variables_get" id="*eYih]`w]XJ~z~k1mxkc">
<field name="VAR" id="v_forward">forward</field>
</block>
</value>
<value name="B">
<block type="variables_get" id="!s@l/V-u1iwFAtCzvT~:">
<field name="VAR" id="v_strafe">strafe</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id="s?/~mQo#NiAHIqI/0*9`">
<field name="VAR" id="v_turn">turn</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id="CEcY+yQ@XL*WU1r}LR,N">
<field name="VAR" id="v_denominator">denominator</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id=")nRzD:.Qk|b-jp[}6`}i">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
<value name="VALUE">
<block type="math_arithmetic" id="g4V:N4Ym[5Fn=j9RP)N6">
<field name="OP">MULTIPLY</field>
<value name="A">
<block type="variables_get" id="?M#dTSl?=*AP@)A4}:bm">
<field name="VAR" id="v_speed">speed</field>
</block>
</value>
<value name="B">
<block type="math_arithmetic" id="-;@qv,}4N[rV6;@Y3}3*">
<field name="OP">DIVIDE</field>
<value name="A">
<block type="math_arithmetic" id=")m~#fdW7!?@])s_9jPL(">
<field name="OP">MINUS</field>
<value name="A">
<block type="math_arithmetic" id="d%)t}@,%Z?!1N^FNZc~J">
<field name="OP">MINUS</field>
<value name="A">
<block type="variables_get" id="-vrBuV]_*sTIM?[vWxl-">
<field name="VAR" id="v_forward">forward</field>
</block>
</value>
<value name="B">
<block type="variables_get" id="mD,FAo?eeqjln9]%X!Ge">
<field name="VAR" id="v_strafe">strafe</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id=",5B66ro-M33$%Bj8+:2T">
<field name="VAR" id="v_turn">turn</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id=",?I_?T3@A[v;cCR^-O!-">
<field name="VAR" id="v_denominator">denominator</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="Ij_p-ie[Mo-|T/=-|^/#">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
<value name="VALUE">
<block type="math_arithmetic" id="s+S,Jt+O.xq(5E*m]g4+">
<field name="OP">MULTIPLY</field>
<value name="A">
<block type="variables_get" id="S0@6}-`u#eEY)(.eQ~U{">
<field name="VAR" id="v_speed">speed</field>
</block>
</value>
<value name="B">
<block type="math_arithmetic" id="Ich^Vnm7ZOyu;H:g~=GK">
<field name="OP">DIVIDE</field>
<value name="A">
<block type="math_arithmetic" id="~.kmX9*pYV8R@@igpX~A">
<field name="OP">ADD</field>
<value name="A">
<block type="math_arithmetic" id="$m7C)umBds7.ZXT5STWw">
<field name="OP">MINUS</field>
<value name="A">
<block type="variables_get" id="PM?JcD_~wGO#5t[Yb_o3">
<field name="VAR" id="v_forward">forward</field>
</block>
</value>
<value name="B">
<block type="variables_get" id="LyL!/{_3])8?(82w$6S6">
<field name="VAR" id="v_strafe">strafe</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id="4,Y^n92mU_#MN=)9)lP%">
<field name="VAR" id="v_turn">turn</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id="dO(sSE#r;D$Vy|ZM~g#*">
<field name="VAR" id="v_denominator">denominator</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="`#E;P=0pA^}%dPSke}t~">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
<value name="VALUE">
<block type="math_arithmetic" id="-3/pn67?l`lUt#[eETrw">
<field name="OP">MULTIPLY</field>
<value name="A">
<block type="variables_get" id="eC/oaHQ(?Df{vMs]9H/=">
<field name="VAR" id="v_speed">speed</field>
</block>
</value>
<value name="B">
<block type="math_arithmetic" id="FPX7,y8^*~1K7{7.pfP~">
<field name="OP">DIVIDE</field>
<value name="A">
<block type="math_arithmetic" id="K5#v/F]hB)(`_o3Txd~n">
<field name="OP">MINUS</field>
<value name="A">
<block type="math_arithmetic" id="PL0@U/vsg}i5rTWQZwqh">
<field name="OP">ADD</field>
<value name="A">
<block type="variables_get" id="Vz]FrUQ1rmDm8%OOjowV">
<field name="VAR" id="v_forward">forward</field>
</block>
</value>
<value name="B">
<block type="variables_get" id="egdq8`n^)s_zK3gGB.V[">
<field name="VAR" id="v_strafe">strafe</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id="p@4n8nvi(mYu!I/1i|ua">
<field name="VAR" id="v_turn">turn</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="variables_get" id="K:eNBvOJ5%LMaC@cK*bm">
<field name="VAR" id="v_denominator">denominator</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="comment" id="student_start_telemetry">
<field name="COMMENT">TELEMETRY MEANS DATA SENT BACK
Telemetry is information the Robot Controller sends to the Driver Station screen. It does not control the robot. These rows help us debug by showing the joystick requests and the power actually sent to each motor.</field>
<next>
<block type="telemetry_addNumericData_Number" id="liveTelemetryStart">
<value name="KEY">
<shadow type="text" id="CU:,P[;0rX0+OS~-3r5c">
<field name="TEXT">Forward command</field>
</shadow>
</value>
<value name="NUMBER">
<block type="variables_get" id="OAh=_N[;KBm4hQGA*`%Z">
<field name="VAR" id="v_forward">forward</field>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="+]81ks/,[JNR,%XgRr?/">
<value name="KEY">
<shadow type="text" id="?Dvw[tBM9XO7=L};-Mr$">
<field name="TEXT">Strafe command</field>
</shadow>
</value>
<value name="NUMBER">
<block type="variables_get" id="#m;0qrvSr[[*8fA@HJ`-">
<field name="VAR" id="v_strafe">strafe</field>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="G[Ovrtva/RZVQ(MPdig~">
<value name="KEY">
<shadow type="text" id="t58#~]Sdo8rdxj|v{ZgT">
<field name="TEXT">Rotate command</field>
</shadow>
</value>
<value name="NUMBER">
<block type="variables_get" id="Ay{])smXO(m5WrILMf78">
<field name="VAR" id="v_turn">turn</field>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="}Ax/v}:+1EZ*Ce,1[LDM">
<value name="KEY">
<shadow type="text" id="{JCu0|F$qVAT!yC:34E@">
<field name="TEXT">Speed scale</field>
</shadow>
</value>
<value name="NUMBER">
<block type="variables_get" id="E-~0Ie?*sgTD?~!7io3T">
<field name="VAR" id="v_speed">speed</field>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="dY|dr9`.hFU6wn.v@We7">
<value name="KEY">
<shadow type="text" id="cRrrmhqZcRh!VKbh3$xt">
<field name="TEXT">FL motor power</field>
</shadow>
</value>
<value name="NUMBER">
<block type="dcMotor_getProperty_Number" id="8*PAH-/mF?fm%#;2h1-$">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="b#8$Xr?X;c}$sq($a+2/">
<value name="KEY">
<shadow type="text" id="b`);y4:mlN8e}v6m4.bX">
<field name="TEXT">FR motor power</field>
</shadow>
</value>
<value name="NUMBER">
<block type="dcMotor_getProperty_Number" id="h|)`(~:@hdlLQd0yVqaw">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="UnV*F-h#;}M^4.zHXpYD">
<value name="KEY">
<shadow type="text" id="-QidORWf-vJrc3}ULm[%">
<field name="TEXT">BL motor power</field>
</shadow>
</value>
<value name="NUMBER">
<block type="dcMotor_getProperty_Number" id="HmlKIfM4Jv(bYGFq755R">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
</block>
</value>
<next>
<block type="telemetry_addNumericData_Number" id="~1HnU4]SlN.o+/udp|zw">
<value name="KEY">
<shadow type="text" id="MoJbq93_^m:BW#GkA7?;">
<field name="TEXT">BR motor power</field>
</shadow>
</value>
<value name="NUMBER">
<block type="dcMotor_getProperty_Number" id="eX@EWY399lvugo;aF;LE">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
</block>
</value>
<next>
<block type="telemetry_addTextData_All" id="`!umIM/S0,.AH=.K#:Kc">
<value name="KEY">
<shadow type="text" id="//KDVCsp-w*k:pR=RYBD">
<field name="TEXT">Face buttons</field>
</shadow>
</value>
<value name="TEXT">
<block type="text_join" id="n+/8*g8!O2D#G4v?-Ktg">
<mutation items="8"/>
<value name="ADD0">
<shadow type="text" id="*5(.kkZWmwB7!,%ym_UJ">
<field name="TEXT">A:</field>
</shadow>
</value>
<value name="ADD1">
<block type="gamepad_getProperty" id="3_X^D:wuvql7+i9b5}e{">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">A</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD2">
<shadow type="text" id="FrxIMG?eL+p:AVw|~A.]">
<field name="TEXT"> B:</field>
</shadow>
</value>
<value name="ADD3">
<block type="gamepad_getProperty" id="Xf!(AR]_9_KcA9{41W_[">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">B</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD4">
<shadow type="text" id="3nCY.Y]B|G|Lxlh|ERoI">
<field name="TEXT"> X:</field>
</shadow>
</value>
<value name="ADD5">
<block type="gamepad_getProperty" id="~pm]1xbhs*g7%+biv;oH">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">X</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD6">
<shadow type="text" id="UL:o$gZy|e}[lhx?IWg:">
<field name="TEXT"> Y:</field>
</shadow>
</value>
<value name="ADD7">
<block type="gamepad_getProperty" id="qgb{lbMw9o6R?Ylk-9U4">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">Y</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addTextData_All" id="xbSu|CCGfkZeU3m}X^Bf">
<value name="KEY">
<shadow type="text" id="M`b8j+X!X[B7Uf1=D#b=">
<field name="TEXT">D-pad</field>
</shadow>
</value>
<value name="TEXT">
<block type="text_join" id="$dsT=LLGTLbxiiuL:4o}">
<mutation items="8"/>
<value name="ADD0">
<shadow type="text" id="F-T/S2@fybkn3$_BTP.v">
<field name="TEXT">U:</field>
</shadow>
</value>
<value name="ADD1">
<block type="gamepad_getProperty" id="#EplFT}Z+G,p15_[ifZJ">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">DpadUp</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD2">
<shadow type="text" id="n6[U+T!u$QD55C?IK;xT">
<field name="TEXT"> D:</field>
</shadow>
</value>
<value name="ADD3">
<block type="gamepad_getProperty" id="lg^mqAbN~5G;kwiPMs1%">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">DpadDown</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD4">
<shadow type="text" id="-[eWPG#;tZ.J_R*,]z~`">
<field name="TEXT"> L:</field>
</shadow>
</value>
<value name="ADD5">
<block type="gamepad_getProperty" id="sX`qbA3e}m[dQ7!b_[5+">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">DpadLeft</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD6">
<shadow type="text" id="|)$NV!ano^uD]0NDS[;l">
<field name="TEXT"> R:</field>
</shadow>
</value>
<value name="ADD7">
<block type="gamepad_getProperty" id="yz/`Cb!DW,K]!fC*F`[;">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">DpadRight</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addTextData_All" id="x,GR4OqnWnsZQ#W]3.W{">
<value name="KEY">
<shadow type="text" id="vWo=slp-K#cYx):oifn.">
<field name="TEXT">Other buttons</field>
</shadow>
</value>
<value name="TEXT">
<block type="text_join" id="tA9fh_U/2t?YriQX2;UN">
<mutation items="8"/>
<value name="ADD0">
<shadow type="text" id="PG^O[h9:v:tX3.q($x$U">
<field name="TEXT">LB:</field>
</shadow>
</value>
<value name="ADD1">
<block type="gamepad_getProperty" id="YO$=t+NO2|f+|vqjkk],">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">LeftBumper</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD2">
<shadow type="text" id="lCtddKngHVZf@rIAnB|b">
<field name="TEXT"> RB:</field>
</shadow>
</value>
<value name="ADD3">
<block type="gamepad_getProperty" id=".[!w]}nzr73urkoog7[^">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">RightBumper</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD4">
<shadow type="text" id="WF.$%HH$#:rPWpJh3Du~">
<field name="TEXT"> Start:</field>
</shadow>
</value>
<value name="ADD5">
<block type="gamepad_getProperty" id=":*)k0^-0tr`Z|K~:}qRH">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">Start</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<value name="ADD6">
<shadow type="text" id="4}e+_3:xe]L}Dw~lI!A|">
<field name="TEXT"> Back:</field>
</shadow>
</value>
<value name="ADD7">
<block type="gamepad_getProperty" id="Ye[qMP=4~ZG$OzQm`JCD">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">Back</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_update" id="liveTelemetryUpdate"/>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
<next>
<block type="comment" id="student_start_stop">
<field name="COMMENT">FINAL SAFETY STOP
The loop ends when STOP is pressed or communication ends. Explicitly writing zero to all four motors is a final safety step so no earlier power value can remain active.</field>
<next>
<block type="dcMotor_setProperty_Number" id="Msuu[d!iIbH$9m]2:kEC">
<field name="IDENTIFIER">front_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_left_drive"}</data>
<value name="VALUE">
<block type="math_number" id="ypL~.[/KlR.}L=(@=.QU">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="m@o_^zm+s68dbj=tu6m3">
<field name="IDENTIFIER">front_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"front_right_drive"}</data>
<value name="VALUE">
<block type="math_number" id="h1=:XYb2OZ6pJB$=ppC(">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="tG`_!~[nU`GQt%n_J9_G">
<field name="IDENTIFIER">back_left_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_left_drive"}</data>
<value name="VALUE">
<block type="math_number" id="KDQ!+(l/:vG:Knl:hv~t">
<field name="NUM">0</field>
</block>
</value>
<next>
<block type="dcMotor_setProperty_Number" id="f(|[=XuPGqYhmf#FBscz">
<field name="IDENTIFIER">back_right_driveAsDcMotor</field>
<field name="PROP">Power</field>
<data>{"IDENTIFIER":"back_right_drive"}</data>
<value name="VALUE">
<block type="math_number" id="[^y-H5Bs=e(!O{YzdYp.">
<field name="NUM">0</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</xml>
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<Extra>
<OpModeMeta flavor="TELEOP" group="" />
<Enabled value="true" />
</Extra>
