# pybricks blocks file:{"blocks":{"languageVersion":0,"blocks":[{"type":"blockGlobalSetup","id":"bjK,wS1MYO7aiYkFSwd{","x":0,"y":0,"deletable":false,"next":{"block":{"type":"variables_set_motor","id":"(G-lhvGC+uAIVa|~kXB{","fields":{"VAR":{"id":"-OI,UL5eEDd:vDO%.#-Y"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"59M3JO=1)[ox64^KJ|Uj","fields":{"NAME":"A"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"QV@,39$9rq#WF#-kP`-d","fields":{"SELECTION":"Direction.COUNTERCLOCKWISE"}}}},"next":{"block":{"type":"variables_set_motor","id":"Dy~3Y0eGNs/L7m~H%T,x","fields":{"VAR":{"id":"NUbNwM_q?/@UPdYS!8m8"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"ju5ud?oEGmi77[,^(`E?","fields":{"NAME":"B"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"K%8udHT.*6+QPq#_-r|`","fields":{"SELECTION":"Direction.CLOCKWISE"}}}},"next":{"block":{"type":"variables_set_drive_base","id":"#:T?t]]1vdW(+FeoOTcp","fields":{"VAR":{"id":"LkTwuGXLXu]hC7+Wg?X:"}},"inputs":{"VAR":{"shadow":{"type":"variables_get_motor_device","id":"[ucwr!sZ~jFp;DGc$0),","fields":{"VAR":{"id":"-OI,UL5eEDd:vDO%.#-Y","name":"left","type":"Motor"}}}},"VAR2":{"shadow":{"type":"variables_get_motor_device","id":"M9=#QDv!{x+aM/!1VBPg","fields":{"VAR":{"id":"NUbNwM_q?/@UPdYS!8m8","name":"right","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_distance","id":"KaXz9ZLrCIZD#_m^P^z%","fields":{"VALUE0":56}}},"VALUE1":{"shadow":{"type":"unit_distance","id":"i;x]pSK$fU@Fcqb4vOxO","fields":{"VALUE0":128}}}},"next":{"block":{"type":"variables_setup_any","id":";GLWUjj8DF=(RZg:KhN4","fields":{"VAR":{"id":"p;{NGAZTVYm[DHov%*4*"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"H13!xXB}LmO50p,X5x`/","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"cpm$;b{6;6kB.!;)rlC~","fields":{"VAR":{"id":"ld*#=)1MtN46*K+J`q,g"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Z-cZ8*2vK_$Yt+s6YDFA","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_set_app_data","id":",L!3HhFGGbM?q|QE+Gg1","extraState":{"optionLevel":4},"fields":{"VAR":{"id":"rVarU3p3@.lL|dBN:c5."},"METHOD":"APP_DATA_LINE_FOLLOWER","LINE":"APP_DATA_LINE_FOLLOWER_DARK_LINE"}}}}}}}}}}}}}},{"type":"blockGlobalStart","id":"3tJe|AWl0baN(wH9a$@.","x":0,"y":379,"deletable":false,"next":{"block":{"type":"blockFlowWhile","id":"%.c7pX[VMpnpUjEYUY$+","fields":{"MODE":"WHILE"},"inputs":{"BOOL":{"shadow":{"type":"blockLogicTrue","id":"Axagi9]u4D=_IZAyF9;m"}},"DO":{"block":{"type":"blockListUnpack","id":"r.evI/!V,INOpWNK6w}K","extraState":{"optionLevel":1},"inputs":{"LIST":{"shadow":{"type":"blockListEmpty","id":"uN%?|k~MC5,.D*|_J+;K"},"block":{"type":"blockAppDataGetValues","id":"!^DX=bZjX?WcXWbgekLx","extraState":{"optionLevel":1},"fields":{"METHOD":"APP_DATA_ALL_VALUES"},"inputs":{"VAR":{"shadow":{"type":"variables_get_app_data","id":"B_eOYJ:TxCPqtWBJ~[er","fields":{"VAR":{"id":"rVarU3p3@.lL|dBN:c5.","name":"smart","type":"AppData"}}}}}}},"VAR":{"shadow":{"type":"variables_get_any","id":"LC65A%;.#?#XuJ,E.3An","fields":{"VAR":{"id":"ld*#=)1MtN46*K+J`q,g","name":"position","type":"Any"}}}},"VAR0":{"shadow":{"type":"variables_get_any","id":"*~_-1NB-{V+=V5O0.~P@","fields":{"VAR":{"id":"p;{NGAZTVYm[DHov%*4*","name":"angle","type":"Any"}}}}},"next":{"block":{"type":"blockDriveBaseStart","id":"uoFY(?kdFiSpTP9wb)E;","inputs":{"VAR":{"shadow":{"type":"variables_get_drive_base_device","id":"8-9LU?-QWRxcn(w8TCb3","fields":{"VAR":{"id":"LkTwuGXLXu]hC7+Wg?X:","name":"robot","type":"DriveBase"}}}},"VALUE0":{"shadow":{"type":"unit_speed","id":"PtF?}l6vtbh!mhGldjh{","fields":{"VALUE0":50}}},"VALUE1":{"shadow":{"type":"unit_angularVelocity","id":"CuN$P-y~#({C@E]W]4.{","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"$_Y8g)N|g^.]vk},hd14","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"d[NPW9PHE81j2$oa@G[?","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"(^T)E;0RBYMv4aw,qb?#","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"zto,9ww~+JbAuW?EYL!y","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"A@YO$-jw%a]fer*nG}G=","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"as[aDxY)C#VAv2[n@g-4","fields":{"VAR":{"id":"p;{NGAZTVYm[DHov%*4*","name":"angle","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"aY~!L%u[/.gk^},GJH,1","fields":{"NUM":1}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"Ct{,TK`^MiJgv9}W::])","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"q+9xrrm[qj|j^8Jx:)/9","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"_gj+G}v0kF3~JLF;T0/@","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"7WDto5VyBlSBKC@HZudS","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"2:;K.W:uE_t$Aq)tK;7u","fields":{"VAR":{"id":"ld*#=)1MtN46*K+J`q,g","name":"position","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"|Vc-7%2ZI;VI|Xo!#JG+","fields":{"NUM":0.3}}}}}}}}}}}}}}}}}}]},"variables":[{"name":"red","id":"PEdMV`y{f+/2bEqDNOT3","type":"ColorDef"},{"name":"orange","id":"8}O+)b^Kit?DH(eQc2DO","type":"ColorDef"},{"name":"yellow","id":"#1l3o=F,iI%WixF26%Ar","type":"ColorDef"},{"name":"green","id":"M_nB=k[Zdc=C~x]A2yx2","type":"ColorDef"},{"name":"cyan","id":"^Eh.^IzGcS:zTvnN3HZw","type":"ColorDef"},{"name":"blue","id":"l,Gi`v5:9h~@sC/XCK7.","type":"ColorDef"},{"name":"violet","id":"*s^*~Z*r=JO=h:4~^w@p","type":"ColorDef"},{"name":"magenta","id":"P$[C))1K+DQ|6bGt20)2","type":"ColorDef"},{"name":"white","id":":60`%,Y4d+y)p[*pn;pA","type":"ColorDef"},{"name":"none","id":"Spc!cR2SN`j[jNx/tX6k","type":"ColorDef"},{"name":"left","id":"-OI,UL5eEDd:vDO%.#-Y","type":"Motor"},{"name":"right","id":"NUbNwM_q?/@UPdYS!8m8","type":"Motor"},{"name":"robot","id":"LkTwuGXLXu]hC7+Wg?X:","type":"DriveBase"},{"name":"smart","id":"rVarU3p3@.lL|dBN:c5.","type":"AppData"},{"name":"angle","id":"p;{NGAZTVYm[DHov%*4*","type":"Any"},{"name":"position","id":"ld*#=)1MtN46*K+J`q,g","type":"Any"},{"name":"data","id":"!4Diq=:#4KJNSjWX/ji9","type":"Any"}],"info":{"type":"pybricks","version":"2.0.0"},"workspaceOptions":{"scrollX":177.7381101152571,"scrollY":45.096790626591826,"scale":1.0048395313295975}}
from pybricks.messaging import AppData
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
from ustruct import unpack

# Set up.
left = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right = Motor(Port.B, Direction.CLOCKWISE)
robot = DriveBase(left, right, 56, 128)
angle = 0
position = 0
app = AppData([(3, 2)])
app.configure(3, 0, bytes([0]))


# The main program starts here.
while True:
    position, angle = unpack('bb', app.get_bytes(3)) or [0] * 2
    robot.drive(50, angle * 1 + position * 0.3)
