From ae2009c2078f5c25099341b19bbbf8cbcddab6ab Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:00:00 -0700 Subject: [PATCH] Force openpilot to Coast --- frogpilot/assets/other_images/paused_icon.png | Bin 0 -> 3031 bytes frogpilot/assets/other_images/speed_icon.png | Bin 0 -> 20412 bytes frogpilot/controls/frogpilot_card.py | 6 +++ .../controls/lib/frogpilot_acceleration.py | 2 + .../qt/onroad/frogpilot_annotated_camera.cc | 37 ++++++++++++++++++ .../ui/qt/onroad/frogpilot_annotated_camera.h | 4 ++ selfdrive/controls/controlsd.py | 2 +- 7 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 frogpilot/assets/other_images/paused_icon.png create mode 100644 frogpilot/assets/other_images/speed_icon.png diff --git a/frogpilot/assets/other_images/paused_icon.png b/frogpilot/assets/other_images/paused_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..40c879410c4dc07857d4daa329a73cfdc4d4b249 GIT binary patch literal 3031 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 Tn~t&crw-8UcTy_I{_KAPMHfj{ literal 0 HcmV?d00001 diff --git a/frogpilot/assets/other_images/speed_icon.png b/frogpilot/assets/other_images/speed_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8c022fb60143b8c6bb386c13afebf35ea894f5fb GIT binary patch literal 20412 zcmd3uQ+p;|vw)vCnRtSUjfrjBwli^_*fuA2GO=yjwr$(ym-k@*hkel92X%FK^;&gR zt*W|L|CN^&ga3i`0{{TPONa|AeqV?GJD?%I&lT#Gnco)>2SqVKK;?IOg$W$Ddiq7s#>Mos>448C$KckN24Vv#ILXgoW8IE`)=)-bzbxMKyw0A8&L&>-=*a;jl@vwStQ4OENtH3r@Vfn zd$f@+DH)qUVxE=H6Xz_sN@(7ePqR2BEb-{!#z)5wUd?@tv-|1}82JES)z>#nu3>d= ze>kFyJCy~ zE&WWJNZuf(x&OwGJv;(_ZU)x)#eyf6M@BOjQj(Hw9UfJK7=b}e zlSr)^`x)2d7sM?}u9CqJfDn)%W<7|q{x_5N`_(-PA*bqqZBrD93DSjHz)k|R=iCfq zRwM8rfn7Y#Deg0|UVfHRf~w*d5c}#O*a9*t34%ux9WoD7o&YUXgHKC?FBWeZy|G4T z`Eb(wp4d2sOgwodE=fIG!>Gh$nQoIkOtzi41;f&Do_xLlAx={g6g85jdbw1w5`c`1 zoKrmfTSP>x#PMX7Qm?XocXv;@)QBSSw}Rk6_%AhS%LrFJBjJ1^Vq!Gpe@gNrFx>!f5~$N< zpSVNKsuOfG`M$9FoUAetzPL7a{K|>CJsnP6#a|K^BrFZ>GU8$S!4A`Fzg5dqB$IxZ z{6M2D)_ee#Dz!xc7s?A5jmL_WOBBPXaEqRwT@$G_W}zaMQ`AMo#IWUsQNxG9#RDN? z!2SXL%-u=K$f(#$)*}A?`}gl^hey-n`9_}C+oSo?rOs-#cYtc8c1gq8B5-ZdN^(7` zH~^||bFI-)pmrNq2tug#ox(ho)T;Nh)>FNV_%TrgnV?vFfiwfyp($QU17m~IHD)K9 zo6A@rc(K~B(5~UY0-PTPoDn7v*d ziOuDgdNGcz#L?Pyi}m?T*(rGIB0jXw9RFxv6?;f20HCL!>D{F` zF10=Kh^6iIim?PnWI7x#1Byevy9g zvG|Jq@L?O>W3FWg`DfdH(rNxZERil_jO&I52K`igfKitC`1nXMINyj5V7d3(1>3jJ ziz(+{ktqt8BDtSFPBZ4o}obf^R_ zmYcH@=@zsjthvg{NG&YVXf;^AFjlD72$rcDht#CNt>V(~cvS(gPykc{}pV|=kvr>v^$MKjC$v7|=Lp8isR zgMfc^W zS!uS*JDkWWl87fWe>`8&Y;aFh_;ZVt1^srajeV_;vcu2Maz0-YzuII`g~bBIXtLJ@ z>2tAJsT~kcK;(VqmrAB#xjeLlh#*B+dLBBgP3M@QRM}QREnD%}GqGvwmd*9P>xCY&r@O%T%!%=%KP>S{W&cHSRR1=%~}R_$arO zmO%tgpJlQI|2)^qd+hyFT4jN`)82FCi8En|q`AK8y9dUk1{PF59cdNG+K?yo;a(fmxG5iY4GBkU)x>|1pC+L*`cBD7jY(smy%*r zZLn1QF<2PeAJoZK!&N@p)a!L0qD(sh)RJlCFK$Lo!5Y$B zCcPSk)mrc5*}3HGD@>co2^HO!fWo?3mf(~T6wXd-sq@+&mc_Q4zixX6PCMo6 z<0)&??FrZG>BD8U(Mn6UDCf#T##<#&x|dMDc&j~3)1@S@5EodgnepxW)da=E&j&yI zQ8(6KRID__1g#c}bs7@TBY3n5B#jVl^GBmLC^S2rtH`ESa<__X7S{*3>h0FN3kqWE zNO7T=%wvywh@DSMicViGs?@$6M&uiNdQUq%F6(@;j`%v#PY8MWklO?_eeTmevLFzG zeJP$8hMFafN6~Jcy3j~$mc>wHVn@LtlwQRm=vk16rY$e6EuXIriTkmUZ4)p;++0Iq z6-Hjwhcs2y5T&2$>w=Y?dKq@?c%grk`ygdEA1D3YOsh-lqxBXd+ z%#se4{W7w3QdHfnRX&j6@Vbh9|CoV8x}+h@W3IOmMLPXi=09aqNzcx4L)&$3&$E0a zfbubEUF}<}*#DdN^_ke~b);yu-c6~oo8X3(ky7#7j+F}y%vsF!bjTkq%T0!sls#YK z!s>zSx2>UXPX)(?vQ=hhkUqZi<%)`5kv!x}0J|+H;8LT`$g9UEs~3-51=+-UIlR`> zn`LTxw_>NKTZYS}TkGMeMM6xBK8d7k2;g6z9QR8g@7p_5yaWDXWOJQ{}zE$b~LFpN#d7ealEGYz*NVg}hDoHyUJ`Nm+yH zoABf?)>5TB)`f+Gb`#)CNz(4hF{zcu#`n$_BI96_SgaaYx(%89mQ%sC>o z`CFxt%)d4jy(ld!Z|l`oy|+gt$Hb3M5=|fDE2^L$T1B$BhIvL%s3gpn*F~A$l2XaE z3!nMfD}C>Kh?r+@`3FCEPZduP_Z0CPWrUJ0B+%JgHH4u%>4vh))pK%@zrL42Dv_rw zg0!fB?fcbw^Y}v9j8e8uPoX-KsUPN^b=xxxv0+qdf(vJfYC}xerFR;UDg~;TBBHpG zuP{w=m5GiqM8)?3l5%-T#5!-z?xXkiwk9;U^X+7Y?A#j@0e!=VO) z)kT$~^D#!BSw((E8ZCdS2BY-KuDtciNG%?LZ<9u(MTH^CJt_FN^VaP*q8W~}5~aEo ztrV|6AW-@J)81E1vljaK$go&g#R<^3_FZ5};;9FdxOtSkJ%3l-rQtvIx+uO%(yI7S zJs%xO{$U6WB);^}n_0`x3&8>eK=jDGbwz&`U3I?EGSd@-r5-g)Ub+=|} zIMJ0W*b6%XLYb6O{R?IQh)YN+Nh+2;UP-Aa8iYMw$tdjN=}N5DQAv0-UM)>lyxre@ znNU&8@I`{{y$9>UD;EgbC5A_rjy3LDKs-^^NTLme}2Kn{$lyl3y$(2;t!6UKG;u0xkQ;KYE^dDUzb*FT%<{<(dw!W zOn`?b5d=!6K3+;LX5zjzxTwWBTdtPDQ@NOJ++JvQ7?m}aZ&c)aQAo;2uw6|^Jh^Pq z0d=Gu^9}NdQPmhV8%h(E<6Ccl%H+Ba76T=k1G}QD%D+*{YVBsiB6Aiq%pur0Y>+NZ zpE^-xQX53{BD5;Hj;!WNBi|CBdes<)x4^07UEdfS7r0FE9XN(_}L2kz#9esCv^QZ!4WH zEv=<12J6*C*e0`;cbV0C_oByhX~un62nHhJ@Dgq9h|`7N6^$~ZB_e_vfA*J3H5FN? zk`-H?F|q<-ps3rP3QnW{r9C_ZHl#9ogsWOD|5D7Y=B3f9XYLWrm#oli05$kMu4b=j zBFO`x**s4!mtkq&uI)^~3SBQulHqL;D}kdBgJbS%>vhaNHI+TzK13vQ?H4c?dVHy2 znqfR&8VrvO3I9&WlJeeF_+e~cAP&3IFveFILlKsrviw`67^^5L19;Y~gfd_1fIFZ@ zaK`dhVd?KgaUx2p*=3owShZZzFxF_k(jKYV;aV1pBOaHoJ@5jLvF8*XAs@uZ095UY zSY@WI5_Q^5kZ-HUT8L6BxE+W@6?8XYV~1|MlxD2lz4}xy8mVKo*hu=2l$Aw1weAgY zom@Fe3FWSI2Hs}O_8akB$uX8wOC?jYoGv!s>_s@btdRPG&xRf`GXJeXho3xl< zWH~g4RVtI*TB^*%t0f1QMnc1~Vfo1-)d+m)N^7|7n$YC6iC?7Ks_gHeXaNoUo5v1~ zbKd)#?O#A!=lXmkdnlGYn4l7;HsxrsffZJ=(%q}^e5)M?ONH8?cv6ZPG^wBv1eei6 zuyEv;M_%WLS4QFFhQazEI3d_Vw*hdbJ!q2S2q%6(e`#s?is|&~lVop(s46lQr9I4I zvD|JgBvco;P0|1QE?!%TL*cu;-OL=mR(m<4>bG(u}cStvs`ganZWO<`Wf$pu;PLi~_=a9{goexwNZs*08%JBWiFi z;`AdYo~z2rwI(+=g40Y_VP?>pah{Jf3_CS@)~-MX8FgJ_CU%BwvsYYBN)6~fWexng1FNuar$)x7miG5}_n{A&fk>RTKCLmXbYX3%MGp;SS`$xKz3yuLJlRYeLb zfRC#rF3z1FHtAxPZjSYM%+8|Tc7XO`B^hfz$-f_zZVxS4C#TVBE%iCU3woP-=X2+E zwfav0#RKUp!d+MyJ*)(1%|HxXe4-zp@0$JOb9~a~t%hJ=w+XaF~dp?Me2#VO= z?Gvydw6MHcs0LuuULaq2df&`;g35G`lVZ3=aFe82?v1ThlCdYc^O~- zlI8s(k>zvK@;AAe-$3dozo2|9w5MOG76d%f8iAPoy18GUOF~^wDzmx4DeLD|`4>|> z795V{kBDo!u5oTR{}LSVd-0##c`g`F~`~^}0IkhzLF`AyJo6IRxCYbgC1SNI2&Q8wk-#ra-;h3aAzQc-=%$~X32IFChyMcE27d1T>uTs zkK?j#R~VS=3OI%E%_*hhgU0s<si@#>7J(= z1PYZF@Q$arGLmB-y-S*_(q)X6;iSUVz}M0_szQmT2t?{%YX%k-M(dUGb-l=yeXbGB z^7@1H2`}g6O&pRZ;$`_9O=d*agOL;~vD#^SdzAFPc&jV2XWZmycr; zfXeq|v7r2J4x{64NSfrXX+2%~U9nr!W5t?35?mqiZLypk49@=!sW<;<_g?y4h@4zq zG;LX*I?B^25L&5>L5|4redT|7J@e&ZHrqFc#*f$j#IXbE!%n}-%LWMg=7c2j&aS{9 z$ZBA40-(TuST>(4#}s9`X&Mej%v|z(wn!OMCMbvC!Ox!+?kShq6-+DcbqidqCKb0R zsaotN-?7+?QpR5*k6$-Bbe5`C0A)K-xU!0)hFq9s!AQja5JcC36^SDm2+z-eC5eRp z!p!|EUvg5cYb+^NrWHcjx;xH!y4o2=nHT^`@tm}hmQv`Gd@;*}Pd(q<#fl}D>_Na0 z)A+RR70sD3Ju;qEBNi7IA=HZ`V!4rv@BQ2({!`gJxnC$c&7hz_`gf@NlRp3&i264q zKN^YRNn~%?cmFP1RiGnaGc(?s_p&K#!AIYxLc4Qt8S0ShG?8f}@JM?}_kc3_7PIXV zLQ+C@?o>pJ`5;6j_4=S|wLMs}lOHVpN|=bhWUf#K8wFso)R~ckX{>M;kVUx_E!b|D zzAPb8XkdRB@h?~dnT|jhZkf4<*vEP zxs)`s_X$?(;0q!N!_WPwwJZ7;ZE^H9yc#P~I2Y|leDC`lkeahjems~cIdzz*KgbA2 zPTqIe1mh$$BjOrevl)rultENat!I@?nVIR`cJe2y3H9QJn-~@5D2J(@h4w0vY3mf) z&7_jCf3Vomma*QPNzD(h##k=n-BP*C3*zEIbrQ7kXSTAv!JN*Q6-?8;gI60ZEVOG@ zNDmI2ZlmXqEaiTRevWG}Me?v&tupuR1PzVDqaLE7!OATq@|>O2M=eAk;{z+7$O=#A z^ivS=@FwW6E@L<73v{<2M3IN3iIF?ijR4%?@ zws;WJ?6!JJX$;%=^5fg5p^=gsTw=RALxXO*pH)bj#l++Zc<`IA79_69pW|Pwcj=a) z+bmAfyeW5hyQx%asLn9-$g!Y9Y3)Ts}x@w*))*9zigi{IkW6lA8y>QuFeB$%8*%hb+0cNAQ4**w?E{Ts$ zystS@QEfnwRa1CVsg8CgdQ1gd#D5SUdUMxX~kbEU)MO zLK?4kGzto7e+`D%sHkY4uQoDfzyFKBnk#C|Oye$>J00U(l#d?F6@rJ#fP{vY)iElEj%T>P*t406W9SdP7c+F85 zoIVLFt3>>uOaxC{YTUt}z10|tXgBkSk^`8y^=C0r_z~i`&yi@}@D~uI&Umt9TU8yy z1=r_CgjXKjh`ULyseCamD8%TZAS0ny^=^%|N<*cF&n|mP4PphT@E|Az18hETdM&;V zzOj9I2<&DPJ1#+0uid}osr*@NwI;s&d-)^r_ur`}WIh3=w*+jn0n4q`=1Syrx zrn0Q6Q?n?`y>%pdbi~0K+QCEG6SX9&EYWD%Wy@m;K$bEp60}!fIw9{)o{gM|^4c#m9V*^$P z{*rRLqYCXm&AJS58y$D2%q962_#7HTS*b_~>>zs{GZ7E3`t$gyA4g%?ete;+Q+!{Z z#2f^;(8*Q|?-xqUnD7`X=dPJF(!e?GJgJ0UhrO&GaQ_9yC%KOtk_L;el8BJuRhMSAm&2Y zWesmFgaHgH_f2;(^Q9j{D0Z}jOMFvem7?a+rfd3SYiWfzsU4!E=C6s>Y_^c7CI2q9 zv@qTyey`e#OewmK`TOZ>L zMC$Hmb1_$&`NmZ1Bb`Tat-CIq;~_2%7l^vf3zBtbm$tmE7*lZr)bGgJ|BnUu&6STh zEuxU0!wgEu1_E!ko7PjA(O?I^5~B&j?!?z?E2VZDkDEk!6-F2P&y<+z>rQ=Q+q_C>JEfkUY{0MDTDi-)?o?@7(${u(6C40!VCaHXN3CIN#3eWXi`*HV>xi zj>Z?6rg#lO)9)?p;A+*){|X$^c}XIe;~@AF&}>&>0WpsU7y5-1$-;fo9DlM6QR!z- zpWKk+EhSJWy|24puQ(saW|!fe=f2XEVztWgX{37dj~!agT0}?9`FAaW7pn|zTTFL@ z6G{9UiNZUMF{ujmNzp`2!$AOB^_r~%vPce|++F@E6&ffFb8Kjo;&YW}YOZ1^5X?A)T;PCMf4>yqiQYK1E5P7X!;=Cn280FFeLOH*?*lm7XxbG z9WdJLE?(grYISDb@ZGO-vT1cd{i-i#T87Q9LCPU%%8o~&+DbP@9^gm(9q5s%epxPR z^^ut^W>JB{*>}(6YQR36ZA}?%8KipTQ=m z9a?%NE(#tQz6z~MLWj@!blguFw`#Fvp{I4XXobWL4g;gl-3O9eM0MPNu9&hQp4uCE zxJMxf=!dd-S3nH9^LT(vm?Xp)r-aXCFX0c5YjZ;neyCH=>mLidjy+bmPJ?Jx{z*f- zqh3!ne+RV=$h4T2thP3Nf6A#ekMF-Ud4&zK?b!#l+>XS`VO4a~NJxr`l$lOIx|eT^ z0Fl&aec|mrZoNBdj2bg_o}*bwUXQd@%2Z|8wjAqf3=Iw6&HqK9Ga3eq^6-qtII&lT zL$XbQLN^e*nZ)v;`ew_=8M4s#5#$Cgs-4SBA01-bEJm_zm<_|c&*ymPk+{z(?g!E zR_bsWM%yl9jj9ZFmpyF0U7d6wZZbVwM1lN1-it!bQE_rL$EYmfMD<;^*2#y$HJRZ5 zPPXl@^8zB_cOS6?n0*zZfCr8zKd;O-YmzFxo{d;IDn$VnoR&db9V|LqojgKoY?lx5 zoZ4Wf{9Pfhn0&3jFsFR@!P`J@s1*b8d~WTC71C2du-i08W?MV#xHe|;J4Oee<4yH_ zq*rQH5vN{tl-Q~sV2N^Jy6NRcXe;%aMrHmi#OGzsShw&OZTvys5z0K4zWafc zFGeioj`T(!?9VWMHqW9<#VvLjDLKhk0t)DtYoH`kDaR@*!#gds?no_hrTDrOr4K{G z{W@M5(QIO-*THQ#oe_vm6~sZr3BkvC6h#~oK@gvYGb;>eJ-~?_2rE(e_rpE^;BRZQ zEXsiJYZ1bQgv^W>)#pMCM|?e@U9?_4V#WSqnhgsz#em^Q&j5?h=Y#3q!Y;rWfbxVc zjOZJP4%?DMcnyuKvhYF3ICez@OR4>t{5^aCUSve^nO@$cUSW2dwdpRvhOrPVKf z;e}VjJFJH^2HiQGlHUcANwX?yy2d|sH)tM*KMPF2#XvB-Xen-UoKol}D#WPh06mF- z8Rqp8qqEdMl;CvD{2#B6u#`O6j&A2QL*Qqv4hdn=3o2f1C-q}mCCcqx$I`OW3sv}2 zGp2@xz&p)bk6NMw!0wD+G*&0+RAL(9_Hy;6LtRNSdlTS!RLMPaG5 z;X|1ws>jF0awf0tYg)|${SEV6zFF|vFL{3B36G5~__Z3jZymRPnOk_tyrP+H+V4)i9`HyLeTPXk%fw2L7vS(lM-{bMNSc83mPmR>Tsa>l#KcW*yQ%SB4 zh`{O(`K6mVs5+T0_@nNNr*)<&Ox@CS*_ysKr>GAbLm{Cg{%}w>c2{>z-1fK0Hj|9L ze;x>&t}T}>Pk2H|J2(dhVP}J)R*rIWd(!VuFViL9G&NUwW(a~_`FTx$h@Ai;vS75BH3#$+dpKL zl!cTsY-Owa+C!pNs)$trZda4_+*TYxoC5-cY`c9y3Xf@;Sn(CX$>GfjjpW#^B+jE@ zPnleB3N`|(c{$}*qc zv726=xrELRvSbNad18^OYphm%vp&%)8=finaE4ftYUjf9`Yw|wn`I$yJeIe)>)fC_ zn?HQ}bl$rI5K~frdLZ$aYqdsvk8YuE19q8kzR%^xYCn&=!6j-(yQ>L51kuITcN{Zv zKroAl39Rb4NzGxlhx_?!N8*`s{XX6n#Na1Wg?lvBIjq0-D2d%grt_+~H#uiKx7(-@ z&;7KJX1h_%R=!$=is}-=dCqs#fD~O#wq&6=pYzcw-T%-q9|s47AYxl8ilJY{;wh_b>IhY&TCY-C3nb$5e!2g#G><~piILSoG{wxuQr zgim2XIm%~gG!BRHaMk&$l&1ifDk})15g0U3C*KUNkV6P*{SSBD3lXW4tsFb*8->1Cp5q0nw z__J0#{wgs|w+rSNNM*G;m5A;Ow6qMc>3k8D9oac5_Q4iJa8t!bqKd;NMqeiD?JY%7)#Z>Hg~8|;X>MiSJiV{k z+v)3)^KP^eL_{82^sbV7pK2nlUda~nS;!*Q^a8_o>;@n*CmrHMJKk9i zBSmhZ{}dYo4A@&4c9}8kE6~wEH|vvw1C1t0B#ETHzr--EHH9xQ7m$I^7^A z!$Q!(T3!a5*?j8hBpV>Cf;5oDF8uw0NB_=oBA0gvZV?Y(#`CvuoWr>4Wd=O-_Y)Mp zcXlkX*sBw9RCLq~sZ$zIea*U5vp36$?4cVZGW9DNFO5y)ZMOCiDiyYY2ppjV*A77t zPCUk@>uWLNAe>=t0LYP1f%_AIUz~=JA@&E&*4s*RI(>|s7{~M^=rrWH9~2(FIjJmI ziFrtB>*3C2VPE-HNt`o(_;-^`>ceMo)(!hTf9Rwrs}kys+iaAU=fuuT-o%PbCe?@p zYNKd9E znaFJTdu4D~ip_-X5YK-Tm3-zyPMhvWG=0OzK-j1Y0f_Ttj)KfUFeFq#qN94*yA9M5 z$ZxWOr2{-8;P^m}?<4;+`kw7y_G32A%ee*D@oGpL)U}oX8t3DJ`Rio`=4uUT_ztK- zGy)uH!CH`~nO4EES8BiyS&Ch-gyGhnKf4+kOnVx~cQ0NTHGfu`0|Duc;s?70j#_)p z!F*J_t6l!KVv=!q|6ba3b(s6;Y%M8& z@AFJPI|Zu~mjiwX3?Kf^dN}32MF7ewLT8IbAs`?eqWcGa(_tk}Ws5He2$_L^%$A~9 zVi|~B9s+0f22Gs~*WQ1n_-cz)-bnH&D)_7}wTomX18l{JeteuZq$tG6<=L^$n$)s$3P7RCvF%X4br5$9{k)rIA8(njptJHz>VV(xBqDBRI* zRv3rtsUC>)$~VuaG(mY;Wuh?fI!i?dVQ~bx!}7*Ol58Uj$l(K77wr5=J1t2(h}@X2SsnLv#tQ7OPkWL*DZPL2Ma zMAJ-VPxQs~fzR`_?m&iq5ETOk8L{g9!FUq;L(-nz)Yn6^)v^Q<5wqNGZ}4Tq@Ozzj z-+NHSm^vC1R#bgEXPSCNuC?Ptj_i2bY?GOcoVwDM25xouS!21Ep0ef;Yc2Xx z-iJJyoX#B;ncc0H54)`}8p~`6!a2gx+w5CILdSjAz1=d|XZYmD*m61*8GXa?7;pTO za3+fg1D*$x_2$=Xx-O2)iE2OP!zWuy6tES>E^%O;trx)NhE9&0#=KgH*wMCiygmE( z3O#(8oP|_}h{5m~;2tU$?QP*$lJ~`K&)QYL2iZQxEb7Y3HL0@Y70aQOYr{9x;n)-J z_|8{vhx>HlU&k7jZ?nX9s7pKJ_OHk<%gn09bSR6}{1QB`dxbhzye5^)ZokxU*k6~L zBq41}1dvv52p3LQ8&9R*aF>{{J$n{3eVt9Qp5F78U>24-H=|<5S=0R7PzL2Lv3IGb zdn#VaXWFJVqt-}NtJA44BqA0Lz?}rGoLqQOCoy;#??|0OS%93A%lDdV6nIt3XU@iX zveng9**u9Jh4{1gpXUq5kE{Y@gBI*71Q5u z8*Xpk6cn}Lvd5B-`1)PV1$OUTR{3H1n?E{^d zUz?Q{8q>QBL#Eo>&64o4_(Uw8jNR(QqkG&OCsdZerzgBW501!6qcFE?2bTAqf>+U2 zKmz@LueWusBC@jc-X;&W8)40`Lm8(|d+o~ZDOZcdKe9NERnN`ev-|K8d&_-w%VlPr zC#Qr;I-Supod%!T(8JhoLfb$BpsbY)VDr_RvBp!V!B3s7+YVUgbRNZ*adI*PO>%77 zUxHg)j&?Mw95EkkoN}#!$2MoTJadiZOI~x|SuTx7HmCF1>V!D53lvkn(w4WE%=a7- zByiy2hr#f2`DVW>5ufGt!4rd!`udb`>rDaJ8oKm(9W63DY$XY=Vjq)B)D`mXn6GYk|x#EI<^QzRWfR&E2qI`LF0*cWE?>uLlF+M8Y3v4v$(eAv_TyjDf>Q;Ld!JC3 zPh~iP-+q7L!m%%}2wWN7TC+o`3hrG+$!B<1rgn|=+Lw8QBVEFN$EuqhiioltzDt;S-ZqXhHZQZGzpf7V zT$PjHL@J9H3z00v-?`%+Z^YB1EU?w4n}%~IpCqm`gB6f{)o_?z7rkQc`+72{F%ET9 z4Ejv>Qwo7?uPsPQjP#LTU&ZU zj^~qcZ2->k{(SV7fq zmgd3lp$hp0+Z&y>C)0mEUzT2rU%5YIo6Btio?~=h%BlRz4+~QzF+)AcN zZerhi&Z7&(`prKiL-QrU5z(v@Z}GK~*Z?R>dN+GWvQd=QQPgj&n=se z&x(lh1Z;mEq2IpQ*M#=(L>}N5yr0*Gd7tc1$3=@6H^$*&=p`~st?tK(x|CWoUHIM~AM$7gDxbmmV00twIl58r^4?imCG zyrs$Opcun%+LxCLye zj?xX=Rf1?>{TNrE-gwRCMT**zv0`I!Wfd+IKdn$6i;7NyDYnkW62B;3_{kQ~9Qb!h z|KVNI_iTE3I4!WK{o@u$CJ*m~Ikx?rkVpsNUn1)zZ^QU&{KbWh@oN?8%4fT1Y}FFY zmB4Jm0?{2#QPra_8xO>@EkCiH$A2(QgO>9gQJr#ln1rL|H~e7?{2!YihpEYJcwqDZ z1YiY72)j>Rz^P5lWz>+mCOzxoL- zJG+ExA*%S|Q9P8csHdW>*v0FIR-Nc-519K)*S}zG>%PzOK716wr!L!HPKUQ^-w>HQ zg=DJqP|lhdfSl@Y-|kgeg*F@g`yJeD)^)^zl9FJT!~}!o?hAzuU5*XTT}LN&Qh|P< z^u4jb^K;knW`hsii!k-ZZ@;l5pXP@q5fUnL5n%RBSfud%r$al$hd} z1_jsvkEB{qELBD1W9|=28#GoZIFe|ayUrgxcMH$54VAR_ZwF=2(AeSI8nF&I?Azcsd#Rti3|&&l#@Q0HZ* zCG8??n`Q=rWogs(@3!X;0+f+vZjVe+u0J5)O-oLbE{nwqLUi0u{;kdh-jo*Ezvf2& z%}qGp)KDeqK}2c<((f-o{M) zt#LET^VM|Bx8b&wF?e^1b?)ZlA7t6Cjtb-A=nWDn#rt}l=L;WU_jl*+J7ay7%?%xf zZs0A6!t>q(9Y}oe$#xoRJiFLIVLoXK>Z}?9nJ!bK>#I@e(0q7LeItJCK!s57fFIMN zAMtba#SH$zCkoUoot>Q%%skJ3cjPDu|5KmOXV{Evk5IjzZ&Y^^MOLz-jd5OMn&~k} zU(W@90!z6x9~zh>`TN9Y`%+wL;lQB?xEnRmOZJC8i{5+ohMjkEi$(hITBd2!$R0{3 zfM;vuBRYp<*dH#Spyb1ZR-7(Mj_+k2BWhCM^_mzAkHNix4)P~0PMBo!?+UZBOF|YF z5s#;~*fy)^wCC@0zqbf4$s1!l_sCsV^bg-!Ml==ovwZUX}8TwtH5T%?Js5>bWJ{R8@JXmLZU0oVt$T8TCG zWn?Q>D#~zAwM%6N2EOsW`DOU+ck6O%l7@VM=XVNGicKcyQRiEVz{{EC#E-rX4L{}= zoL+vnx(^B)BptzFDOL&>Hz(l!5}%x&RU#xkPG&w89gm0(^uk=^tw0iB_-%PU$nc}$ zwtC)bi8I|~*cKQr?ByP|TJs|&{zl6%=hi^J`-hTrwn6T*RNJEQ!eqQVR{V|geD9K2 zgFXK=r`{uS5X)EL+~H+O$M+wyAG2fQ=&xIdohi(#MEA99o7UwS*;EIdm* ztJa@_5-t{!K+2`{hEWDDQ-|xz9WFvJk);jI=MP~9@emdfD|XHc1AccDiKOv-(A$V{ z)M1ON7A`L|7?2!+?;pz?80Vdry!kNSd%AW1`!B!*rodCEv`dl0waqjAvx}_Qk=!Lk zx(EX=(i!G+-OVA+uzk}mj2}Xg!_lOhbyIg?egzW=f>2-)(17|Pe}8~Z2H!aCjpQD3h(+{z4@FpeDntAiZjYxyc_G+o_*tI z`d`Y=ro*XM^DCIHtf+ty9K~|%5Osz#`nt{`ND4kX{g_vToxr(&3WS`h+l$vHl}%jmKSH9tj2|>hGDE|K?GVyY7N85ljv}BXPM@wHjZfjHxF2`P%;1&3%8f zy+3dqPY`MCa$Tb}YE)^d9kWKOX00lUqOH9`xnf7nnk81bV#Eq+@6e!>YXvnbLP+eb zC|aUl{*CWH@I0Si-sil}`Mh5bshiiSewEu%vA>?*9eM>-=Y5~_b@?oMH$m6LrgA88UUR72%^)sHL6Z9q6D5bc7#-QRLt`#|l9|r7Uh)dZ&$hicZ=;6527M z+t2k;vrD9C^1;vRHeS2yb1cjeWND`H4t#oelwwO~W3zf`kGyX!(~Rzb=*1>~c1PWf z8$iEeb#_8zBb&&8L^A!h%*}n=nRa~Z3){u|v}Gu>12v072K>5(7vBYEfEs(ctVl^P z)V9ODn7IE!MH)w4?6kt|hA$`?bro47Uvoj@kmG z865G##F|Y~Mi3L?JPDm5gz@}F@tfgYm__y|{U<+z$v;FUQEhNuV+CcJ*-!wv^xtyp zs_L96_f75J$oUf=%!8Nh1_|cQ&+P;>0M|Oq@jx0~p!(b~*yLBCU`$SHB4n7s`0dRu zDfU6yzz0R+BoIQH9ozNF{ps=Ae9j~(=kWYAZ0$3_6i-pXo|S0~)xPR65QlkzF-J>A z534UnN;sph6{gtwS%@p2yt=V+^Y$F-MS}BLjw#BzXEBux#z~7o(rk46dC}mUUEGED zt(UIl>4eod*D4O}_$e&#dHlIGc+#f!FM*;fzsF(zN3(N}4wQ0-YaYgncue5!W!n6E zuL+J(>yJA465nX|{=V(`Jn=n_aUf}5)v`RK=CF*ix4Sj7@bzSW{@ADpt2E3L9C2#6 z7D_mQ+7a>?&Kh$0y@yY$_1A25ka0(A{$qHT%M%>5M>#o>5PElPuS4G~VZ(6o1Qk*1 z4^n=$6I&-TLhO)N&n>81VAJEqGcSiouI0C3DYf0avm0RVd^35@xg^u=vj+H=FQJ&? zc4Sh7{fk0ZN;JoBj9OF@TZg0>W&DB@nm@rfUuz!0>LwJ$1A=fQrC2pX%O`LT=V`hY zi$;vH1z9i*0HF|@>z3b~5%6UNU|t$}X@<=)1N+J~^I_K$4w3T1t}gP#&$-sq0JSa!Sr zjO7rzKqe8D4JD&zsexVIc~osLPu~2bpbS3VJxSNhQsE`~Fv zN91LC+3b78XfgOlWIg_b6mD;vs8xFKlu4`D|C2=6f05;ARd4yxq2wqDgr-y&w`z8h zL55&5D^2_g+{@N!7(CCz_VCmY6lXeM)k2>dlI? z_&$NzNS84($$pEKPgNw+b?MAyaW3|iMEG1z4xTz9d*n5$G&o|PW#-4eMXUutqgNPz z2`kYL9k%bK+2lHZ^1@=@aI=QLqo(D~f_l*c70@XUf3FKZ)8Z5(+LI^ET|TO%Jxwu| z(MZ~oH`QFC;rYIy(4>g10_qvMWf&RNp}qlnRSg~?ou9a`8dyR?sbA*q)|@y`Qh}Bu z)>hj-l$-*;Jf2>qsxANT8rDp!K`zG;s~s3)f2J zt|fQZ$AU+Pnf-w!eZ@wxX~{q#@@G&MAU1(F?}s`1rKasH;KJ~*Xt>TrR~sGv5dpZTdCSyyBAAxz9f;w zqm|6pOC>qHceMSXi!oKifv1PB!o{Zv<@Bpw`G-@tnT|#2wo4rPpVC0pW^f`Ir}0uP zDRyyaC2CDpWY%!$*|(Zs%GV41_EFO+HB~h`G^P~m=Q@g2q5;FjInB0)=~Nu@!TV`a6;>iHL* zD|hF(WbIQ()ta8KKMp@1v`>>s$lh1Ft!giJy~R{=CW&+J`D>J&z9&)p=+=gYL7$Xy zjpQISU3T1eFNjqr_ZiIrN&C~s@CTrr^boXz{m`{3<&c}+mhDN_vLnmJfYbr7;11ETabh;1 zYu)>9X>zHvqSfwKYMu3ruD=x_g06=pi8JAL1H6G|%g!3Cp|VZo^4|odOfJWV)KiFHQb?7Y?xW1(u9jbCMc>} zp{>S>nYdJXj{w8^0!yS>7Qh!XCZ}2(UY$`PfBt5wY+6b;GD)h+{dI7c!-aiJ|1Rvo zp4gGzC9D*fMgEE*#pwRh>N4AdwbEDf&3a1@F_i%M2 z$vNTT4*rK(G`uZ$VdK!M`(ptAM5NqGjcBR<1WGF*;vMy)kWW*yufuQ_`^3uxEI2$u z?6*!XS$?)o_maeM%wf2}5`~g`pc_LXCciY)Z{jzNL=gAj=fuXsf>e`~$2v9`Ht9{9 z7^^@Fl5K@f=P0$#Zf5>30mkUNXK~%{`*heg@C{{N7}A}Iow)SW4xw94FzY*9Qi@+^ zcslGqh(se5v{P`pA?*HrLiel;mEtTI*jF*Zfa|`fThKQ+L&T(o=?D8s9UZ11`s3Ys zg11F#u_Y?tI$w#~?t|==;Ci+jx=}VQVaO{jJY=IO z_PnWR>;3&3G|Dd!Hq!P_{%Npi$nWmgVuc}N)Y=l?3Di0gBEvtAG3I}7fBpNPFhI+_ zJutvbm`qn1(&ChqBW73FF)&*aKqto_iLd)>0wg9k#W{b*dg3~|tBQis(vaYP4qG;S zb=*SaK^ADUdopfYY7O;>&#bd5)eYbj6~o-6H??He`hPmRxM#SWhKz?L4BIh_l008D}{1nc$Z!wgiKdx=wlh|{ZtF>#b5`GIS z>?{%2II+eAk&IE{>NXRe-A<3)bG!U^TWu}Wd%zIe&4&m}lb!kv86_$(H0%JEB@Iwp z_avu930kPG07mwLPt(g?8)MEaED+P<1~ z>e&-!{$DN208kv&ck|GMM5a*=c)#I0=wAb0=(`kLZ9PrB02*%B9<;s%f@mS>+p<DH_XF}F2R>J>+0t^%soUx;{xS8uEOA}Qqa91SZvbjS=B=@YLn@X$ zPm^%>RbVkdgwSqAx)Rf(p(7p25?xmiT6o&d%ZmLg2<=OY6Oo5w@d{z<8aS4CetLzl zk*sC*lIgv#Y_&y);4HC_D|&6eDjU`hQn)13=)CJc>$798LZ{Qi?Mqa-mvxW=o>)S+ za1{!1U!C^>;x6k{xgL9_(a@_9R_<`O72teX2O2iR%D+IaLJK*8Fq`nJ`v2Ewo~s2D XVf|X8HK&&xA3#^j@Nu=KeZ>C&t;sPn literal 0 HcmV?d00001 diff --git a/frogpilot/controls/frogpilot_card.py b/frogpilot/controls/frogpilot_card.py index 26836484..91716cae 100644 --- a/frogpilot/controls/frogpilot_card.py +++ b/frogpilot/controls/frogpilot_card.py @@ -19,6 +19,7 @@ class FrogPilotCard: self.always_on_lateral_allowed = False self.decel_pressed = False self.distancePressed_previously = False + self.force_coast = False self.gap_counter = 0 @@ -33,6 +34,8 @@ class FrogPilotCard: def handle_button_event(self, key, sm, frogpilot_toggles): if sm["carControl"].longActive and getattr(frogpilot_toggles, f"experimental_mode_via_{key}"): self.handle_experimental_mode(sm, frogpilot_toggles) + elif sm["carControl"].longActive and getattr(frogpilot_toggles, f"force_coast_via_{key}"): + self.force_coast = not self.force_coast def handle_experimental_mode(self, sm, frogpilot_toggles): if frogpilot_toggles.conditional_experimental_mode: @@ -89,10 +92,13 @@ class FrogPilotCard: if any(be.pressed and be.type == ButtonType.lkas for be in carState.buttonEvents): self.handle_button_event("lkas", sm, frogpilot_toggles) + self.force_coast &= not (carState.brakePressed or carState.gasPressed) + frogpilotCarState.accelPressed = self.accel_pressed frogpilotCarState.alwaysOnLateralEnabled = self.always_on_lateral_enabled frogpilotCarState.decelPressed = self.decel_pressed frogpilotCarState.distanceLongPressed = self.very_long_press_threshold > self.gap_counter >= self.long_press_threshold frogpilotCarState.distanceVeryLongPressed = self.gap_counter >= self.very_long_press_threshold + frogpilotCarState.forceCoast = self.force_coast return frogpilotCarState diff --git a/frogpilot/controls/lib/frogpilot_acceleration.py b/frogpilot/controls/lib/frogpilot_acceleration.py index b91703bc..e5400256 100644 --- a/frogpilot/controls/lib/frogpilot_acceleration.py +++ b/frogpilot/controls/lib/frogpilot_acceleration.py @@ -64,6 +64,8 @@ class FrogPilotAcceleration: if self.frogpilot_planner.tracking_lead: self.min_accel = ACCEL_MIN + elif sm["frogpilotCarState"].forceCoast: + self.min_accel = A_CRUISE_MIN_ECO elif (eco_gear or sport_gear) and frogpilot_toggles.map_deceleration: if eco_gear: self.min_accel = A_CRUISE_MIN_ECO diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc index 4da26987..ae304571 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc @@ -7,6 +7,8 @@ FrogPilotAnnotatedCameraWidget::FrogPilotAnnotatedCameraWidget(QWidget *parent) curveSpeedIcon = loadPixmap("../../frogpilot/assets/other_images/curve_speed.png", {btn_size, btn_size}); curveSpeedIconFlipped = curveSpeedIcon.transformed(QTransform().scale(-1, 1)); + pausedIcon = loadPixmap("../../frogpilot/assets/other_images/paused_icon.png", {widget_size, widget_size}); + speedIcon = loadPixmap("../../frogpilot/assets/other_images/speed_icon.png", {widget_size, widget_size}); stopSignImg = loadPixmap("../../frogpilot/assets/other_images/stop_sign.png", {btn_size, btn_size}); loadGif("../../frogpilot/assets/other_images/curve_icon.gif", cemCurveIcon, QSize(widget_size, widget_size), this); @@ -149,6 +151,7 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil cscSpeed = frogpilotPlan.getCscSpeed(); cscTraining = frogpilotPlan.getCscTraining(); experimentalMode = selfdriveState.getExperimentalMode(); + forceCoast = frogpilotCarState.getForceCoast(); redLight = frogpilotPlan.getRedLight(); roadCurvature = frogpilotPlan.getRoadCurvature(); roadName = QString::fromStdString(params_memory.get("RoadName")); @@ -220,6 +223,10 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState } } + if (!hideBottomIcons && (forceCoast)) { + paintLongitudinalPaused(p); + } + if (frogpilot_toggles.value("radar_tracks").toBool()) { paintRadarTracks(p); } @@ -451,6 +458,36 @@ void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControlTraining(QPainter &p) p.restore(); } +void FrogPilotAnnotatedCameraWidget::paintLongitudinalPaused(QPainter &p) { + if (dmIconPosition == QPoint(0, 0)) { + return; + } + + p.save(); + + QPoint longitudinalIconPosition; + if (cemStatusPosition != QPoint(0, 0)) { + longitudinalIconPosition = cemStatusPosition; + } else { + longitudinalIconPosition.rx() = dmIconPosition.x(); + longitudinalIconPosition.ry() = dmIconPosition.y() - widget_size / 2; + } + longitudinalIconPosition.rx() += rightHandDM ? -UI_BORDER_SIZE - widget_size - UI_BORDER_SIZE : UI_BORDER_SIZE + widget_size + UI_BORDER_SIZE; + + QRect longitudinalWidget(longitudinalIconPosition, QSize(widget_size, widget_size)); + + p.setBrush(blackColor(166)); + p.setPen(QPen(QColor(bg_colors[STATUS_TRAFFIC_MODE_ENABLED]), 10)); + p.drawRoundedRect(longitudinalWidget, 24, 24); + + p.setOpacity(0.5); + p.drawPixmap(longitudinalWidget, speedIcon); + p.setOpacity(0.75); + p.drawPixmap(longitudinalWidget, pausedIcon); + + p.restore(); +} + void FrogPilotAnnotatedCameraWidget::paintRadarTracks(QPainter &p) { if (radar_tracks.empty()) { return; diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h index 04acd9c1..e69fcf04 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h @@ -52,6 +52,7 @@ private: void paintCompass(QPainter &p); void paintCurveSpeedControl(QPainter &p); void paintCurveSpeedControlTraining(QPainter &p); + void paintLongitudinalPaused(QPainter &p); void paintRadarTracks(QPainter &p); void paintRoadName(QPainter &p); void paintStandstillTimer(QPainter &p); @@ -66,6 +67,7 @@ private: bool cscControllingSpeed; bool cscTraining; bool experimentalMode; + bool forceCoast; bool redLight; int animationFrameIndex; @@ -95,6 +97,8 @@ private: QPixmap curveSpeedIcon; QPixmap curveSpeedIconFlipped; + QPixmap pausedIcon; + QPixmap speedIcon; QPixmap stopSignImg; QPoint cemStatusPosition; diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 10be8188..503c029d 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -211,7 +211,7 @@ class Controls: cs.uiAccelCmd = float(self.LoC.pid.i) cs.ufAccelCmd = float(self.LoC.pid.f) cs.forceDecel = bool((self.sm['driverMonitoringState'].awarenessStatus < 0.) or - (self.sm['selfdriveState'].state == State.softDisabling)) + (self.sm['selfdriveState'].state == State.softDisabling) or self.sm["frogpilotCarState"].forceCoast) lat_tuning = self.CP.lateralTuning.which() if self.CP.steerControlType == car.CarParams.SteerControlType.angle: