From 9aef7e06588c2b8938b0ce5d8a774eb5f9eeaba5 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sun, 1 Jun 2025 16:57:04 -0500 Subject: [PATCH] Mochi's ASCM|SASCM Port --- panda/board/obj/bootstub.panda.bin | Bin 14876 -> 14876 bytes panda/board/obj/bootstub.panda_h7.bin | Bin 16944 -> 16944 bytes panda/board/obj/panda.bin.signed | Bin 60872 -> 60824 bytes panda/board/obj/panda_h7.bin.signed | Bin 69648 -> 69600 bytes panda/python/__init__.py | 14 +-- selfdrive/car/gm/carcontroller.py | 2 +- selfdrive/car/gm/carstate.py | 113 ++++++++-------------- selfdrive/car/gm/fingerprints.py | 6 ++ selfdrive/car/gm/interface.py | 11 ++- selfdrive/car/gm/values.py | 11 ++- selfdrive/car/torque_data/substitute.toml | 1 + 11 files changed, 70 insertions(+), 88 deletions(-) diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index fd8883743112cc9c1b7b108ac26ac657d9e5d1ef..b1e0b3f7409f820118f9ff9bc2c9b418d2956e61 100755 GIT binary patch delta 21 ccmbPJGN)w2En|+9iXz?{LdZLprO&?iKJSm0&*yv3I%m$A znas?+=WdA0ZisbWj|eIGi7?my7m)w<>+=!Ref-S@gt@bzbj+X9l0}38L?U7`M9`u7 zUC8Z2lp_u!`odKre*#gBIE^@u_z5A{8<5^WH22Da&h!HR2>CXI8DT?678Ax9;f|

