# pybricks blocks file:{"blocks":{"languageVersion":0,"blocks":[{"type":"blockGlobalSetup","id":"2]f.u!1R3CIMDKUS-`uU","x":400,"y":-200,"deletable":false,"next":{"block":{"type":"variables_set_prime_hub","id":"qw0sNO$T=Sq8MgEr.tYj","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"MSZ/2nYu5f+PCU)_ueZu"}},"next":{"block":{"type":"variables_set_color_sensor","id":"]98tZRuVhEZ=^eP@^26l","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"m7%jG`dYdG1~(tyX+t!E"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"F1Ak4m5@)#U]y`t6z8?8","fields":{"NAME":"C"}}}},"next":{"block":{"type":"variables_set_motor","id":"K|Z/6Qacw=M42=rBx3bj","fields":{"VAR":{"id":"^=C*kK/}7Yu_u}Xp{_l2"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"zQj$x|X7X`dk4Dk^_K,*","fields":{"NAME":"E"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"=F-?VErfV|CxWzSbQmGY","fields":{"SELECTION":"Direction.COUNTERCLOCKWISE"}}}},"next":{"block":{"type":"variables_set_motor","id":"b]!5?5K%[[]k,6.V1j]b","fields":{"VAR":{"id":"eEdnlHjD/Y]eOjEyH!fV"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"(:G}{6!G$}]W`JZ4wdpK","fields":{"NAME":"F"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"B5M1T:BNz/SQ[8:C8;H%","fields":{"SELECTION":"Direction.CLOCKWISE"}}}},"next":{"block":{"type":"variables_setup_any","id":"vJ=:T+V7Lm:{x*XGgYzm","fields":{"VAR":{"id":")|*[5~JIuJwo-DYeCHC5"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"64-w?k+wWkqOaalRe~S;","fields":{"NUM":50}}}},"next":{"block":{"type":"variables_setup_any","id":"qvM:Tk6uexwV7fALUp=Z","fields":{"VAR":{"id":"%~=hq$l9`ajGvLRo!k#N"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"-=dhqJ}4bf2u:c)FdaVP","fields":{"NUM":5}}}},"next":{"block":{"type":"variables_setup_any","id":"#UH|5[FD-RrtD?9R]?hj","fields":{"VAR":{"id":"AeaUJsG@A6IOjLhec~2+"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Ch3O_QUT^V,AtD$8]9I^","fields":{"NUM":20}}}},"next":{"block":{"type":"variables_setup_any","id":"wzGX-|wmK#R^r#`;1Gb`","fields":{"VAR":{"id":"SwUD2v_8lsE8/3^;xw1G"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"^kX3D$])J-v:C9=I+s,q","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"Gy2QplzPdgoV-J1G|R{8","fields":{"VAR":{"id":"!o}55m7#P/7.F0Y@KM33"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"cB|mO6yRF+0ivt,R;r4d","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"L9Q5DV}5%QHkJTQH[/ho","fields":{"VAR":{"id":"@hU5e=a-bU^7ggT$`qF#"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Bx:)z=%TrER?gxbOGws-","fields":{"NUM":0}}}}}}}}}}}}}}}}}}}}}}}}},{"type":"blockGlobalStart","id":",M5U32:kp5D?RaBF8ylb","x":400,"y":260,"deletable":false,"next":{"block":{"type":"blockFlowWhile","id":"|4lzGt9/u$fGWA0=o~H-","fields":{"MODE":"WHILE"},"inputs":{"BOOL":{"shadow":{"type":"blockLogicTrue","id":"fv$:rFi;gU*5o//-v{3k"}},"DO":{"block":{"type":"blockIfElse","id":"2g%L7vB1mdZ8zMTETjr$","extraState":{"optionLevel":1},"inputs":{"IF0":{"shadow":{"type":"blockLogicTrue","id":"=zDSKc+oWl0vftl3[zP0"},"block":{"type":"blockLogicCompare","id":"@Gj![s-b]bdOm,ookL~a","fields":{"OP1":"GT"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"nh$$M^k9q*p:9U.Pa.i{","fields":{"NUM":1}},"block":{"type":"blockFunctionCallerValue","id":"DDFSsgMe-x@fK$@PGyJ[","extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"mx/*-.-3RK-Pi)1LAzX,"}}}},"B":{"shadow":{"type":"blockMathNumber","id":"dEg!vn@o_?@XnE8EAdEz","fields":{"NUM":5}}}}}},"DO0":{"block":{"type":"blockMotorDuty","id":"DdVC`3qNv3=K4-//0jD?","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"b*RIRQN2zOy8FDj4=Q]3","fields":{"VAR":{"id":"^=C*kK/}7Yu_u}Xp{_l2","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"[+C;wN#4[qeTKXb2WRKf","fields":{"VALUE0":0}}}},"next":{"block":{"type":"blockMotorDuty","id":"4v=%IE4@{kO]md}EDbsa","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"2^,3A1Y)QxlzdXPg!Vj$","fields":{"VAR":{"id":"eEdnlHjD/Y]eOjEyH!fV","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"+:7kd]m.3nRW5!L@E[s,","fields":{"VALUE0":0}}}}}}}},"ELSE":{"block":{"type":"blockVariableSetValue","id":"F{JKl?C1?x_d2]}f|x[o","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"T:AOY}[M1s-^lwyL,SUJ","fields":{"VAR":{"id":"SwUD2v_8lsE8/3^;xw1G","name":"error","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"R}Ote5pY|/KVgTx+t$lv","fields":{"NUM":1}},"block":{"type":"blockFunctionCallerValue","id":"5=Y;bZMq]2lt6cp`EFn#","extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"n-]$AfTwaUkwmDT2S7Kl"}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"YsC]dWIRU_E4G}RRlQs$","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"[[p]M`48E/,0S7MOE-Vw","fields":{"VAR":{"id":"@hU5e=a-bU^7ggT$`qF#","name":"PD","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"P[L^A2{Ju,+lnNHPdWzO","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"]:z[(b%xu(zs]mdgzsG3","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"1_l`SUr*gEl0,JLBV(a+","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"J2Up,p}Ap,D$jie5RYE@","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"ZB]1S]nEERUvq[u~HWD)","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"EgTMj}a=/#aPOt#wjiy)","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"a:dMDyjC%dGfH:5$Cix|","fields":{"VAR":{"id":"SwUD2v_8lsE8/3^;xw1G","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"/?Ab2qR2(Hk}YySW+n;.","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"^+=RpKPB#@3f{ohz,[fa","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"2=a[PHQCKKheJc5)$4j|","fields":{"VAR":{"id":"%~=hq$l9`ajGvLRo!k#N","name":"KP","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"CSTx4(OP`r]n6jWgZryz","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"z|#A3]_H#+yO?y~yLBiS","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"{AwFL=wIQg7|Ej82*`$f","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"lk]KP-8m-pIriG0W=e:8","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"aBym48B?skMe1K{}Iklc","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"W($tPf0E=3:A%)7!mT/%","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"P.r6CpM=E@uYx_Vk)07l","fields":{"VAR":{"id":"SwUD2v_8lsE8/3^;xw1G","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"H@W%a7hFxPfrqvD%!bdH","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"bC`iCla@2_gd5~8P(PV9","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"@q]6fnN|h6)5l^CO!8zu","fields":{"VAR":{"id":"!o}55m7#P/7.F0Y@KM33","name":"lastError","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"JRBeqk!PwG/lD-QD=_I7","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"ci!uyzzXWB{/I=|3(Zj/","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":";kKBeC%8~aQ9|vl/LB?.","fields":{"VAR":{"id":"AeaUJsG@A6IOjLhec~2+","name":"KD","type":"Any"}}}}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"bZIfEXXY0jK,cS2CsXo4","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"/u8yY=zgsd`,NuNWh^Ha","fields":{"VAR":{"id":"^=C*kK/}7Yu_u}Xp{_l2","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"b`-Zpmeck--#P@et]tH}","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"#NV+9QK~UGil.M3E}8T*","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"Y4v#35FM2-T2mpoASPA2","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"B1Se/S`MToy?u}Xp{@v3","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"8V?(A,DI_3w~wl,D^G%I","fields":{"VAR":{"id":")|*[5~JIuJwo-DYeCHC5","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"P2y)Yek=ipj:?Hkf6I|S","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"[Q;j^FpaXbar7~PDv[g_","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"H/mVc%y/0spBhb3w{/+%","fields":{"VAR":{"id":"@hU5e=a-bU^7ggT$`qF#","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"C,`-b]5zn=G*%2vK:bn!","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"JAStdLVvJOI/{t^9-}#b","fields":{"VAR":{"id":"eEdnlHjD/Y]eOjEyH!fV","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"7SiZio[n@(.$.~]I$T0@","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"jAl8j]t#$_L7+?m#2*0!","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"Cebi`*fVLewFhK2n__`R","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"WoJ@TthYC#Q-}E72X,S]","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":".`y%jp-wklw-TAz/.Gm^","fields":{"VAR":{"id":")|*[5~JIuJwo-DYeCHC5","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"{iMt[bZZvL*_MWt+yKk,","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"KFtVJm],2Qafm7;33F6e","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"ARrH{%CiMi8,NwzYW8dn","fields":{"VAR":{"id":"@hU5e=a-bU^7ggT$`qF#","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"T5R$Xtl,P@-)+oy|*L~X","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"KeEcQ%@1eK_y:],i)03P","fields":{"VAR":{"id":"!o}55m7#P/7.F0Y@KM33","name":"lastError","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Pc$Q!t?Vq9WS@k[4tPV7","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"1b7vm.l%.j3dh@-qTY^d","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"uf`2`dt8IfB`X6,eh#`/","fields":{"VAR":{"id":"SwUD2v_8lsE8/3^;xw1G","name":"error","type":"Any"}}}}}}}}}}}}}}}}}}},"next":{"block":{"type":"blockWaitTime","id":".8qJ6h*4c_-*C}!}BvGS","inputs":{"VALUE0":{"shadow":{"type":"unit_time","id":"jTSPn[vqb7l%A82QBzr]","fields":{"VALUE0":10}}}}}}}}}}}},{"type":"variables_setup_function","id":"~z2.XBA0/m|1KLI=Sce)","x":40,"y":-200,"extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"n-]$AfTwaUkwmDT2S7Kl"}},"inputs":{"STACK":{"block":{"type":"blockTaskReturn","id":"@8z=,f,?)LPj@D=aF}Q;","inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"dgy#2A(^x#)!v-#Jocnb","fields":{"NUM":0}},"block":{"type":"blockMathArithmetic","id":"dBNq*{M%o-(5Tz6SJwrW","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"$FrY5_SV+$+qFkU!*S(6","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"Z@]`;0qN##,G1YAamKkv","fields":{"OP":"MATH_DIVIDE_INT"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"Nk14sOlS0XC/9kZ,1`w#","fields":{"NUM":1}},"block":{"type":"blockMathOp","id":"NR#ia5RRI}Z,@BoqQdTy","extraState":{"optionLevel":0},"fields":{"OP":"ROUNDDOWN"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"[SU7GHERNbA`f4~4W]CM","fields":{"NUM":0}},"block":{"type":"blockLightReflection","id":".c4*JuY]A8TTzCm4}XYN","inputs":{"VAR":{"shadow":{"type":"variables_get_light_intensity_device","id":",KcuA,;VONCx;wAio?4r","fields":{"VAR":{"id":"m7%jG`dYdG1~(tyX+t!E","name":"Line8","type":"ColorSensor"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"$7q$b_zN=Z(vQ@zx17:M","fields":{"NUM":10}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"Yh{~Cp+a)HfMf+*E`BZf","fields":{"NUM":8}}}}}}}}}}},{"type":"variables_setup_function","id":"X4RECK-GHO4?MQHA|`YO","x":40,"y":30,"extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"mx/*-.-3RK-Pi)1LAzX,"}},"inputs":{"STACK":{"block":{"type":"blockTaskReturn","id":"!tB3!:+O``8oF+JfEBo^","inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"dgy#2A(^x#)!v-#Jocnb","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":"]M^aW)-2]1kr!{-:-eON","extraState":{"optionLevel":1},"fields":{"OP":"MODULO"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"b%~iYkL8..*{%%vx1JcS","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":"d~jXl01ElBAGNX|wDSo%","extraState":{"optionLevel":0},"fields":{"OP":"ROUNDDOWN"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"wOWZ~p;5F=_8mjSJj/SL","fields":{"NUM":0}},"block":{"type":"blockLightReflection","id":"j=}m+Jx@dQp%FvVfCZ@`","inputs":{"VAR":{"shadow":{"type":"variables_get_light_intensity_device","id":"WZ%iEMoCZd7?0D@pi!Dc","fields":{"VAR":{"id":"m7%jG`dYdG1~(tyX+t!E","name":"Line8","type":"ColorSensor"}}}}}}}}}},"NUM2":{"shadow":{"type":"blockMathNumber","id":"|;3~}6%VO58Sy_T{yKt=","fields":{"NUM":10}}}}}}}}}}}]},"variables":[{"name":"red","id":"m;P|xbP~Owy]3YESw6#P","type":"ColorDef"},{"name":"orange","id":"[j@=rq!IEasH0?lU7,e5","type":"ColorDef"},{"name":"yellow","id":"b4f9U`p*sT%y*~_]?+[r","type":"ColorDef"},{"name":"green","id":"s/!L{}z^IN[y4G!H9)Qz","type":"ColorDef"},{"name":"cyan","id":"5Aq2T5#/tgGYW%.gZR@)","type":"ColorDef"},{"name":"blue","id":"hOl;G*0YIc=O^({,{W4#","type":"ColorDef"},{"name":"violet","id":"`+z@2NxMW_%~G0J`o[+8","type":"ColorDef"},{"name":"magenta","id":"A{bYb=,*wMLoP(D{SHU|","type":"ColorDef"},{"name":"white","id":"~;yfi~/`5$+yYey:TssW","type":"ColorDef"},{"name":"none","id":"n[kr@A~O|Lvu1Z(Ys5p/","type":"ColorDef"},{"name":"prime hub","id":"MSZ/2nYu5f+PCU)_ueZu","type":"PrimeHub"},{"name":"motorL","id":"^=C*kK/}7Yu_u}Xp{_l2","type":"Motor"},{"name":"motorR","id":"eEdnlHjD/Y]eOjEyH!fV","type":"Motor"},{"name":"SPEED","id":")|*[5~JIuJwo-DYeCHC5","type":"Any"},{"name":"KP","id":"%~=hq$l9`ajGvLRo!k#N","type":"Any"},{"name":"KD","id":"AeaUJsG@A6IOjLhec~2+","type":"Any"},{"name":"error","id":"SwUD2v_8lsE8/3^;xw1G","type":"Any"},{"name":"lastError","id":"!o}55m7#P/7.F0Y@KM33","type":"Any"},{"name":"PD","id":"@hU5e=a-bU^7ggT$`qF#","type":"Any"},{"name":"Line8","id":"m7%jG`dYdG1~(tyX+t!E","type":"ColorSensor"},{"name":"getLinePos8","id":"n-]$AfTwaUkwmDT2S7Kl","type":"Function"},{"name":"getLineWidth8","id":"mx/*-.-3RK-Pi)1LAzX,","type":"Function"}],"info":{"type":"pybricks","version":"2.1.1"},"workspaceOptions":{"scrollX":0,"scrollY":0,"scale":0.7}}
from pybricks.hubs import PrimeHub
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import ColorSensor, Motor
from pybricks.tools import wait
from umath import floor

# Set up.
prime_hub = PrimeHub()
Line8 = ColorSensor(Port.C)
motorL = Motor(Port.E, Direction.COUNTERCLOCKWISE)
motorR = Motor(Port.F, Direction.CLOCKWISE)
SPEED = 50
KP = 5
KD = 20
error = 0
lastError = 0
PD = 0

def getLinePos8():
    return floor(Line8.reflection()) // 10 - 8

def getLineWidth8():
    return floor(Line8.reflection()) % 10


# The main program starts here.
while True:
    if getLineWidth8() > 5:
        motorL.dc(0)
        motorR.dc(0)
    else:
        error = getLinePos8()
        PD = error * KP + (error - lastError) * KD
        motorL.dc(SPEED + PD)
        motorR.dc(SPEED - PD)
        lastError = error
    wait(10)
