# pybricks blocks file:{"blocks":{"languageVersion":0,"blocks":[{"type":"blockGlobalSetup","id":"j~)IX,7*AX=EzR@a=3$*","x":400,"y":-200,"deletable":false,"next":{"block":{"type":"variables_setup_imported_function","id":"w-0pjZ4cY0_dq=la=5{v","fields":{"FROM_MODULE":"MBC_line8_obj_Lib","VAR":{"id":"oKohC++?Nr}+^aWhNs/J"}},"next":{"block":{"type":"variables_setup_object_instance","id":"tiu-PMFyGmQPY{lqqA9C","extraState":{"optionLevel":1},"fields":{"VAR":{"id":"OuD)=kvsqo~GhgiGPh1o"},"CLASS_NAME":"MBC_LINE8"},"inputs":{"ARG0":{"shadow":{"type":"blockMathNumber","id":"N`schaz$}g]Qul-[4Bu(","fields":{"NUM":3}}}},"next":{"block":{"type":"variables_set_prime_hub","id":"f%j=f]JfS3qSp:+rb}_0","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"g0l9RrmowL{VB+mA,$%,"}},"next":{"block":{"type":"variables_set_motor","id":"A+FSp*85/MDSxB^X3?IT","fields":{"VAR":{"id":"KW_{L;#EHg[+ytt({Z$T"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"mOo.r[3z8cNm{;g^6O~n","fields":{"NAME":"E"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":":h[)O}WBbl;Cw7MtPLc1","fields":{"SELECTION":"Direction.COUNTERCLOCKWISE"}}}},"next":{"block":{"type":"variables_set_motor","id":"2az!#uCdzKv}Y7MdjGuL","fields":{"VAR":{"id":"ges]pSvYA{;gM~wf7^5n"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"MO.wr{5+LcnpB*!qv7nc","fields":{"NAME":"F"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"lI_ny6JWU,W*|J8+D$@C","fields":{"SELECTION":"Direction.CLOCKWISE"}}}},"next":{"block":{"type":"variables_setup_any","id":"]eFU*XUrP7ZVNp2^ITqz","fields":{"VAR":{"id":"N5O-{G#tjr.su@.d[aUC"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"2{T:TYT)}%O=J#@-YQ)N","fields":{"NUM":50}}}},"next":{"block":{"type":"variables_setup_any","id":"}EJo*,bOs3I[^,tQ(7!`","fields":{"VAR":{"id":"7TyWGQ.7GLztP|`?(;gK"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"57SY*!|oq74^rH9Y},_{","fields":{"NUM":0.4}}}},"next":{"block":{"type":"variables_setup_any","id":"f3mg}VY(RiXIC1k^t0j-","fields":{"VAR":{"id":"_0CO3xR2Y4%}V-aA)F^J"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":")n3+cukgv)G2P}`2OX];","fields":{"NUM":1.5}}}},"next":{"block":{"type":"variables_setup_any","id":"7:vjwH.UPNrMS9FQ6Y-?","fields":{"VAR":{"id":"bL.?mUr+MyMr4K#2ZO*2"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"I9v-]#2v*z0s*PC`O~}_","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"U+u7|$[7FsZ9=YF:`p^/","fields":{"VAR":{"id":"/CJkypr=[eiyD}(iGksy"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":",u9n7Yp2O?Pb:dO1g][@","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"OqIEt@{+jj[6L-6ZA`9H","fields":{"VAR":{"id":"4n2$ssP5|64F]x.CDe9o"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Zx}2l/`H=?YK#.K)/[Xm","fields":{"NUM":0}}}}}}}}}}}}}}}}}}}}}}}}}}},{"type":"blockGlobalStart","id":"r4Vt:X`G)A8/l}06p8[s","x":400,"y":260,"deletable":false,"next":{"block":{"type":"blockFlowWhile","id":"*5h4_KhBD)x*#PddU!~R","fields":{"MODE":"WHILE"},"inputs":{"BOOL":{"shadow":{"type":"blockLogicTrue","id":"veIOkaC^T!cg]sF.LB]f"}},"DO":{"block":{"type":"blockIfElse","id":"|Ra[(i:_64:,e/Hzgo75","extraState":{"optionLevel":1},"inputs":{"IF0":{"shadow":{"type":"blockLogicTrue","id":"_x[.(e6FF^)`4peE~4@h"},"block":{"type":"blockLogicCompare","id":"A`7m`-;x7f0c8/z#+_PB","fields":{"OP1":"GT"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"[6u0dw@t/%!$n8|%rh=0","fields":{"NUM":1}},"block":{"type":"blockObjectInstanceCallValue","id":"wN^p|N%Pav~3X?tQo}y]","extraState":{"optionLevel":0},"fields":{"CALL_TYPE":"CLASS_CALL_METHOD_SYNC","METHOD":"width"},"inputs":{"VAR":{"shadow":{"type":"variables_get_object_instance","id":"sQ!HqY+9piW6ilV!i#[S","fields":{"VAR":{"id":"OuD)=kvsqo~GhgiGPh1o","name":"line8","type":"ObjectInstance"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"e,E++1^D{=cS.vlkU$/r","fields":{"NUM":5}}}}}},"DO0":{"block":{"type":"blockMotorDuty","id":"^m][`6)Rl$WAU^SUu)zA","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"+kq91fi[w3T!=Jg%8g5Z","fields":{"VAR":{"id":"KW_{L;#EHg[+ytt({Z$T","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"wU?sx!][[Q5Q(of3-C3y","fields":{"VALUE0":0}}}},"next":{"block":{"type":"blockMotorDuty","id":"s^$LB/(wdP(B4=BB5TCK","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":":WX8q~B*8!lW]Ej]ec2B","fields":{"VAR":{"id":"ges]pSvYA{;gM~wf7^5n","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"#{~CLWOp9{y9sW1{BgLG","fields":{"VALUE0":0}}}}}}}},"ELSE":{"block":{"type":"blockVariableSetValue","id":"M7Ot$Jv4=/TW5bu8t)K,","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"0T;O(B#;dK!=4e2Ufm.*","fields":{"VAR":{"id":"bL.?mUr+MyMr4K#2ZO*2","name":"error","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"+VA5w;0$TC;~-z_%.@)@","fields":{"NUM":1}},"block":{"type":"blockObjectInstanceCallValue","id":"ppa^Cu([ArQ9?dcPXwV=","extraState":{"optionLevel":0},"fields":{"CALL_TYPE":"CLASS_CALL_METHOD_SYNC","METHOD":"pos100"},"inputs":{"VAR":{"shadow":{"type":"variables_get_object_instance","id":"FUC1`8@q=lSdv^GO_2ps","fields":{"VAR":{"id":"OuD)=kvsqo~GhgiGPh1o","name":"line8","type":"ObjectInstance"}}}}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"kM*-$!i1JzaDI+Ru%_!Z","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"K^L^+SG`46=fJE#B(YVW","fields":{"VAR":{"id":"4n2$ssP5|64F]x.CDe9o","name":"PD","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"+G^?K+qwVuJO:9}-HPP#","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"ZfX-W$d(a1HA8Y3U]E,h","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"_d]KG^.`}+2{cOMSz]A]","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"I6.mH6Ran1!6pPwoWDKw","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"n},@]n2#0I)sL?Aed/93","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"DV//wnHaG7kp%=J}J!yX","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"xau?SK=,0cvn3o$qMOQq","fields":{"VAR":{"id":"bL.?mUr+MyMr4K#2ZO*2","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"wl+@zMG*2RDoA}Ai%sAr","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"^B=KegO|^8b@fn,s;HP{","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"=tNA3`@]=v?1fN3[vJ61","fields":{"VAR":{"id":"7TyWGQ.7GLztP|`?(;gK","name":"KP","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"WA8I#qG~PMpm+@ktl8~M","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"29hk!G:@fj?)4!4.}sqf","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"+0Z710Y[.^l.Q.t7aocB","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"U}MbiT)W6jPX~$WCjnz/","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"72wcv*qbf+JL_IM%+9xk","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"[rRwI|miC?gOAcQim0O~","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"Kn1cIVr6ej%z7;dCC{w^","fields":{"VAR":{"id":"bL.?mUr+MyMr4K#2ZO*2","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"$UW-@(6k/%kJz(_JEJE`","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"O8zXBx.VTxY]w){14Z[(","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"zx$EljAkPt375ra3Fr[q","fields":{"VAR":{"id":"/CJkypr=[eiyD}(iGksy","name":"lastError","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"eCjPqWZU8:jv4R?BvmS1","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"*jl0TVehkt|S@*4Vnzzx","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":";@ET3/xI*qvKfmDe`8]u","fields":{"VAR":{"id":"_0CO3xR2Y4%}V-aA)F^J","name":"KD","type":"Any"}}}}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"}ichj/(]moU73{CEQ{y`","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"v#`5S(P$gfwzA)a~2,72","fields":{"VAR":{"id":"KW_{L;#EHg[+ytt({Z$T","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"f!Q@%3G(K}SM5r,O8{jY","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"`=EUM1fR{/b*[^~YV`C@","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"%j?N(tn.nO}AMdt{}LWb","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"1{zDaRmZl8lF`0!%K?/D","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"B(F]M}G/DlsIQd~5lc-S","fields":{"VAR":{"id":"N5O-{G#tjr.su@.d[aUC","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"G%JBxn6GF!ME+$ljfg(6","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"-M-Vg:ZH2.dAz7I{j}s.","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"G7Tfv#4R0r+2!jn[Ml?F","fields":{"VAR":{"id":"4n2$ssP5|64F]x.CDe9o","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"L5ewUaI7=!DrICEcbA/S","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":".8z;.UsJgze/wzPf@uun","fields":{"VAR":{"id":"ges]pSvYA{;gM~wf7^5n","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"53?rFnYxF([r=01UkrnU","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"~AVtNlzNOrAU9).511+E","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"*i8nZEc*t}mi)mN$[=t:","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"QDQ{4,^G9YWssVb8*:]^","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"Q(cWx3o`Rb~dV`gE/T`X","fields":{"VAR":{"id":"N5O-{G#tjr.su@.d[aUC","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"|:XIo^sJFgLC%MNPrRSj","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"UdP=f..FErB9K!Z+pHt)","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"f2C:6j|J*0]LbGfjK(!t","fields":{"VAR":{"id":"4n2$ssP5|64F]x.CDe9o","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"@yHn7.F$;wmd~5p%%,Tx","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"z!}gchevTMk(:y=)gZQ3","fields":{"VAR":{"id":"/CJkypr=[eiyD}(iGksy","name":"lastError","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"*/37`~vRKGDi)qnpa(WE","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"^VYxx5:5V~UOEI.u2@GY","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"!5*h1DeHfuBhk?d[2ng*","fields":{"VAR":{"id":"bL.?mUr+MyMr4K#2ZO*2","name":"error","type":"Any"}}}}}}}}}}}}}}}}}}},"next":{"block":{"type":"blockWaitTime","id":"/Ur/HbynhNEN0U+.z`M2","inputs":{"VALUE0":{"shadow":{"type":"unit_time","id":"J!C#.:;]]nFe[X6yqJz,","fields":{"VALUE0":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":"g0l9RrmowL{VB+mA,$%,","type":"PrimeHub"},{"name":"motorL","id":"KW_{L;#EHg[+ytt({Z$T","type":"Motor"},{"name":"motorR","id":"ges]pSvYA{;gM~wf7^5n","type":"Motor"},{"name":"SPEED","id":"N5O-{G#tjr.su@.d[aUC","type":"Any"},{"name":"KP","id":"7TyWGQ.7GLztP|`?(;gK","type":"Any"},{"name":"KD","id":"_0CO3xR2Y4%}V-aA)F^J","type":"Any"},{"name":"error","id":"bL.?mUr+MyMr4K#2ZO*2","type":"Any"},{"name":"lastError","id":"/CJkypr=[eiyD}(iGksy","type":"Any"},{"name":"PD","id":"4n2$ssP5|64F]x.CDe9o","type":"Any"},{"name":"MBC_LINE8","id":"oKohC++?Nr}+^aWhNs/J","type":"FunctionImported"},{"name":"line8","id":"OuD)=kvsqo~GhgiGPh1o","type":"ObjectInstance"}],"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 Motor
from pybricks.tools import wait

from MBC_line8_obj_Lib import MBC_LINE8

# Set up.
line8 = MBC_LINE8(3)
prime_hub = PrimeHub()
motorL = Motor(Port.E, Direction.COUNTERCLOCKWISE)
motorR = Motor(Port.F, Direction.CLOCKWISE)
SPEED = 50
KP = 0.4
KD = 1.5
error = 0
lastError = 0
PD = 0


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