yE){BZvSn(Ng+8|133A7uXL-eHbFwCo8g!Q!2Dn@yOocOHlbi_K=tfx9m9YF}5ZPaKtY{!iEutQp z?WfRS7~!Ch4oPsUbbnT)A6{Q#@Pma8{(9CRs`NLwx5l};)X*VhNFnbx_xm<7z;jX| z??1Pom9_t&O*`QGwp#a1d~90k%KR#~MAr*N_pl#bYjwYg7fsSi>BRFU>BKsdz3#Rt zM0XQ4&WR6APL)oHf0&#SO(vo4hkC*`VKzJ_x$P=pTo5C#l77qrWcDK}5VfFSu1kif z*YiWc#`sI?QP+fMMG!-n<64TNbi`>bJ_DTtX#h-d9w7;2^Z5WMaaKy*t`UYss1aJI zb{?S`=4O{@r|Zktt(w#bxg?=ooalD^Max|9c8Q0l&I4!`z~bQQ#TcjD2#UV`&qF ztM%CP33Um5$$-Xh5!HyJh{nf;X|KFSrG5G~K@XLh&uE|_b-3KY-nCW8#*iEN4@wV0 z<>)9{1dm7WkbHszdKQYK-o-)m9CO0)9?Cp|frc@m)XN|lJ3&}M6Sdhs!ESasm-r2Q zh&q(rz=x_g@aqtHY8!XmwgczqrdBQqxQ=TStlE{>CVSisnq-(5ohQNxzYr_KXG?4* z4KgH;my6JnJ>eilooD>#_^gS)PU8%_5<(@?XBdP11;>%(yS-{?m{d;1!;G^aZ}ND3 zL4I|x#+Z;OUqe(&>qDB3x7X@j>W{Y*y|P~W^n!A4^bn-Y9($u>>M482RFHEzr=Q6F zS<|AIW4~$7&%{5a!=%<_qR9AkT|mvJ?PQUKGulQbM(A8FsC72(R@V6O6 zYwwEI>d=J39Je)0)eQ&kiV9->8K&1*ubX@l-skb!k#jrPEAzL>xnYyWl_ME8p2Z6E9M&$RX#U4cUSbF zetxdF)m1Es6scMo?{xDbRa4_9CZc*^r0jkZsd?yvyMnOB-^3AG298sX)7PM8ih@Q# z^AvA-5p3O0@2L^;6J0m|@K!2xLSbimOUg9)9IaQ#Ioo?Mmt}39joi& zmP7T_aLGfA>jmbib7%;pCI?G>x}yZ5hm8vYNRFV-;8OBHdJkHXrwskdQrqSdbBe^( z9Be03W=AhfT#yTVpxc=?ZU4ExX$GPY`a2ABrbT-1u=eB=fRPS#_6+f;imYnELk}mW zO|*}JFdKL8GM!ELw|>#&^Hzyr3@YSeFvtgJSFN$b78Ji{4(Ek-K=N}ccGI>l(bTb z%Y~j2uUh)%UR_OD3y%1*8-!T^$MaJew4)fOfU$fvMxy1%3eJsRQs z^knIj&d|g_TuXv&E~rw4!)bTwxPDWACCsaciwOQ#xS#q@=^2a9U#>=opD~Fx!>$=V zQuZc}KcWnA2F}i?rfyI;Q$cM|K65!e2OhH&^aPBU)ka+*aP}se43)F}adWsfI~iv` z`1LAjrr9e|fk_DCybju4SJBbnGiTsHwe43dM_4x_qUs?#tz-NT^{dn2kdkdYo7a>V4)-3L(} zG9JnmBGoz))qZ0U?lSvKBGqZ5XjqML{^EF379Q7dCVez+sB}prj!)E**^X1qR5vQl z%DKS7B{O9iww?SC*0-|kWO@7PmD8iAkE_0yrL}TNFmUNa$HzR?Iiv4quzcwfJPEHY z4HVH%5M=~lNL9vs_aOG7iG-T!30r-S$7Wk#Uq+}$pjx6k(-v(PWDGiK=c~|Jxn^k2 z@Nm9k75UmJ0#LpTwhV7a4-7vR!(RaZWsy_`Y0Esrbr$0H(6lGoVifyQg_V1c7yH^d zy6c2in~|S%KZ)syQNW9QH#*vP$6E_WmQBDVVdctgJt@xyx_l0(??O*p6 zHxjel1sj%!haT+s1$T^2?y*hm?A*Ou1n4@sdp0r>XOwkJEaZd8c@t&L-Cn=KgXM`> zb@&Q@kFPqlPh(i+py|=o_uRD8$5}Z)$XqdkhC=xYg-oUXp)K0p5N)R$s7p7Bf(K%3 zqUhx2!R-~EbUw7NNTtVMQf5S8klXD?-rbAb%B6Hs-JrNHOog~2h{t+9ORatCs@WUu zW&D6wL1m^V{RrwZ^Du+)Sy6Nw6lVFWiY*sS+Fa7=Knhkkf6oRNP8M&N@;#sB#A%O1vuF(Id+(Fbj`$;ZTRr z>|{xhdM6&|#o0q?Ayj62hd=MQj+?b^4T&eq|w+uE?C?V?YJ2V^=dN~b)D1C&tqm`3A%u9*^W z*b59J@?{iX+9nlja<$sDey2=(;$3{zI-YwDEd?670A%ZZA}`w9{7OxX&cf}qvVL1k z6+Bf(R#KJJxE_-j#up^6Pq1qect8H_#DauDb2+@X<)b_pR<0jPcf;=WTj?vHDpaV0 zZ6sjqGl#F}@HQb1F>_uvJDs4j9zD*B-S#i(;2w89y4z!OvcbB-1iUQN6>9LDv=n-K z#M=hN*|-nQJMW5APK{o1W=;#LqOeJ4v7SyFWpC9Uxpf5j$KM^fbrUJk;sv3JFl!Lc zQ5F`8^a)}75Ivo&>*`4$?PwH66WfIOybp(qnul!d3Rq+27@K`u#@(6d-+emcQZ2(+ z!qUw~9lnKpysN#kx745-YQ{o&H9b8HVY2KkkglAEO+%{);E1gS%u=pmfx#)(J7sTTtt!4Lnq% zRkV6{aNk?*nk=(sXvMmHCK>vDXf5MM<2=07<$)4diNDCNKXUKE)=jbzd+=@JE|$Fc zGG+6y+yjUo5&9n~+m6)kDPaN-!u!xTq_YsK;pV1D`W47FpQY2`_U55@&vPg)$Gnde zkCV>e%d)O#Nm^Zrg_{bN;u3loir>kJxMFFyvuoIZJ^y6s;J{X4Cut}|>6~RfKF?aR z9h@2pkgK&^;fZE?x|s{_T!-?v5czJPNNj^e?^e(R7`R1A%OG-#if)I+TSm|v*tOqK&{A*zaai1X#D|E32w|wnBhu9Pt%L~M>ex$!IcCT%&9GAp zenc3GZ{}{p3G09~0A)L*YyQzIgLOxZe)>bgNKqT7CagWuqz8l%XrEk$vf~S~9r_E= zMuznG|Nh6{<&pP$+V|P>QGU_?O0S*8i=u>(d1Tog{OpARdljS=Wi*gRMYjV9`n@MW zpPY}fVE6JNtQe^p{Y6OUdiVI>`wc(UpnOQ)BjX3N59ZMS0P6=DQD+OhQuYeICoC+} zD1z?xII0KsR5G=>XMFnPBB&~xsefqd@$wo*SYh}C>S z!YT>VunVJ2#=~zSVQLV&A^YRSvd{AI^VnB}sVXB(33@I>k5#V{W;s0hc&l_Wa-~NJ zGw}eng^~kvq!cwRM{v(W|Ak;a5H7u$h}EE``2)fnhp2<0vL&b~J&XgolQ0V88xqip zxNg{RFh(SEz;1HBAk35P_|+EGtFX%mq~(U@^2apl(%aZ#6Jgrl$5BIdU_4>65l1HB ze+qv&|Cb%Y4tW^ZLuaV>wK!~Y2$S58ysV zu>H$DE}rFtiQk8wI{en0Wap^AUc&tAb!y)yC$|D-QoZ;u_62fdi z?WJh6A|ByH2)RbZ;8N8c`A;_GMuQH zgsGf?O9pM@bMPxR>PIA_4`Mdz&f&dD=!B5pU4-Z7*ftP-QjwM*DDn%ZVLj+8#3@F2 zAn%D-f@7Y6kVg}^_Jh0r|Jjyd@C*_DD-S(-a+tgt2Lby{!&=G_rN|d#;GOb?TE?MI z73zf?#$zo)4vXvD!yH%OM5DfCG1h@?nV6ld>+wtveXKCe@XteNm*-7D13K+jF^ z*N@fM4_bNDA@T0k^f@;{u}XS2uhS{W$2~ZRZ;_POo*20HPuBr?Uw%91O48BG{Whx? zq#kU@T|I5dozRe+qG@$or)2g delta 6639 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 diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed index aaed145bf9be1f227f7c4e0afa6c0b1e9f8e4931..58c1fe4e5d844ac6059016a77d0d56361a837af8 100644 GIT binary patch delta 7800 zcma)B3tSUd)}K2eFaaV#pb$f3LU%Qn1>sY_)<&g{lR#t%4#T;-i%+ zJ!-Yps#RNCwKYajRuO!yWz{X&>Z(;+UA58rD2j9@K*)E7fS+x5zu(92_n&jm{y+BpHvb3xb8n#jjGi_8PqJtA&$d&sJQ>fFEep=kK<+@UNKO6)HKG*a4=tis z@TqbtA`wvMR4obnlxE^wD0VL>#rJ&tx6+JgzG$pM^4(;=(Yn&&RI14zl+Gq{3Czx3 zz>P=yNn;5TiGBpc$`^s$Ae<^ zZH)sm&RV2KX-11hnsM6VtpCvxrN4#}H^Y64tI^eP*WzlhSeP`5op_C6cVkYxjAAE$ zMl+YN?erNvfYBl|3$YNf62y|r;t=g(J``?Bf~6Z#wi|H-aTa`BtBJp9gKGuB3d!9U z;B&2eI0=I$_hI62wvrD6tGily6^-vBx)JUWE*(aOz*MP^kN@XbJA>?ilfFNHSz`pO zkfy_H(&xxXxGS~Gh5BY)qS$e0I~g$xu@JEmh(`s+tMZtM&j%hVoE;CDifn`!nJ-Gx zWooSRY?-elid~*VRMmVm)XEZ2(;}NoLLkxejAS?ZxsLD#&w(!!EzB4g8ydq_^Ft9@ zS-4UBw63y7k%6~RO+ww$cGAowI5tp@J+2H)M~}f?*E}QHY4ydaf}S=|fz^B@czGM# zqAJaL<`EGs;iI6?TaEmoN0f)iyax3jde3!<$|A!Aou`i?GfGPmuIxij>($VBCr-EK zc3h+2ulRsiKR`dH-ea7%b`5GttYAabqE7N?vC+;Qw3EOXeVE?PePi#{JG__{_yo`{ zQ9AN`H3rz~>m_*_02+NYo>5vxyMiLIt8_FvT8cJSUv*y+$n_?{>-=x=y-CC!5E4kI zM8QIc+TK1SHnYt>R7fU^cORwxSuB#L*ty5HXOo!ex7C@<18G1kA&?YMhqJML9~mm7 zbR{5K^E4%`TZ5eosAHus1uX0r*I*$cR

Ml_L4w?LIIxhG zzA89I2z%Fy5EGm!7gGN9lp~z~xG{yjMHOZqHUwurQ#Xa+q`wZm>$7pN{KNTnT ziL*_o;ztp34#Ww|NUNzfA(Vu_jXI$QlCe;j@}wd!rHv6mt_#j?v@G8EQsF?Yn959>-Jd3S`h?R(qh~0=Ii2I1E zi0&`p({ag|!|icbaAQ4|QBLEwHY!Vw&+IHbfJ`k}3K})HU)n~HTQN~1kOMC#B7ycl z-zM&+%dbR>rOmt0DZ+`Wl=+!_rfemWaPw;3x%o}~U!du=L}^89W8_ftSc76dr6~lr zsjAFdma5WOfhS4}^aE%-U|bT@ou6EPeeme|j>@92rq4R4*Sk2oHO>&P*XrHR*tviA zd}Fb5D{Yl+glgWW+}qX|J+``3HlJy@;=-NRz=EkU6@Ri_wgim*fDfWP^&jwRtzW|j zd>~6V%r*VH?07pp(0PcnxsHE>Vh<~fBE6s9{kmHN#U8hyOiO8gZKc#%gXyr9O%zL5 zzm$3lQU7Xj>&^LIYhIbC%|j$kpf$HI-Ry1Cn(LRgTPV#vGhw&jhA`0`PdH%`bi47y zhNPUsWgD3##W7ZiEpNjA*RQ@VxAa!rD?llval<|Qak+EuunJCgal+fm;U zdy5+di?84T_G^Pt)8)QBoy`_HP)O$oYlNY>-Q7870pO8aG+jx~K<#uDIRsx%S16!! znZ+rPQuS~+{o3PV5Jn=*^X0Do8P+xu zw#yQ?hi0@;n?Ky^?>z$ycml+1@1Ul;pJDL;`VubY2a9*3#daXCPmnI|iGJ!QA97zW zBGbYA`Y0*;70vh|)+0`Waz?iFkuAW$>ce{@o`>ogndByXH$x@8j~2HO)4!&f)j$fu z$so`ad@GH%B^ZP$6EYkKE``H9OY9Liwoy2?IGiFIha)M>Aa?k;P>J!#jG0z45OQZNBa`6ntYESnJZ5JT9tvk4 zkZ$Vq!?0l(wuh?(&6}F&TisF&D{2*Z+IJ>t_u|b3u>`RYYTlee z65!^WH5j|FNTZ}}Y|6=f`z^Z14eG;vJ$STiLllFtD3!E=wJ3&kgQhqJi!!CSi3|p1 zNs)A;k!FO|eG=&r*ie!|8o*MLB#zrBOi<*Ue3Aw*M@5FifjQA60B+BTCDkCGJ5?UR zE_=Al^~VQsW$eRH*B*}RB>G`#Hm=1~H#b|j%H4ZwwlqT9!%0yw92Gx8{@V>S)d=i6 z+KO|P&ZVM)cf|SQ^gn+WQr~gB!rx35q%4ro)6&S3>$&n2WAB!+wS&sFaWD1g9-Cu7 zNv7I1RW?Q~H18@^NW7bfno=*}S7~+Eb&toQ)~8kX_=eXf$r-IjqjFnYq7>$vc%(0f(0Re*XCEQzZ!LnA!ng)EBuWFV_s}!#CDJ6fPAd`(NidVZ zz+z{OQxklv;>UtJOUw>Q9nSV{A%u61L5YjM`&y?~O=lcA9sV z34WU;lxB;032tqhEwtu@nI6()&YO{L!MjQmbk7@!yLJ5hcybHo&YvR5=7~NYtE_>` z^Iw%G^XvE!Hqf~G@Q#iXb0;NFN@~1Qtg~@NkWp%obl8dB4Q)@u*3y}z4y0w_G~Eqx zWnt(tw=B;yf<0@YqAjfy+jxh^ZoA+@SzWRZ`rt4*j; zQJaJ$V-1BWWvAGs8@4IH>Cc~LU3SSMbJmD>% z)u!Z=<}Ibo?ah>(+YGiv6_`bNMIwoV!xf>L&#Y%GI;^e>RXtdw!GjRjU=7w-xNyWa zh~oMWM>`%U(n?K?wMo!yGm6UA@-ftj_GW_b5ACL>jDw78`Jt4b(GxGT#j@~XyvDG2 zje)|-SHuz8b-Wf%Rfdwy@SsvTe4zC*?nm#&Zc5ge)n)5?J?WnDw64$7I`kA%yc91( zH%piDF_2UhKxRX3RVsehyx}i=QhZ(IqiE&x3O>cFHsDIZ{Mo!5)MQB;crFWmtWvl{ z6_@qelEo^Itvq3a1%0sx>O&!Bv0NU-rW9;QmV8GFQVJ>y{6>>F-5^)g4uHJHdvLSz ztS-W5RkZ@2o2sYc1=3dSOGrNW)WlSrwZ+b-HSSFp`0exsemC94b?_JXoir8P#kKKX zFNW!33$7HdPgOR=7KG_vow+{sG`~8DZybHsQD)(1Tx>jd$>RRr4OroLWgU z?;&kLT8H!;Y+YF%py(Q_Pr|DJ&kgPpcl=sXpucdpG$?TNDgKs<=e!}Yc9h%w&LR42 zeF5710?TTZA&ROBkGTIDNm?T#%t&1WSmN|*8Dk}1uj z)=M}kotzAsR{3}~bPGB`bJ21Jr-C-!UL_}3ar^2O9uN8B7Wcr9((&F9#B&z-ur7u) zK}($~zLBr9FnTtqiz8htEqi&QO)wIT)LfaybF=IfhRU%{*M;`$_JxLuv4e6rZZ5wF z`PV@GK{#0n86VVQfv=qOkqT(LF!BhLoc47KKOoAq2GyMDtK4tPxt{dMOnnkB7uH z3ZH{EC%q7F(pNf^jqDL7N)5Bu{219{3!Be#gL;^>yr163zQP*af%GauxHbrD^%DAi zjQm_EU7Mg{?LYGFi=FkY4K5v24jt6V{R7W`Dx7LNS6P(S$$bbH)@sN_AnO#txi%No zD;RNuJwQzd)$ml@Ba3K=uI>Fw$s#;c?xUvoIMb^@4MslF1V})+EFUwmAdeqO*-UV?LS#GqXDC2>qPpG zEb=regy&9l(?RR`Ozb_-HV}Is?)Jv#At?G#IkXkO=qQHL_TcE$_!*svaG@yeJ4kB~ zUm%3f%i~C|A^1~p^uzO{8DM=V*$s!+Z^A2m_J&01-)-xQFBgm3Jg80%Px}ouLtck$e|o=z?WvNzR{K)AQ5&LhTpp3kCruF4vN;fBC_pG**c)WdUg z;N~YWxc~TUj+Mu6sMlZB@?)mO?4DdEyS2FM?5@AUe@jVtj(wV&QED$s}IfwWZ0s zEp;I4zvAn6f0D4Kk`D#ZzVYRxFZhz z#Nof?uZB7*J^z5CCjERf^1=|ieHN^ol7__;s&XGEzys+d9OVF{6!Kn31joKev(R2xakEgaK&nH(LQ>Ol<@h6| zaB!|jw%~ew4(VPQ8v0=45*m6U-EO+Di*si3^J2B}aoRjMzb{LE&49Oti8S+I2F>J- z#ea&)Fo-MugUXa>3MCRBWFL9ZOeoCWKbMrkjr|IF)j<5ct`c*{E)CeW4xpLgXyXMw z2WH5pqC+K){82vcfPxlrLyDz=wFg#78?n_=j{A5C%~U~5{Z#2}lqgYBiuMxNR6ksr zj*>A8X-19`72K$gmS1qkD^3~yr!J3XYO$S!$UuxSg&$0z<-0s-W=|>RJPiwlVu=_2 znCOOMHq|uzLgHUerH5X8QH2XZ5DW zVX2p}vvhmVqxsWU|AL5&L%_1V7pG-}(`wjWiYq7LBES4ktrIyJEghI$`hp#`MMa zMbF3F?ekNIdNX1QqTi1j<|Ie-`w{Yq{4m{vq*h1|i6?Hf70kM*oIk&2>G$bx1eM0V z`zf8$`Tn`@?k`@_u`prm0`a%st(*_e^1ZNbQuxRhm+v30Z?j6g>yNiSnYhkgW+zv~ zTS|Co{I@d{^R~@eeJ6g#jhSx2M_WJ3U%vg(N1twxg#7xwy+vQ1e=2g(osvbblB`A6 O>FdO&FP)e{(*Fm3#W-;Q delta 7810 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

2`C`(9rRhxd$qa6@z^9 zSWQ#saMMgv9_rlh+{;liDm2e@zAcfs*o{3CO?Mq$Cemx+7L;w)ks7dW4njY!ZoW?n z;Mh9~auKe+6Q{h~Mf6hph|~`D8b_(bxL4F5M_|_==K_Rm(U5zPwna6)q1%u*xM-kt z)*{BVD}_?GI8Xq7B@{L`wU(;SNq>C+pE;$g9RT>3`a1Eh5YhsEwEC7Cp3+y@01arJ-7{mlmXUvYWuVT}!UP-R%m=v>s2@bnJ06kR1wg z1e80}DW@kXq>27-HE-nMrMLh#i{j=@>d>#e!PUXm__|iv-DSZ?=J_TVx zcv6)9Lo81r8WH>(=o2iZ_=X;F1>W0v3*Q(Ec7>Bl*tu&jnFKMr6Qt*Qb`>@j3R``t zPWB8~cCRCTAbhWA^uVrmd`Vr89ZI`8*^chx9>UvekrH*4<5SSJ)YI$s8mu`xZ*dVL zXXJ5gdRGb3|L%k{??sS&xc8owYy@~;O*^~b%=^RX&MtWH{_pXCSL`VZ8;w5w0g;X1 z{al8n{swLxI4J%WhfloOpWmY;`=Mn|ytJyLlXY})>`rGV8w)XeEAU$O`Q8fOu#Q_? zCe5)cI-;@j-@(FtQ-tq0Id%cm?Tf~3>hV5<>;trY74guIFr6%S7GBst)l&MoI|Dd> z!Z;l`C#R-PBn-BPxnfEZUVqRO&pjiLY^NM0Xl? znU8mqbo|o7XJZcMbeOQ5%kj_IyaXrjD3^rPG)|qT$lsOXVt2W)=JlqxwUhPZST+j$ zD&^!Kpsm!*%5`7~-A{@;P#Fn3Q{Egc>Y1-NU zxECQ|*_aN#mAlR5b_TzzQOF$*pH&71hWtv#O9G*>QW5q9<72>(m=RME{G8l5Bc%BK zQ@$5-t%YjJwaE`G_E5Ff(_(_3fQ}|o45l2_jkE`r0m*$d96D5I8G&3Wav!`%F(NF3 z>u51w_S0ENOP-^@K$`!ubZd-T|7dM*LO-LabME&2@>Hbx-uvl2ee#+piV;%OJnDth zwAdRJ`WVz1q)|YwXdD9?Xza?hy6U6K&atFA~eivu?GMqbP=t z;2orSmtT!{)3a;b@~N@Eq`wJwM|uyM)%rRlAemogLkA~K41My8buU$-kmlFvE<`A>b%9> z*&XbJ_v!)8U;vhDQGw5dZ5RzcLte&U@==lDg!y9m299z7mP2tu{ITQ>2Vwat>hl@5 z75NG*=c8TTsg0OPL$Dl*qxZtH0W)(DmbYZ67>Jc_RP^H+HtP{qB+gmz!n|xloB@uX z$dosm@o%lE7}h*mykr9YL582{@rl8~K7i>FP&KmM|4@g`&+z%e!> z=3p}n4JG}*v0ei6}pp;GkCG5mbQx>tWMKq|KykF%#5<1M#`W2CWZU=T(IQ4vUsOM-En8gvlhjWSP! zga?Ml8{v!fh7^1YA%yyi95)PfIWEy{rxx3jL2f&_@?YBVLmjyR=TC=!vZ7A1fc8Rv zJ&gR$$=QnjQSd@^d!L=XD8GxyNA%kXLVv;#{dRbN;&#e?Ns49TM+rxktVw8_d{iFZ zkXtjZtYvmg($1P)XF{@FSBg5)y#ju0nHDXvax;QNYvSUT%-d3PZO@YIk2fr7e!FGX z$REZ{Ek3+mw!OIXW>oeiX1u-ahiO%VgC15Lx_;fY|K;~@8y38HFYNn8J_mD7=wD6v ZbVI@Tm= 8 # Regen braking is braking @@ -107,32 +107,19 @@ class CarState(CarStateBase): ret.steerFaultTemporary = self.lkas_status == 2 ret.steerFaultPermanent = self.lkas_status == 3 - if self.CP.carFingerprint not in SDGM_CAR: - # 1 - open, 0 - closed - ret.doorOpen = (pt_cp.vl["BCMDoorBeltStatus"]["FrontLeftDoor"] == 1 or - pt_cp.vl["BCMDoorBeltStatus"]["FrontRightDoor"] == 1 or - pt_cp.vl["BCMDoorBeltStatus"]["RearLeftDoor"] == 1 or - pt_cp.vl["BCMDoorBeltStatus"]["RearRightDoor"] == 1) - # 1 - latched - ret.seatbeltUnlatched = pt_cp.vl["BCMDoorBeltStatus"]["LeftSeatBelt"] == 0 - ret.leftBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 1 - ret.rightBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 2 + # 1 - open, 0 - closed + ret.doorOpen = (pt_cp.vl["BCMDoorBeltStatus"]["FrontLeftDoor"] == 1 or + pt_cp.vl["BCMDoorBeltStatus"]["FrontRightDoor"] == 1 or + pt_cp.vl["BCMDoorBeltStatus"]["RearLeftDoor"] == 1 or + pt_cp.vl["BCMDoorBeltStatus"]["RearRightDoor"] == 1) - ret.parkingBrake = pt_cp.vl["BCMGeneralPlatformStatus"]["ParkBrakeSwActive"] == 1 - else: - # 1 - open, 0 - closed - ret.doorOpen = (cam_cp.vl["BCMDoorBeltStatus"]["FrontLeftDoor"] == 1 or - cam_cp.vl["BCMDoorBeltStatus"]["FrontRightDoor"] == 1 or - cam_cp.vl["BCMDoorBeltStatus"]["RearLeftDoor"] == 1 or - cam_cp.vl["BCMDoorBeltStatus"]["RearRightDoor"] == 1) + # 1 - latched + ret.seatbeltUnlatched = pt_cp.vl["BCMDoorBeltStatus"]["LeftSeatBelt"] == 0 + ret.leftBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 1 + ret.rightBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 2 - # 1 - latched - ret.seatbeltUnlatched = cam_cp.vl["BCMDoorBeltStatus"]["LeftSeatBelt"] == 0 - ret.leftBlinker = cam_cp.vl["BCMTurnSignals"]["TurnSignals"] == 1 - ret.rightBlinker = cam_cp.vl["BCMTurnSignals"]["TurnSignals"] == 2 - - ret.parkingBrake = cam_cp.vl["BCMGeneralPlatformStatus"]["ParkBrakeSwActive"] == 1 + ret.parkingBrake = pt_cp.vl["BCMGeneralPlatformStatus"]["ParkBrakeSwActive"] == 1 ret.cruiseState.available = pt_cp.vl["ECMEngineStatus"]["CruiseMainOn"] != 0 ret.espDisabled = pt_cp.vl["ESPStatus"]["TractionControlOn"] != 1 ret.accFaulted = (pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.FAULTED or @@ -143,12 +130,11 @@ class CarState(CarStateBase): if self.CP.networkLocation == NetworkLocation.fwdCamera and not self.CP.flags & GMFlags.NO_CAMERA.value: if self.CP.carFingerprint not in CC_ONLY_CAR: ret.cruiseState.speed = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCSpeedSetpoint"] * CV.KPH_TO_MS - if self.CP.carFingerprint not in SDGM_CAR: + if self.CP.carFingerprint not in (SDGM_CAR|ASCM_INT): ret.stockAeb = cam_cp.vl["AEBCmd"]["AEBCmdActive"] != 0 - else: - ret.stockAeb = False # openpilot controls nonAdaptive when not pcmCruise - if self.CP.pcmCruise: + # 2016-2018 Volt won't identify non-adaptive cruise state since switchable cruise state was not introduced till 2019 model year / SDGM Global AAdd commentMore actions + if self.CP.pcmCruise and self.CP.carFingerprint not in ASCM_INT: ret.cruiseState.nonAdaptive = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCCruiseState"] not in (2, 3) if self.CP.carFingerprint in CC_ONLY_CAR: ret.accFaulted = False @@ -156,18 +142,11 @@ class CarState(CarStateBase): ret.cruiseState.enabled = pt_cp.vl["ECMCruiseControl"]["CruiseActive"] != 0 if self.CP.enableBsm: - if self.CP.carFingerprint not in SDGM_CAR: - ret.leftBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["LeftBSM"] == 1 - ret.rightBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["RightBSM"] == 1 - else: - ret.leftBlindspot = cam_cp.vl["BCMBlindSpotMonitor"]["LeftBSM"] == 1 - ret.rightBlindspot = cam_cp.vl["BCMBlindSpotMonitor"]["RightBSM"] == 1 + ret.leftBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["LeftBSM"] == 1 + ret.rightBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["RightBSM"] == 1 self.lkas_previously_enabled = self.lkas_enabled - if self.CP.carFingerprint in SDGM_CAR: - self.lkas_enabled = cam_cp.vl["ASCMSteeringButton"]["LKAButton"] - else: - self.lkas_enabled = pt_cp.vl["ASCMSteeringButton"]["LKAButton"] + self.lkas_enabled = pt_cp.vl["ASCMSteeringButton"]["LKAButton"] self.pcm_acc_status = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] @@ -182,16 +161,7 @@ class CarState(CarStateBase): messages += [ ("ASCMLKASteeringCmd", 10), ] - if CP.carFingerprint in SDGM_CAR: - messages += [ - ("BCMTurnSignals", 1), - ("BCMDoorBeltStatus", 10), - ("BCMGeneralPlatformStatus", 10), - ("ASCMSteeringButton", 33), - ] - if CP.enableBsm: - messages.append(("BCMBlindSpotMonitor", 10)) - else: + if CP.carFingerprint not in (SDGM_CAR|ASCM_INT): messages += [ ("AEBCmd", 10), ] @@ -205,43 +175,30 @@ class CarState(CarStateBase): @staticmethod def get_can_parser(CP, FPCP): messages = [ + ("BCMTurnSignals", 1), + ("ECMPRDNL2", 10), ("PSCMStatus", 10), ("ESPStatus", 10), + ("BCMDoorBeltStatus", 10), + ("BCMGeneralPlatformStatus", 10), ("EBCMWheelSpdFront", 20), ("EBCMWheelSpdRear", 20), ("EBCMFrictionBrakeStatus", 20), + ("AcceleratorPedal2", 33), + ("ASCMSteeringButton", 33), + ("ECMEngineStatus", 100), ("PSCMSteeringAngle", 100), - ("ECMAcceleratorPos", 80), ("SportMode", 0), ] - if CP.carFingerprint in SDGM_CAR: - messages += [ - ("ECMPRDNL2", 40), - ("AcceleratorPedal2", 40), - ("ECMEngineStatus", 80), - ] - else: - messages += [ - ("ECMPRDNL2", 10), - ("AcceleratorPedal2", 33), - ("ECMEngineStatus", 100), - ("BCMTurnSignals", 1), - ("BCMDoorBeltStatus", 10), - ("BCMGeneralPlatformStatus", 10), - ("ASCMSteeringButton", 33), - ] - if CP.enableBsm: - messages.append(("BCMBlindSpotMonitor", 10)) + if CP.enableBsm: + messages.append(("BCMBlindSpotMonitor", 10)) # Used to read back last counter sent to PT by camera if CP.networkLocation == NetworkLocation.fwdCamera: messages += [ ("ASCMLKASteeringCmd", 0), ] - if CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value: - messages.remove(("ECMAcceleratorPos", 80)) - messages.append(("EBCMBrakePedalPosition", 100)) if CP.transmissionType == TransmissionType.direct: messages += [ @@ -259,6 +216,14 @@ class CarState(CarStateBase): ("GAS_SENSOR", 50), ] + if CP.networkLocation != NetworkLocation.fwdCamera: + messages += [ + ("ECMAcceleratorPos", 80), + ] + if CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value: + messages.remove(("ECMAcceleratorPos", 80)) + messages.append(("EBCMBrakePedalPosition", 100)) + return CANParser(DBC[CP.carFingerprint]["pt"], messages, CanBus.POWERTRAIN) @staticmethod diff --git a/selfdrive/car/gm/fingerprints.py b/selfdrive/car/gm/fingerprints.py index e0b14ba52..015238d96 100644 --- a/selfdrive/car/gm/fingerprints.py +++ b/selfdrive/car/gm/fingerprints.py @@ -26,6 +26,12 @@ FINGERPRINTS = { { 170: 8, 171: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1930: 7, 2017: 8, 2020: 8, 2025: 8, 2028: 8 }], + CAR.CHEVROLET_VOLT_ASCM: [ + # Causes errors with normal OBD install + # { + # 189: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 528: 4, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 5, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 767: 4, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1922: 7, 1930: 7Add commentMore actions + # } + ], CAR.BUICK_LACROSSE: [{ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 528: 5, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 5, 707: 8, 753: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 872: 1, 882: 8, 890: 1, 892: 2, 893: 1, 894: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1916: 7, 1918: 7, 1919: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8 }], diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index cead6743b..93814ce15 100644 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -8,7 +8,7 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.gm.radar_interface import RADAR_HEADER_MSG -from openpilot.selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, CanBus, GMFlags, CC_ONLY_CAR, SDGM_CAR +from openpilot.selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, CanBus, GMFlags, CC_ONLY_CAR, SDGM_CAR, ASCM_INT from openpilot.selfdrive.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, FRICTION_THRESHOLD, LatControlInputs, NanoFFModel from openpilot.selfdrive.controls.lib.drive_helpers import get_friction @@ -114,14 +114,17 @@ class CarInterface(CarInterfaceBase): ret.longitudinalTuning.kiBP = [5., 35.] - if candidate in (CAMERA_ACC_CAR | SDGM_CAR): - ret.experimentalLongitudinalAvailable = candidate not in (CC_ONLY_CAR | SDGM_CAR) or 0x2FF in fingerprint[CanBus.POWERTRAIN] + if candidate in (CAMERA_ACC_CAR | SDGM_CAR | ASCM_INT): + ret.experimentalLongitudinalAvailable = candidate not in (CC_ONLY_CAR | SDGM_CAR | ASCM_INT) or 0x2FF in fingerprint[CanBus.POWERTRAIN] ret.networkLocation = NetworkLocation.fwdCamera ret.radarUnavailable = 0x460 not in fingerprint[CanBus.OBSTACLE] ret.pcmCruise = True ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_HW_CAM ret.minEnableSpeed = 5 * CV.KPH_TO_MS ret.minSteerSpeed = 10 * CV.KPH_TO_MS + if candidate in ASCM_INT: + ret.minSteerSpeed = 7 * CV.MPH_TO_MS + ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_ASCM_INT # Tuning for experimental long ret.longitudinalTuning.kiV = [1.0, 1.0] @@ -314,7 +317,7 @@ class CarInterface(CarInterfaceBase): ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_NO_ACC # Exception for flashed cars, or cars whose camera was removed - if (ret.networkLocation == NetworkLocation.fwdCamera or candidate in CC_ONLY_CAR) and CAM_MSG not in fingerprint[CanBus.CAMERA] and not candidate in SDGM_CAR: + if (ret.networkLocation == NetworkLocation.fwdCamera or candidate in CC_ONLY_CAR) and CAM_MSG not in fingerprint[CanBus.CAMERA] and not candidate in (SDGM_CAR | ASCM_INT): ret.flags |= GMFlags.NO_CAMERA.value ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_NO_CAMERA diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 9c0306bf6..187f3d305 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -41,7 +41,7 @@ class CarControllerParams: self.ZERO_GAS = 6144 # Coasting self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen - if CP.carFingerprint in (CAMERA_ACC_CAR | SDGM_CAR) and CP.carFingerprint not in CC_ONLY_CAR: + if CP.carFingerprint in (CAMERA_ACC_CAR | SDGM_CAR) and CP.carFingerprint not in CC_ONLY_CAR and CP.carFingerprint != CAR.CHEVROLET_BOLT_EUV: self.MAX_GAS = 7496 self.MAX_GAS_PLUS = 8848 self.MAX_ACC_REGEN = 5610 @@ -118,6 +118,11 @@ class CAR(Platforms): GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469, minEnableSpeed=-1), dbc_dict=dbc_dict('gm_global_a_powertrain_volt', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis') ) + CHEVROLET_VOLT_ASCM = GMPlatformConfig( + [GMCarDocs("Chevrolet Volt 2017-18 w/ ASCM Harness", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], + GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469, minEnableSpeed=-1), + dbc_dict=dbc_dict('gm_global_a_powertrain_volt', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis') + ) CADILLAC_ATS = GMASCMPlatformConfig( [GMCarDocs("Cadillac ATS Premium Performance 2018")], GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), @@ -318,13 +323,15 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[(Ecu.fwdCamera, 0x24b, None)], ) -EV_CAR = {CAR.CHEVROLET_VOLT, CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_VOLT_CC, CAR.CHEVROLET_BOLT_CC} +EV_CAR = {CAR.CHEVROLET_VOLT, CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_VOLT_CC, CAR.CHEVROLET_BOLT_CC, CAR.CHEVROLET_VOLT_ASCM} CC_ONLY_CAR = {CAR.CHEVROLET_VOLT_CC, CAR.CHEVROLET_BOLT_CC, CAR.CHEVROLET_EQUINOX_CC, CAR.CHEVROLET_SUBURBAN_CC, CAR.GMC_YUKON_CC, CAR.CADILLAC_CT6_CC, CAR.CHEVROLET_TRAILBLAZER_CC, CAR.CADILLAC_XT5_CC, CAR.CHEVROLET_MALIBU_CC} # CC_ONLY_CAR = set(c for c in CAR if str(c).endswith('_CC')) # We're integrated at the Safety Data Gateway Module on these cars SDGM_CAR = {CAR.CADILLAC_XT4, CAR.CHEVROLET_TRAVERSE, CAR.BUICK_BABYENCLAVE} +ASCM_INT = {CAR.CHEVROLET_VOLT_ASCM} + # We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness) CAMERA_ACC_CAR = {CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_SILVERADO, CAR.CHEVROLET_EQUINOX, CAR.CHEVROLET_TRAILBLAZER, CAR.CHEVROLET_TRAX} CAMERA_ACC_CAR.update({CAR.CHEVROLET_VOLT_CC, CAR.CHEVROLET_BOLT_CC, CAR.CHEVROLET_EQUINOX_CC, CAR.GMC_YUKON_CC, CAR.CADILLAC_CT6_CC, CAR.CHEVROLET_TRAILBLAZER_CC, CAR.CADILLAC_XT5_CC, CAR.CHEVROLET_MALIBU_CC}) diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index 1525bf114..6f6c6ceeb 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -56,6 +56,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "CADILLAC_ESCALADE_ESV" = "CHEVROLET_VOLT" "CADILLAC_ATS" = "CHEVROLET_VOLT" "CHEVROLET_MALIBU" = "CHEVROLET_VOLT" +"CHEVROLET_VOLT_ASCM" = "CHEVROLET_VOLT" "HOLDEN_ASTRA" = "CHEVROLET_VOLT" "CHEVROLET_VOLT_CC" = "CHEVROLET_VOLT" "CHEVROLET_BOLT_CC" = "CHEVROLET_BOLT_EUV"