mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-06-10 18:14:25 +08:00
Compare commits
1021 Commits
archive/ma
...
archive/pr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cb85c6d7d | ||
|
|
84c3668c3a | ||
|
|
89005e08c4 | ||
|
|
57daa151cb | ||
|
|
bdb733ddc9 | ||
|
|
b63ef7b0bf | ||
|
|
09d1604b84 | ||
|
|
61f7690265 | ||
|
|
4cb7263dd6 | ||
|
|
ef2331b5df | ||
|
|
9be3925ee1 | ||
|
|
8d760272c7 | ||
|
|
22e0b4d597 | ||
|
|
08afbd7cb5 | ||
|
|
f311c8b1d7 | ||
|
|
fb7076a042 | ||
|
|
cd0ee08763 | ||
|
|
f7ab369d47 | ||
|
|
54d5281064 | ||
|
|
fa3a0ba747 | ||
|
|
b3926faebb | ||
|
|
9810b10c49 | ||
|
|
4d7afe3a7b | ||
|
|
4e237e59a5 | ||
|
|
957e6666a5 | ||
|
|
1f770e1bea | ||
|
|
eb1b0d7ddc | ||
|
|
447f76d9cf | ||
|
|
be72a8ed06 | ||
|
|
7e31333b36 | ||
|
|
c26fd9d7c0 | ||
|
|
ca8c74bc0d | ||
|
|
2f3d999c67 | ||
|
|
05536bf439 | ||
|
|
e994c2cb96 | ||
|
|
fb04ddc9a1 | ||
|
|
1fb0cb59a6 | ||
|
|
e24271aa2b | ||
|
|
1a8170e839 | ||
|
|
c1cd33dbc1 | ||
|
|
606fb2d7c9 | ||
|
|
d9da6064c0 | ||
|
|
ba12998986 | ||
|
|
64a34f97aa | ||
|
|
a1dbcfd62b | ||
|
|
b0b0e65ebc | ||
|
|
b455ea197b | ||
|
|
79ad7f1838 | ||
|
|
85e2589512 | ||
|
|
b33f8f33ca | ||
|
|
81fb8b2883 | ||
|
|
f3729d95ff | ||
|
|
b5227c0a06 | ||
|
|
d3cb0d24c4 | ||
|
|
0669fe85e8 | ||
|
|
b86f7db97d | ||
|
|
e6d56ac974 | ||
|
|
a0e5ead8b0 | ||
|
|
11f0da4aa9 | ||
|
|
f3a546132c | ||
|
|
e8df8fad00 | ||
|
|
ca202c3c4a | ||
|
|
661b02de87 | ||
|
|
46c1362511 | ||
|
|
15d94a017d | ||
|
|
de8da6f41f | ||
|
|
86446a8e42 | ||
|
|
e5665613cb | ||
|
|
9097997b76 | ||
|
|
c44f915df8 | ||
|
|
25d265e5de | ||
|
|
46196862fb | ||
|
|
5c20e7f01a | ||
|
|
8db1ea7bcd | ||
|
|
d51c2ad6f5 | ||
|
|
6ebeeff1b3 | ||
|
|
2e39c96496 | ||
|
|
3442e8b65f | ||
|
|
afa97df945 | ||
|
|
11baf724c0 | ||
|
|
c10791b67b | ||
|
|
bd1dbb18b7 | ||
|
|
ed84fb1f6f | ||
|
|
6c429dca06 | ||
|
|
9c34635fda | ||
|
|
2b6bfe32f4 | ||
|
|
8e9576543f | ||
|
|
43d9030f33 | ||
|
|
dc9b652682 | ||
|
|
d78948ea6e | ||
|
|
a72ebe18be | ||
|
|
1f33f51ace | ||
|
|
d870eb2a27 | ||
|
|
6c8d80a7d5 | ||
|
|
68a82a48e6 | ||
|
|
82c67c87ad | ||
|
|
40d9b8c333 | ||
|
|
85d069044a | ||
|
|
799488573a | ||
|
|
c55d11a865 | ||
|
|
59711afcd4 | ||
|
|
aae38ac5ab | ||
|
|
524d7b73f9 | ||
|
|
1004730750 | ||
|
|
2b0dbb4e8e | ||
|
|
5030860ab8 | ||
|
|
e4f6e12786 | ||
|
|
111d8a5a54 | ||
|
|
2c0ab40c82 | ||
|
|
0166f21568 | ||
|
|
37223889e2 | ||
|
|
57b31abaa8 | ||
|
|
1dc145c628 | ||
|
|
d8595b63e8 | ||
|
|
fff3c30ce5 | ||
|
|
5351420a72 | ||
|
|
ee2f721841 | ||
|
|
b52348bf40 | ||
|
|
23742d046f | ||
|
|
0fb264377d | ||
|
|
04925ab879 | ||
|
|
30b1180a3b | ||
|
|
0953fb6bf2 | ||
|
|
3f7bf0c167 | ||
|
|
55e271be71 | ||
|
|
86bec171b0 | ||
|
|
1d2ff881b0 | ||
|
|
407dfd0d6b | ||
|
|
e78ae2c140 | ||
|
|
1b10cc8575 | ||
|
|
9d82d128ec | ||
|
|
b77d0809bc | ||
|
|
16706bda9c | ||
|
|
21feff5457 | ||
|
|
dcabd306c7 | ||
|
|
136fecf86b | ||
|
|
42818ba95b | ||
|
|
6299b2070d | ||
|
|
7c42ec8b1e | ||
|
|
b5c66e193c | ||
|
|
3a705a0e1c | ||
|
|
264788fb4a | ||
|
|
b471da8975 | ||
|
|
27f495e5e7 | ||
|
|
4242c21c52 | ||
|
|
9842d68f4c | ||
|
|
7a286d2f52 | ||
|
|
0b8262175f | ||
|
|
0d6c95dadc | ||
|
|
8261a71d67 | ||
|
|
bb41d2e386 | ||
|
|
0a6bc53fc2 | ||
|
|
2efdba4daf | ||
|
|
d959c43284 | ||
|
|
755c39b2fd | ||
|
|
1c0bf18084 | ||
|
|
e1e26c6b4f | ||
|
|
bbc79f1798 | ||
|
|
250afef443 | ||
|
|
f5171c34a9 | ||
|
|
8b02be74f9 | ||
|
|
9e3f57d53e | ||
|
|
11351823ef | ||
|
|
c7ade243a9 | ||
|
|
1940ef7480 | ||
|
|
3c6e0c300d | ||
|
|
ba0cc91318 | ||
|
|
39bcc41f9f | ||
|
|
fe023d946f | ||
|
|
53f50e53ef | ||
|
|
0e237f459c | ||
|
|
900e312687 | ||
|
|
397bcf03a5 | ||
|
|
a4806c4c2a | ||
|
|
f1dbb9a1ce | ||
|
|
957071fd42 | ||
|
|
2cbe1a7ec6 | ||
|
|
2d705e826c | ||
|
|
e1c4ab01a9 | ||
|
|
271968e763 | ||
|
|
913f32a15c | ||
|
|
7e3f8091c2 | ||
|
|
6a8f434627 | ||
|
|
2d73059d79 | ||
|
|
919f3d1c74 | ||
|
|
8acd104c65 | ||
|
|
746d2b750c | ||
|
|
cab71cc388 | ||
|
|
1f154928dc | ||
|
|
5e775a1e66 | ||
|
|
ded3389721 | ||
|
|
5b9a397078 | ||
|
|
28efb5388b | ||
|
|
e2d6a9ab3e | ||
|
|
920d4cdcc3 | ||
|
|
7dc9d336b5 | ||
|
|
0daa1e846b | ||
|
|
ef727550a9 | ||
|
|
7bfd2b81e1 | ||
|
|
95c748b9f9 | ||
|
|
95b224c155 | ||
|
|
2d6dbc1275 | ||
|
|
fe1dc7b8de | ||
|
|
540431a06b | ||
|
|
ce4055ced6 | ||
|
|
dbaba022a2 | ||
|
|
f588a0367b | ||
|
|
761b16d8f5 | ||
|
|
d0911f62e5 | ||
|
|
fe1e34dc21 | ||
|
|
df79d31a6b | ||
|
|
8eb043ec7d | ||
|
|
5e16cba5bb | ||
|
|
f87e3dc433 | ||
|
|
df87f45190 | ||
|
|
6336a51cb5 | ||
|
|
761f6eb37f | ||
|
|
d68905831b | ||
|
|
25246b1b71 | ||
|
|
8cbfae6eff | ||
|
|
5989674a11 | ||
|
|
45f21a844a | ||
|
|
18551612e9 | ||
|
|
31f1dc1ffd | ||
|
|
47caf0e0a4 | ||
|
|
47e165dd16 | ||
|
|
b4a6486380 | ||
|
|
9b48a5667c | ||
|
|
efd6c7554b | ||
|
|
0a737ba343 | ||
|
|
170c63fbc5 | ||
|
|
ab6dd22f71 | ||
|
|
f17ebeeef6 | ||
|
|
57be1f4c5f | ||
|
|
071e12e527 | ||
|
|
a0dd4d7359 | ||
|
|
17acb0dc49 | ||
|
|
896bd18c0d | ||
|
|
d2648d42f9 | ||
|
|
0e90bf751b | ||
|
|
9413bb5952 | ||
|
|
019257eb60 | ||
|
|
5ea1d4416b | ||
|
|
f44a04056e | ||
|
|
09fe96daf7 | ||
|
|
7f540311a9 | ||
|
|
672a4b3c74 | ||
|
|
c9bc99f083 | ||
|
|
374a284d1c | ||
|
|
51a5e92212 | ||
|
|
760a3fe86d | ||
|
|
e1721bfd6e | ||
|
|
e74a3cf9d0 | ||
|
|
74c3c72ba0 | ||
|
|
90e5e237a8 | ||
|
|
4e0708c20d | ||
|
|
ecfb60feff | ||
|
|
d6abb30453 | ||
|
|
2845581391 | ||
|
|
4994372a5d | ||
|
|
22ddc78dc7 | ||
|
|
3c82625546 | ||
|
|
b977a52f92 | ||
|
|
43fd2add8b | ||
|
|
6f4ef8ef1e | ||
|
|
8bf9a0e738 | ||
|
|
021fd4f04e | ||
|
|
5a88fbc2ae | ||
|
|
852200f4d0 | ||
|
|
913a2cc72c | ||
|
|
9a62ad78e5 | ||
|
|
05340ffb7e | ||
|
|
8e82b3abd9 | ||
|
|
1299c51924 | ||
|
|
46c7ff26a8 | ||
|
|
d914617ee0 | ||
|
|
8dda347bf2 | ||
|
|
814ed8e32f | ||
|
|
84c6f86805 | ||
|
|
0850fcfb22 | ||
|
|
a2dd3de3ab | ||
|
|
0d290529d7 | ||
|
|
085f17c6c8 | ||
|
|
cd3e1db875 | ||
|
|
e133647123 | ||
|
|
3d4edc7289 | ||
|
|
59d9c68196 | ||
|
|
b7836aa04e | ||
|
|
374b43b883 | ||
|
|
f40de9e1bd | ||
|
|
1e5fdf3d1a | ||
|
|
eeab29969a | ||
|
|
e7d7189d21 | ||
|
|
78e8fc9623 | ||
|
|
75b38db870 | ||
|
|
ce64433dc9 | ||
|
|
059cf0f3a3 | ||
|
|
10e82711df | ||
|
|
71adace06f | ||
|
|
519a3bf52c | ||
|
|
1b49d24db0 | ||
|
|
3f0c43c7a2 | ||
|
|
4bdcb1f527 | ||
|
|
3ac37a2f20 | ||
|
|
a4edd8d68d | ||
|
|
ace9b3e451 | ||
|
|
d54fd16ae3 | ||
|
|
4778efe4f6 | ||
|
|
1c662ff310 | ||
|
|
488f3647d9 | ||
|
|
d1efa4489c | ||
|
|
81a42d9d29 | ||
|
|
880d0c2af1 | ||
|
|
70fd796e6d | ||
|
|
3de6b4365b | ||
|
|
46cb955e33 | ||
|
|
de81acb040 | ||
|
|
57dfee47b8 | ||
|
|
7cdb6bb45d | ||
|
|
00a31ce264 | ||
|
|
c313af5cd0 | ||
|
|
2ae85e71e7 | ||
|
|
b054089137 | ||
|
|
f7a674550a | ||
|
|
4ff444a7d6 | ||
|
|
55b87c4b13 | ||
|
|
0772ef2b8c | ||
|
|
bcf1736265 | ||
|
|
704577e22f | ||
|
|
c6de841d79 | ||
|
|
8e84ebeadb | ||
|
|
a19c45d5a2 | ||
|
|
83a1c8d6a9 | ||
|
|
f601c7be0b | ||
|
|
75d2fbf22a | ||
|
|
128390aadc | ||
|
|
9bb3844301 | ||
|
|
1073aecf79 | ||
|
|
05f3074a79 | ||
|
|
a1aecf4ba4 | ||
|
|
df7b56ff06 | ||
|
|
e143d45c21 | ||
|
|
e13641080b | ||
|
|
002d0d10de | ||
|
|
e19383d5f0 | ||
|
|
0959f34669 | ||
|
|
557728aa09 | ||
|
|
7b27ee2b91 | ||
|
|
5ab39133ec | ||
|
|
2d870d1d8b | ||
|
|
d50171d130 | ||
|
|
84c7b3322a | ||
|
|
c48d1bee55 | ||
|
|
8c817a37e0 | ||
|
|
6cee1edb2e | ||
|
|
faa1ecbbbe | ||
|
|
f6977cc925 | ||
|
|
6d42a7bf85 | ||
|
|
448e71e584 | ||
|
|
536d9f2fc3 | ||
|
|
b7bb78723b | ||
|
|
54f7ccab8c | ||
|
|
2e3bddffa1 | ||
|
|
b0ac95a473 | ||
|
|
7b32df43f9 | ||
|
|
4bf4ad32da | ||
|
|
7bd95fb749 | ||
|
|
ec748af4d0 | ||
|
|
c2142cdaad | ||
|
|
c5e21314e0 | ||
|
|
ea5643afb1 | ||
|
|
6806fb83df | ||
|
|
3c834b7692 | ||
|
|
5671f65c1b | ||
|
|
6192e75380 | ||
|
|
9a53a53fc5 | ||
|
|
96a67d464a | ||
|
|
b028de02f2 | ||
|
|
413fba812a | ||
|
|
aae39f6bd5 | ||
|
|
5213aca6db | ||
|
|
b34089693f | ||
|
|
433a6320f6 | ||
|
|
99d542d0cc | ||
|
|
daafa7d63a | ||
|
|
4afb19c97e | ||
|
|
bce0dc3efa | ||
|
|
574ca41478 | ||
|
|
9465da083f | ||
|
|
9e00a2f066 | ||
|
|
8a12b77748 | ||
|
|
1349fa576e | ||
|
|
29c65ff033 | ||
|
|
c073305bae | ||
|
|
b0cb6bf0a4 | ||
|
|
050c38d0ab | ||
|
|
aad8cd295b | ||
|
|
bcf6cd8e1a | ||
|
|
294b0ad038 | ||
|
|
783267ec29 | ||
|
|
741237f6e2 | ||
|
|
5d2de35fc4 | ||
|
|
928528a13c | ||
|
|
81bdfaf198 | ||
|
|
e51063fb6e | ||
|
|
f2d6949402 | ||
|
|
8f2682022e | ||
|
|
d8faa2a6ea | ||
|
|
81acbe224f | ||
|
|
3d1cac8946 | ||
|
|
45babf70df | ||
|
|
8ad8238e38 | ||
|
|
40eb5801bd | ||
|
|
f0b81d9151 | ||
|
|
6d11fa71d2 | ||
|
|
87ede67c96 | ||
|
|
fe2c9f97ca | ||
|
|
779ec5c491 | ||
|
|
0febc36428 | ||
|
|
d3118cabca | ||
|
|
0c01b99967 | ||
|
|
590577911d | ||
|
|
14de9f1c64 | ||
|
|
8a0385e13e | ||
|
|
c4ee64c0aa | ||
|
|
3fa111b61c | ||
|
|
77800c7112 | ||
|
|
dde1a6e881 | ||
|
|
7b94c831ef | ||
|
|
68e1379003 | ||
|
|
08c0c8e85b | ||
|
|
a0ad76294e | ||
|
|
2c1fe0213b | ||
|
|
b3784fc2f8 | ||
|
|
4f65f9f8e6 | ||
|
|
1a06a4c250 | ||
|
|
bd9770982c | ||
|
|
0e74dfa7a8 | ||
|
|
6d7be9153c | ||
|
|
d1a3d6abe8 | ||
|
|
9e66af59a0 | ||
|
|
87223dc0ca | ||
|
|
615cf68e14 | ||
|
|
0f7663baef | ||
|
|
0e4d7c6f74 | ||
|
|
5ac7e9e2c0 | ||
|
|
2d8e67980b | ||
|
|
3efe44db07 | ||
|
|
78ec50e6c8 | ||
|
|
607513b733 | ||
|
|
87b4ca54b6 | ||
|
|
6175360a8e | ||
|
|
c8cefa4af1 | ||
|
|
c006e24599 | ||
|
|
1682eaa03c | ||
|
|
4b8109666b | ||
|
|
80da209baf | ||
|
|
faf2ac1e4d | ||
|
|
019454bd34 | ||
|
|
9717829840 | ||
|
|
6057d460c0 | ||
|
|
20a39376e9 | ||
|
|
df23ba80dd | ||
|
|
1d8091aea1 | ||
|
|
aa5bcb2762 | ||
|
|
19e8728477 | ||
|
|
b1f4dc6bb0 | ||
|
|
ccfb7ff153 | ||
|
|
2559c299cd | ||
|
|
6a730bd8dd | ||
|
|
18e630c436 | ||
|
|
6c67abe65f | ||
|
|
71b9fe4918 | ||
|
|
455b448d8a | ||
|
|
3aef2ddbd9 | ||
|
|
f885863e1e | ||
|
|
db4d201819 | ||
|
|
fb9ab1db28 | ||
|
|
99f8adde71 | ||
|
|
ffd3c98c20 | ||
|
|
0aa33b7303 | ||
|
|
374dea106c | ||
|
|
f548322753 | ||
|
|
22b72e02e1 | ||
|
|
76c99b92a4 | ||
|
|
4f07bf2504 | ||
|
|
969767bb68 | ||
|
|
fb6acf9ff1 | ||
|
|
2c43f3b15b | ||
|
|
98dbd39209 | ||
|
|
8d993284b3 | ||
|
|
9af11f99b0 | ||
|
|
c4068f34a2 | ||
|
|
c946f50a70 | ||
|
|
62e6d6392d | ||
|
|
5e0c958618 | ||
|
|
48d7faf48f | ||
|
|
d0e58efaf6 | ||
|
|
1a3899e062 | ||
|
|
7a072093dd | ||
|
|
dfe106f1b0 | ||
|
|
e6d11a46b4 | ||
|
|
cc47228363 | ||
|
|
823e82ec0a | ||
|
|
12a56eb46e | ||
|
|
5d8354ec63 | ||
|
|
d6a768c96f | ||
|
|
b982079429 | ||
|
|
47096cbb3c | ||
|
|
613d5b4aba | ||
|
|
71fc267606 | ||
|
|
c0f2e6bc05 | ||
|
|
c49b5c8e35 | ||
|
|
429f7307be | ||
|
|
c2c2be07bc | ||
|
|
5214a703d7 | ||
|
|
a612ee07d7 | ||
|
|
5bf6368947 | ||
|
|
c8cb9b3b75 | ||
|
|
5dbecc7d38 | ||
|
|
67208ee372 | ||
|
|
934aa7acd2 | ||
|
|
5cf452acdd | ||
|
|
65b74b45c4 | ||
|
|
dd98954ce3 | ||
|
|
99d64ed1b4 | ||
|
|
172d629393 | ||
|
|
7445c42b5d | ||
|
|
8d75ca9a7b | ||
|
|
9cab2802ea | ||
|
|
ab66732ee9 | ||
|
|
3b1ad57ee2 | ||
|
|
07e1b55df2 | ||
|
|
c5a85ba831 | ||
|
|
acdfbbb359 | ||
|
|
231f2331aa | ||
|
|
64e38459d0 | ||
|
|
d20dbdf12b | ||
|
|
a8fbb3bcec | ||
|
|
9308c16823 | ||
|
|
c514823c94 | ||
|
|
ac7d86d292 | ||
|
|
31c56ca708 | ||
|
|
84f6fce906 | ||
|
|
b1bb33418e | ||
|
|
65e08b51a0 | ||
|
|
0481fefa26 | ||
|
|
f743c2f78a | ||
|
|
2b8af5d398 | ||
|
|
1a0da520fc | ||
|
|
acf280e15b | ||
|
|
22a5951aa7 | ||
|
|
d315926396 | ||
|
|
27dc94e52a | ||
|
|
04b62555a0 | ||
|
|
a809a7f6fd | ||
|
|
ccde494acc | ||
|
|
814e644a35 | ||
|
|
020cd7b1f8 | ||
|
|
e8a6afa656 | ||
|
|
b68ce95c87 | ||
|
|
59fa3c8770 | ||
|
|
0b09c641a9 | ||
|
|
1958fa95cf | ||
|
|
b2ef8fb5bf | ||
|
|
b868339f7a | ||
|
|
787406ba39 | ||
|
|
d3e93e919c | ||
|
|
91770b9afb | ||
|
|
b4acb61c1c | ||
|
|
35186a31a6 | ||
|
|
9545f2547e | ||
|
|
fa1188a1f2 | ||
|
|
25a3fa5333 | ||
|
|
43c89de187 | ||
|
|
311b53b514 | ||
|
|
53e45a81ef | ||
|
|
f76534cf75 | ||
|
|
f5a518b8af | ||
|
|
dbbb20a0ef | ||
|
|
d857c01f0d | ||
|
|
ff1d7d446b | ||
|
|
20b54929ab | ||
|
|
433f00ae0e | ||
|
|
26805f6184 | ||
|
|
9997c611f3 | ||
|
|
f1eccc6036 | ||
|
|
cedd322667 | ||
|
|
e50f3baa45 | ||
|
|
1376baeee4 | ||
|
|
80cfdf13b7 | ||
|
|
a4cd9129ba | ||
|
|
9b407fee17 | ||
|
|
92abd64efd | ||
|
|
affe7884a0 | ||
|
|
808611e691 | ||
|
|
9219b7966c | ||
|
|
3d87d88dc6 | ||
|
|
e362198880 | ||
|
|
c9932561c4 | ||
|
|
6341be1cd3 | ||
|
|
f673a44438 | ||
|
|
e47b386a23 | ||
|
|
bd583b98c1 | ||
|
|
ec47a9e977 | ||
|
|
2741088ab0 | ||
|
|
9a6653bf4c | ||
|
|
0c3e99f83f | ||
|
|
6284795809 | ||
|
|
dac7aeba87 | ||
|
|
7931f18df8 | ||
|
|
fcd3520c35 | ||
|
|
5e2b06668c | ||
|
|
bdd40ae585 | ||
|
|
9bc1632141 | ||
|
|
d7a2214dc9 | ||
|
|
edcb497308 | ||
|
|
95393495f6 | ||
|
|
f0fecb14cb | ||
|
|
e5a9e4439c | ||
|
|
6b21f7a72a | ||
|
|
cf6e50af69 | ||
|
|
d076a193be | ||
|
|
019e612776 | ||
|
|
ea35f72528 | ||
|
|
cbc2469494 | ||
|
|
eefcf0a266 | ||
|
|
1cb131c507 | ||
|
|
c3fd676e67 | ||
|
|
a22b22d4ae | ||
|
|
8e7f3dbf44 | ||
|
|
a4d793be92 | ||
|
|
c81d29e8cf | ||
|
|
dc98584f80 | ||
|
|
eee9b8b67c | ||
|
|
f67d25dc01 | ||
|
|
e388b49872 | ||
|
|
a9c70aa12b | ||
|
|
e58a6eabdd | ||
|
|
1719fbc7e2 | ||
|
|
31b29bc094 | ||
|
|
ec5258c69e | ||
|
|
43521a963e | ||
|
|
9d9383a61a | ||
|
|
8476948e0c | ||
|
|
7d8db21954 | ||
|
|
54f17f0b5e | ||
|
|
9c0cfddacb | ||
|
|
eeef3491e5 | ||
|
|
199e9e2c37 | ||
|
|
433dfd2b52 | ||
|
|
d43592022a | ||
|
|
f269e799b1 | ||
|
|
0bfa681eb7 | ||
|
|
be7ee80d58 | ||
|
|
18120d8ee8 | ||
|
|
cdc69f925d | ||
|
|
e04cdaf9e3 | ||
|
|
82cb6b6754 | ||
|
|
6c68af71f0 | ||
|
|
7bdb43a62c | ||
|
|
87a972b718 | ||
|
|
eb75b0cfbd | ||
|
|
3d9668d622 | ||
|
|
7ce9f862b3 | ||
|
|
89e28560c0 | ||
|
|
938a64620f | ||
|
|
30c5781e11 | ||
|
|
42d1a75a02 | ||
|
|
9e89575310 | ||
|
|
0da0e9231c | ||
|
|
4d614c6830 | ||
|
|
1fa95672b7 | ||
|
|
05353894e8 | ||
|
|
6027b8a623 | ||
|
|
23bd4e8659 | ||
|
|
0125389414 | ||
|
|
8eb936d440 | ||
|
|
afb446231e | ||
|
|
31dccdce3a | ||
|
|
c83de72cc4 | ||
|
|
df1c24b253 | ||
|
|
f9ecf5cea1 | ||
|
|
7dd66a22c6 | ||
|
|
fead5d9d82 | ||
|
|
64558ef76a | ||
|
|
81f0c6bc63 | ||
|
|
78638a4a5f | ||
|
|
6df086aa82 | ||
|
|
ad18e2181b | ||
|
|
a9bcf732d0 | ||
|
|
a9c0e59004 | ||
|
|
67c7816c35 | ||
|
|
4eaaebc592 | ||
|
|
eeaa6185ff | ||
|
|
ce91902139 | ||
|
|
479fe77756 | ||
|
|
52a927c08a | ||
|
|
fe08549ded | ||
|
|
a7771a66aa | ||
|
|
ab7d30dbfc | ||
|
|
5801d081e8 | ||
|
|
9868e6df88 | ||
|
|
842f18ba3b | ||
|
|
816fc6e5d7 | ||
|
|
73113a6b31 | ||
|
|
b148b58601 | ||
|
|
32ac0b0a2d | ||
|
|
ae993522d2 | ||
|
|
a05b549d9c | ||
|
|
17ad67821b | ||
|
|
0063036aa3 | ||
|
|
879041976f | ||
|
|
ea903ccff7 | ||
|
|
6e0132856f | ||
|
|
f762bd2155 | ||
|
|
a76ad396c8 | ||
|
|
f67b0f5f77 | ||
|
|
653c3ea5d7 | ||
|
|
8db81e9f4e | ||
|
|
7586395cb4 | ||
|
|
d50a9a7303 | ||
|
|
56232b5535 | ||
|
|
7927c72076 | ||
|
|
9bcfc1a855 | ||
|
|
9be71b864a | ||
|
|
cfaef14f05 | ||
|
|
1647175135 | ||
|
|
c9e7ca09e5 | ||
|
|
64bc894349 | ||
|
|
439cad86fd | ||
|
|
dbab500b23 | ||
|
|
2f835a9738 | ||
|
|
67c62353c4 | ||
|
|
10937acba1 | ||
|
|
ec96a0dd9a | ||
|
|
5d1e1ccc81 | ||
|
|
bbbae5e252 | ||
|
|
41aa099b3e | ||
|
|
2fd9e71bf1 | ||
|
|
0dae7c7e04 | ||
|
|
6b63ac47f6 | ||
|
|
f3c86bd9dd | ||
|
|
018cc21025 | ||
|
|
12be6a0dbb | ||
|
|
9e0680cdec | ||
|
|
20bd203ca2 | ||
|
|
2e7e26ef95 | ||
|
|
83efa3738b | ||
|
|
cb097260c0 | ||
|
|
a9fd1b36c1 | ||
|
|
28b0a8f40e | ||
|
|
eef6588bcd | ||
|
|
d5bf4daecf | ||
|
|
f6335f1f7b | ||
|
|
3dc9ffb9bb | ||
|
|
c566e87b61 | ||
|
|
bf19c7dddf | ||
|
|
547059a67f | ||
|
|
baf96a4f87 | ||
|
|
48391b6b5c | ||
|
|
526b106c9a | ||
|
|
c8aff167bb | ||
|
|
b341c81522 | ||
|
|
8f5a6b129b | ||
|
|
1bc6193d3d | ||
|
|
34619be925 | ||
|
|
6a8f789816 | ||
|
|
b006e48a2d | ||
|
|
63fb07b4b8 | ||
|
|
dde5309015 | ||
|
|
1a87f92097 | ||
|
|
a88941837b | ||
|
|
f39ea7e446 | ||
|
|
e6ce327b8c | ||
|
|
100aa5685b | ||
|
|
9a78c0a776 | ||
|
|
00351268b4 | ||
|
|
9737b0d366 | ||
|
|
9171aa6718 | ||
|
|
9cdb838557 | ||
|
|
9644ea30d8 | ||
|
|
5570211c10 | ||
|
|
b5b85ca64f | ||
|
|
f182323cf3 | ||
|
|
64b47e89ab | ||
|
|
75f23637dc | ||
|
|
46c9d00516 | ||
|
|
5d3caec440 | ||
|
|
ddf590e6d2 | ||
|
|
869573d282 | ||
|
|
780c83102e | ||
|
|
c032563908 | ||
|
|
75ca9e18e1 | ||
|
|
2cf7e23b83 | ||
|
|
48c440f24d | ||
|
|
8c41f9a81e | ||
|
|
df185e6ead | ||
|
|
199aabb476 | ||
|
|
65de8af740 | ||
|
|
955926a80e | ||
|
|
a2b8970a83 | ||
|
|
899eb2e99f | ||
|
|
cd7bed1d2e | ||
|
|
95078c22d5 | ||
|
|
8a9bec3a82 | ||
|
|
091d662a5e | ||
|
|
d94abf9e2e | ||
|
|
a3d632ad0a | ||
|
|
6cfc7a76a1 | ||
|
|
013221c06d | ||
|
|
69698381c5 | ||
|
|
5ea521920b | ||
|
|
f627a34e47 | ||
|
|
c4fc609883 | ||
|
|
75ec6119fd | ||
|
|
e4668cbf4f | ||
|
|
892ce2754b | ||
|
|
a0a70f563f | ||
|
|
d465138f1d | ||
|
|
8179a56926 | ||
|
|
e5525f6bc0 | ||
|
|
5728cd7b7a | ||
|
|
f107f51b4a | ||
|
|
356a601d20 | ||
|
|
99de69095c | ||
|
|
828ef6e6a5 | ||
|
|
674b416d11 | ||
|
|
9c32204bb4 | ||
|
|
7f1edf0966 | ||
|
|
a75f5adf2a | ||
|
|
b2f3d576ba | ||
|
|
b6a5f0e6b9 | ||
|
|
c69e49c064 | ||
|
|
f52b52b1d4 | ||
|
|
5f01dca186 | ||
|
|
eba305649d | ||
|
|
30328c50a4 | ||
|
|
d27eb2b4b8 | ||
|
|
10d2fbb0b8 | ||
|
|
184b3aaf99 | ||
|
|
ef5d612475 | ||
|
|
ab6116776b | ||
|
|
28d3ebe95b | ||
|
|
7e052e77ee | ||
|
|
633cdaca9b | ||
|
|
39006f7401 | ||
|
|
50a96c9a92 | ||
|
|
0372bf8e11 | ||
|
|
6cee8b6827 | ||
|
|
28aef88932 | ||
|
|
3119402f4e | ||
|
|
9c1dc31998 | ||
|
|
9434ad909e | ||
|
|
4d3a97a5d5 | ||
|
|
dba3eb7a50 | ||
|
|
141c04e46f | ||
|
|
6ef022758e | ||
|
|
a0d162ccd9 | ||
|
|
e94386dc96 | ||
|
|
17854dc2d2 | ||
|
|
b4fa677656 | ||
|
|
ebd82c18c5 | ||
|
|
a8705ad033 | ||
|
|
9c84fa7434 | ||
|
|
a3f4c24f4c | ||
|
|
0d6d336f63 | ||
|
|
a136c8568e | ||
|
|
710525544c | ||
|
|
18e36f3b7f | ||
|
|
72ba1c3e39 | ||
|
|
5c8db326cf | ||
|
|
4a9e96375b | ||
|
|
b1c12dedc7 | ||
|
|
c5f0b9ab47 | ||
|
|
a7f756fee5 | ||
|
|
c30c140866 | ||
|
|
e1403b4771 | ||
|
|
6128f92a5e | ||
|
|
989b8b251d | ||
|
|
9c3bceb9f3 | ||
|
|
688134a603 | ||
|
|
1762a2adc0 | ||
|
|
1d0e38fce5 | ||
|
|
944f066628 | ||
|
|
823cc11b80 | ||
|
|
ed26cac599 | ||
|
|
e45a5815b8 | ||
|
|
8aab7b82b6 | ||
|
|
ee0dfacb93 | ||
|
|
c726a82eaf | ||
|
|
e28aa306aa | ||
|
|
ecd3b9ab30 | ||
|
|
66e0c7206b | ||
|
|
b1efbc48b2 | ||
|
|
d0e21fc6c8 | ||
|
|
a8aa8dbb8a | ||
|
|
58bf23e2c4 | ||
|
|
d124f62078 | ||
|
|
97b21eb0dd | ||
|
|
c1aa7b078c | ||
|
|
27bd70f64b | ||
|
|
11f9ce2c71 | ||
|
|
a953f5872b | ||
|
|
e2900841da | ||
|
|
a48a9f00bd | ||
|
|
7e17dc668f | ||
|
|
66a052abb4 | ||
|
|
b81fac3870 | ||
|
|
bbf530027c | ||
|
|
05a4894ea4 | ||
|
|
2abc8b769b | ||
|
|
25b25523eb | ||
|
|
2160f472d8 | ||
|
|
4c6c251dd5 | ||
|
|
3eca4e4c36 | ||
|
|
b50329f1b5 | ||
|
|
aa8f5a520a | ||
|
|
5ee1ae04fb | ||
|
|
e1efbfe6eb | ||
|
|
36152df5e4 | ||
|
|
9f0879a57e | ||
|
|
f383137efd | ||
|
|
828bbdc912 | ||
|
|
adf844eb30 | ||
|
|
c97b3b56a9 | ||
|
|
9ccc1523b9 | ||
|
|
ace812d5d1 | ||
|
|
b45f62bb74 | ||
|
|
3ad8d6ef50 | ||
|
|
7021d2ce20 | ||
|
|
6e9ac005ed | ||
|
|
34c77311de | ||
|
|
8892950697 | ||
|
|
c20c3c5ecc | ||
|
|
c21bc04492 | ||
|
|
e7157d00f8 | ||
|
|
2fc2e108be | ||
|
|
36461f1885 | ||
|
|
72026aec5f | ||
|
|
249c823541 | ||
|
|
cc9a8e7d2c | ||
|
|
c533f185ae | ||
|
|
3cab2a57f7 | ||
|
|
c0893c47fe | ||
|
|
32e2e463a8 | ||
|
|
8a99b9256a | ||
|
|
f78cd8a754 | ||
|
|
ef32bcd0b1 | ||
|
|
ca0a986caa | ||
|
|
6aff55d6c9 | ||
|
|
a2ef3609a3 | ||
|
|
5feb4fa001 | ||
|
|
fbb8176df6 | ||
|
|
92f16cbbac | ||
|
|
a42d9e238d | ||
|
|
4d65697c07 | ||
|
|
5851892123 | ||
|
|
d2d0f90d73 | ||
|
|
c19c38309e | ||
|
|
37e07b8362 | ||
|
|
1af1c408ce | ||
|
|
c988b934ed | ||
|
|
935bf6bd91 | ||
|
|
b08431888b | ||
|
|
6322b99040 | ||
|
|
025e97f229 | ||
|
|
d8c5a8f1dc | ||
|
|
6b6fa663bc | ||
|
|
4eda9103bc | ||
|
|
9b5b61551c | ||
|
|
a93c936e4b | ||
|
|
ecd3e902ad | ||
|
|
31483d18fd | ||
|
|
2fa7a4cf7f | ||
|
|
bb6bee5925 | ||
|
|
048fd58243 | ||
|
|
c0e0dbb642 | ||
|
|
7b22a2b4ad | ||
|
|
1fb8a891fc | ||
|
|
01461c013c | ||
|
|
ca4cbccb70 | ||
|
|
b193992299 | ||
|
|
0ca23636d4 | ||
|
|
ff1eebcc47 | ||
|
|
6ec1b029b9 | ||
|
|
5bd3c0fc31 | ||
|
|
85ff332e01 | ||
|
|
294d856331 | ||
|
|
d44b408b9b | ||
|
|
9b18d61111 | ||
|
|
c55771feaf | ||
|
|
7cb3e29e47 | ||
|
|
c747b80706 | ||
|
|
d0743e6b42 | ||
|
|
990a789786 | ||
|
|
e292b502e6 | ||
|
|
7bc1bbfc3b | ||
|
|
54905e3505 | ||
|
|
ecf3f2f770 | ||
|
|
926e750cee | ||
|
|
bb0fad232b | ||
|
|
4f35b842d2 | ||
|
|
79ad1395c0 | ||
|
|
d8d643fe43 | ||
|
|
46a2f603ea | ||
|
|
d97e6df31a | ||
|
|
b963b8edee | ||
|
|
07205a5849 | ||
|
|
ffa46a747b | ||
|
|
6a30c535b1 | ||
|
|
e84a0326da | ||
|
|
f874bf9cff | ||
|
|
71a8b68d57 | ||
|
|
b2707d5923 | ||
|
|
6c5d96c761 | ||
|
|
de74cc4103 | ||
|
|
1cd919dcd4 | ||
|
|
8d416d1ccb | ||
|
|
d0dc650f7d | ||
|
|
6b4342f2d6 |
97
.github/workflows/codeql.yml
vendored
Normal file
97
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master", "*-c3", "master*" ]
|
||||
pull_request:
|
||||
branches: [ "master", "*-c3", "master*" ]
|
||||
schedule:
|
||||
- cron: '39 7 * * 2'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze (${{ matrix.language }})
|
||||
# Runner size impacts CodeQL analysis time. To learn more, please see:
|
||||
# - https://gh.io/recommended-hardware-resources-for-running-codeql
|
||||
# - https://gh.io/supported-runners-and-hardware-resources
|
||||
# - https://gh.io/using-larger-runners (GitHub.com only)
|
||||
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
|
||||
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
||||
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
|
||||
permissions:
|
||||
# required for all workflows
|
||||
security-events: write
|
||||
|
||||
# required to fetch internal or private CodeQL packs
|
||||
packages: read
|
||||
|
||||
# only required for workflows in private repositories
|
||||
actions: read
|
||||
contents: read
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- language: c-cpp
|
||||
build-mode: autobuild
|
||||
- language: javascript-typescript
|
||||
build-mode: none
|
||||
- language: python
|
||||
build-mode: none
|
||||
# CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'
|
||||
# Use `c-cpp` to analyze code written in C, C++ or both
|
||||
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
|
||||
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
|
||||
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
|
||||
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
|
||||
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
|
||||
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
build-mode: ${{ matrix.build-mode }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
|
||||
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
# If the analyze step fails for one of the languages you are analyzing with
|
||||
# "We were unable to automatically build your code", modify the matrix above
|
||||
# to set the build mode to "manual" for that language. Then modify this step
|
||||
# to build your code.
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
- if: matrix.build-mode == 'manual'
|
||||
shell: bash
|
||||
run: |
|
||||
echo 'If you are using a "manual" build mode for one or more of the' \
|
||||
'languages you are analyzing, replace this with the commands to build' \
|
||||
'your code, for example:'
|
||||
echo ' make bootstrap'
|
||||
echo ' make release'
|
||||
exit 1
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
55
.github/workflows/mirror_to_gitlab.yaml
vendored
Normal file
55
.github/workflows/mirror_to_gitlab.yaml
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
name: Mirror to GitLab
|
||||
|
||||
on:
|
||||
push:
|
||||
delete:
|
||||
workflow_dispatch: # This enables manual triggering
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Wait for other instances of this workflow to conclude
|
||||
uses: softprops/turnstyle@8db075d65b19bf94e6e8687b504db69938dc3c65
|
||||
with:
|
||||
same-branch-only: 'true'
|
||||
abort-after-seconds: 300
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
fetch-depth: 0 # Fetch full history
|
||||
|
||||
- name: Set up Git
|
||||
run: |
|
||||
git config --global user.name 'GitHub Action'
|
||||
git config --global user.email 'action@github.com'
|
||||
|
||||
- name: Set up SSH
|
||||
uses: webfactory/ssh-agent@v0.5.3
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
|
||||
- name: Add GitLab public keys
|
||||
run: |
|
||||
ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Sync and commit changes
|
||||
id: sync-and-commit
|
||||
run: |
|
||||
git lfs pull
|
||||
|
||||
# Add GitLab remote
|
||||
git remote add gitlab git@gitlab.com:sunnypilot/sunnyhaibin/sunnypilot-github-mirror.git
|
||||
|
||||
# Fetch from GitLab and check if the branch exists
|
||||
if git fetch gitlab ${{ github.ref }}; then
|
||||
# Merge changes from GitLab if the branch exists
|
||||
git merge gitlab/${{ github.ref_name }} --allow-unrelated-histories --strategy-option=theirs
|
||||
else
|
||||
echo "Branch does not exist on GitLab, skipping merge."
|
||||
fi
|
||||
git push -u gitlab ${{ github.ref }} # If you have issues with "push rejected missing LFS" or something. Make sure you disabled LFS on the GITLAB repo if you intend to use a different LFS repo other than the target repo
|
||||
2
.github/workflows/selfdrive_tests.yaml
vendored
2
.github/workflows/selfdrive_tests.yaml
vendored
@@ -145,6 +145,7 @@ jobs:
|
||||
timeout-minutes: 15
|
||||
run: |
|
||||
${{ env.RUN }} "source selfdrive/test/setup_xvfb.sh && \
|
||||
export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && \
|
||||
$PYTEST --timeout 60 -m 'not slow' && \
|
||||
./selfdrive/ui/tests/create_test_translations.sh && \
|
||||
QT_QPA_PLATFORM=offscreen ./selfdrive/ui/tests/test_translations && \
|
||||
@@ -322,6 +323,7 @@ jobs:
|
||||
run: >
|
||||
${{ env.RUN }} "PYTHONWARNINGS=ignore &&
|
||||
source selfdrive/test/setup_xvfb.sh &&
|
||||
export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' &&
|
||||
python selfdrive/ui/tests/test_ui/run.py"
|
||||
- name: Upload Test Report
|
||||
uses: actions/upload-artifact@v4
|
||||
|
||||
3
.github/workflows/tools_tests.yaml
vendored
3
.github/workflows/tools_tests.yaml
vendored
@@ -39,7 +39,8 @@ jobs:
|
||||
${{ env.RUN }} "scons -j$(nproc)"
|
||||
- name: Run bridge test
|
||||
run: |
|
||||
${{ env.RUN }} "source selfdrive/test/setup_xvfb.sh && \
|
||||
${{ env.RUN }} "export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && \
|
||||
source selfdrive/test/setup_xvfb.sh && \
|
||||
source selfdrive/test/setup_vsound.sh && \
|
||||
CI=1 pytest tools/sim/tests/test_metadrive_bridge.py"
|
||||
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -54,6 +54,7 @@ selfdrive/car/tests/cars_dump
|
||||
system/camerad/camerad
|
||||
system/camerad/test/ae_gray_test
|
||||
selfdrive/modeld/_modeld
|
||||
selfdrive/modeld/_navmodeld
|
||||
selfdrive/modeld/_dmonitoringmodeld
|
||||
/src/
|
||||
|
||||
|
||||
244
.gitlab-ci.yml
Normal file
244
.gitlab-ci.yml
Normal file
@@ -0,0 +1,244 @@
|
||||
variables:
|
||||
BUILD_DIR: "/data/openpilot"
|
||||
OUTPUT_DIR: "${CI_PROJECT_DIR}/output"
|
||||
CI_DIR: "${CI_PROJECT_DIR}/release/ci"
|
||||
VERSION: 'echo $(date "+%Y.%m.%d")'
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
GIT_DISCOVERY_ACROSS_FILESYSTEM: 1
|
||||
DEV_C3_SOURCE_BRANCH: "master-dev-c3"
|
||||
GIT_CONFIG_USER_EMAIL: "gitlab@pipeline.com"
|
||||
GIT_CONFIG_USER_NAME: "Gitlab Pipeline"
|
||||
PUBLIC_REPO_URL: "https://github.com/sunnyhaibin/sunnypilot"
|
||||
BASE_BUILD_NUMER: 3000
|
||||
|
||||
EXTRA_VERSION_IDENTIFIER: "${CI_PIPELINE_IID}"
|
||||
NEW_BRANCH: ${CI_COMMIT_REF_NAME}-prebuilt
|
||||
|
||||
stages:
|
||||
- build
|
||||
- sanity
|
||||
- publish
|
||||
- notify
|
||||
|
||||
default:
|
||||
retry: 2
|
||||
tags:
|
||||
- sunnypilot
|
||||
- x86
|
||||
|
||||
.default_before_script: &default_before_script
|
||||
- 'if [ "$EXTRA_VERSION_IDENTIFIER" = "$CI_PIPELINE_IID" ]; then export EXTRA_VERSION_IDENTIFIER=$((CI_PIPELINE_IID + BASE_BUILD_NUMER)); fi'
|
||||
- 'export VERSION=$(eval $VERSION)-${EXTRA_VERSION_IDENTIFIER}'
|
||||
- 'mkdir -p "${BUILD_DIR}/"'
|
||||
- 'git config --global user.email "${GIT_CONFIG_USER_EMAIL}"'
|
||||
- 'git config --global user.name "${GIT_CONFIG_USER_NAME}"'
|
||||
|
||||
|
||||
workflow: # If running on any branch other than main.
|
||||
rules:
|
||||
# We are an MR, but it's a draft, we won't proceed with anything.
|
||||
- if: '$CI_MERGE_REQUEST_TITLE =~ /^wip:/i || $CI_MERGE_REQUEST_TITLE =~ /^draft:/i'
|
||||
when: never
|
||||
|
||||
# Below are the rules when a commit is done (code has been added to the branch)
|
||||
# Commit to master-dev-c3
|
||||
- if: $CI_COMMIT_REF_NAME == $DEV_C3_SOURCE_BRANCH
|
||||
variables:
|
||||
EXTRA_VERSION_IDENTIFIER: "${CI_PIPELINE_IID}"
|
||||
NEW_BRANCH: "dev-c3"
|
||||
AUTO_BUILD: true
|
||||
when: always
|
||||
#commit made to main (master)
|
||||
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
|
||||
variables:
|
||||
NEW_BRANCH: "staging-c3"
|
||||
VERSION: 'cat common/version.h | grep COMMA_VERSION | sed -e "s/[^0-9|.]//g"'
|
||||
EXTRA_VERSION_IDENTIFIER: "staging"
|
||||
AUTO_PUBLISH: true
|
||||
AUTO_BUILD: true
|
||||
when: always
|
||||
# if tag
|
||||
- if: $CI_COMMIT_TAG
|
||||
variables:
|
||||
NEW_BRANCH: "release-c3"
|
||||
VERSION: 'cat common/version.h | grep COMMA_VERSION | sed -e "s/[^0-9|.]//g"'
|
||||
EXTRA_VERSION_IDENTIFIER: "release"
|
||||
AUTO_BUILD: true
|
||||
- when: always
|
||||
|
||||
|
||||
build:
|
||||
stage: build
|
||||
cache:
|
||||
key: "${CI_COMMIT_REF_SLUG}"
|
||||
paths:
|
||||
- "${CI_DIR}/scons_cache"
|
||||
before_script:
|
||||
- find $BUILD_DIR/ -mindepth 1 -delete
|
||||
- *default_before_script
|
||||
- "echo Starting build stage..."
|
||||
- "echo BUILD_DIR: ${BUILD_DIR}"
|
||||
- "echo CI_DIR: ${CI_DIR}"
|
||||
- "echo VERSION: ${VERSION}"
|
||||
- "echo CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}"
|
||||
- git config --global --add safe.directory ${CI_PROJECT_DIR}
|
||||
script:
|
||||
- export PYTHONPATH="$BUILD_DIR"
|
||||
- "echo Building Panda..."
|
||||
- scons -j$(nproc) cache_dir=${CI_DIR}/scons_cache ${CI_PROJECT_DIR}/panda
|
||||
- mkdir -p ${BUILD_DIR}
|
||||
- ls -la ${BUILD_DIR}
|
||||
- "echo Building Rest..."
|
||||
- ./release/release_files.py | sort | uniq | rsync -vrRl --files-from=- . $BUILD_DIR/
|
||||
- cp .lfsconfig-prebuilts $BUILD_DIR/.lfsconfig
|
||||
- cp .gitattributes $BUILD_DIR/.gitattributes
|
||||
- echo "selfdrive/**/* filter=lfs diff=lfs merge=lfs -text" >> $BUILD_DIR/.gitattributes
|
||||
- echo "selfdrive/**/*.py -filter -diff -merge" >> $BUILD_DIR/.gitattributes
|
||||
# - cp -pR --parents $(cat release/files_common release/files_tici | sort | uniq) $BUILD_DIR/ 2> >(grep -v 'warning:' >&2)
|
||||
- cd $BUILD_DIR
|
||||
- sed -i '/from .board.jungle import PandaJungle, PandaJungleDFU/s/^/#/' panda/__init__.py # comment panda jungle when prebuilt
|
||||
- scons -j$(nproc) cache_dir=${CI_DIR}/scons_cache --minimal
|
||||
- touch ${BUILD_DIR}/prebuilt
|
||||
- sudo rm -rf ${OUTPUT_DIR}
|
||||
- mkdir -p ${OUTPUT_DIR}
|
||||
# We first include the paths we want to keep, even if we later will be excluding the other things on those paths
|
||||
- rsync -avm
|
||||
--include='**/panda/board/'
|
||||
--include='**/panda/board/obj'
|
||||
--include='**/panda/board/obj/panda.bin.signed'
|
||||
--include='**/panda/board/obj/panda_h7.bin.signed'
|
||||
--include='**/panda/board/obj/bootstub.panda.bin'
|
||||
--include='**/panda/board/obj/bootstub.panda_h7.bin'
|
||||
--exclude='.sconsign.dblite'
|
||||
--exclude='*.a'
|
||||
--exclude='*.A'
|
||||
--exclude='*.o'
|
||||
--exclude='*.O'
|
||||
--exclude='*.os'
|
||||
--exclude='*.OS'
|
||||
--exclude='*.pyc'
|
||||
--exclude='*.PYC'
|
||||
--exclude='moc_*'
|
||||
--exclude='MOC_*'
|
||||
--exclude='*.cc'
|
||||
--exclude='*.CC'
|
||||
--exclude='Jenkinsfile'
|
||||
--exclude='supercombo.onnx'
|
||||
--exclude='**/panda/board/*'
|
||||
--exclude='**/panda/board/obj/**'
|
||||
--exclude='**/panda/certs/'
|
||||
--exclude='**/panda/crypto/'
|
||||
--exclude='**/release/'
|
||||
--exclude='**/.github/'
|
||||
--exclude='**/selfdrive/ui/replay/'
|
||||
--exclude='**/__pycache__/'
|
||||
--exclude='**/selfdrive/ui/*.h'
|
||||
--exclude='**/selfdrive/ui/**/*.h'
|
||||
--exclude='**/selfdrive/ui/qt/offroad/sunnypilot/'
|
||||
--exclude='**/.git/'
|
||||
--exclude='**/SConstruct'
|
||||
--exclude='**/SConscript'
|
||||
--delete-excluded
|
||||
--chown=comma:comma
|
||||
${BUILD_DIR}/ ${OUTPUT_DIR}/
|
||||
after_script:
|
||||
# cleanup build dir after doing work
|
||||
- find $BUILD_DIR/ -mindepth 1 -delete
|
||||
artifacts:
|
||||
paths:
|
||||
- ${OUTPUT_DIR}/
|
||||
tags: [ 'sunnypilot', 'tici' ]
|
||||
rules:
|
||||
- if: $AUTO_BUILD
|
||||
when: always
|
||||
- when: manual
|
||||
|
||||
.publish_base: &publish_base
|
||||
image: alpine
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: normal
|
||||
stage: publish
|
||||
needs:
|
||||
- job: build
|
||||
artifacts: true
|
||||
before_script:
|
||||
- 'apk update && apk upgrade'
|
||||
- 'apk add git bash openssh git-lfs'
|
||||
- 'eval $(ssh-agent -s)'
|
||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
||||
- 'mkdir -p ~/.ssh/'
|
||||
- 'chmod 700 ~/.ssh'
|
||||
- export HOST=$(echo ${GIT_ORIGIN} | cut -d'@' -f2 | cut -d':' -f1)
|
||||
- echo fetching ssh pub keys for ${HOST}
|
||||
- 'ssh-keyscan -H ${HOST} >> ~/.ssh/known_hosts' # Adding gitlab to trusted
|
||||
- 'chmod 644 ~/.ssh/known_hosts'
|
||||
- *default_before_script
|
||||
script:
|
||||
- echo "${GIT_ORIGIN}"
|
||||
- echo "Calling to publish [${CI_DIR}/publish.sh ${CI_PROJECT_DIR} ${OUTPUT_DIR} ${NEW_BRANCH} ${VERSION} ${GIT_ORIGIN}]"
|
||||
- git config --global --add safe.directory ${OUTPUT_DIR}
|
||||
- $CI_DIR/publish.sh "${CI_PROJECT_DIR}" "${OUTPUT_DIR}" "${NEW_BRANCH}" "${VERSION}" "${GIT_ORIGIN}" "-${EXTRA_VERSION_IDENTIFIER}"
|
||||
allow_failure: false
|
||||
|
||||
publish to private gitlab prebuilt:
|
||||
extends: ".publish_base"
|
||||
variables:
|
||||
GIT_ORIGIN: git@gitlab.com:sunnypilot/public/sunnypilot-prebuilts.git
|
||||
rules:
|
||||
- if: $AUTO_BUILD
|
||||
when: on_success
|
||||
- if: $CI_MERGE_REQUEST_IID
|
||||
when: on_success
|
||||
- when: manual
|
||||
|
||||
publish to public github prebuilt:
|
||||
extends: ".publish_base"
|
||||
variables:
|
||||
GIT_ORIGIN: git@github.com:sunnyhaibin/sunnypilot.git
|
||||
GIT_CONFIG_USER_EMAIL: "jason.wen@sunnypilot.ai"
|
||||
GIT_CONFIG_USER_NAME: "Jason Wen"
|
||||
rules:
|
||||
- if: $AUTO_PUBLISH
|
||||
when: on_success
|
||||
- when: manual
|
||||
|
||||
.notify_discord: ¬ify_discord
|
||||
image: alpine
|
||||
stage: notify
|
||||
needs: ["build"]
|
||||
variables:
|
||||
DISCORD_HOOK: "${DISCORD_MANUAL_BUILD_WEBHOOK_URL}" # Default hook if not overriden by children
|
||||
before_script:
|
||||
- 'apk add curl jq envsubst'
|
||||
script:
|
||||
- echo using [${TEMPLATE}]
|
||||
- cat release/ci/${TEMPLATE} | envsubst | tee payload.json
|
||||
- 'curl -X POST -H "Content-Type: application/json" -d "$(cat payload.json)" ${DISCORD_HOOK} | jq .'
|
||||
rules:
|
||||
- if: $NEW_BRANCH
|
||||
when: on_success
|
||||
- when: never
|
||||
allow_failure: true
|
||||
|
||||
notify pending action:
|
||||
extends: ".notify_discord"
|
||||
variables:
|
||||
TEMPLATE: "discord_template_notify_dev_private.json"
|
||||
before_script:
|
||||
- !reference [".notify_discord", "before_script"]
|
||||
- export AVATAR_URL=$(curl -s -X GET "https://gitlab.com/api/v4/avatar?email=${GITLAB_USER_EMAIL}" | jq -r '.avatar_url')
|
||||
|
||||
notify new dev build:
|
||||
extends: ".notify_discord"
|
||||
stage: notify
|
||||
needs: ["publish to public github prebuilt"] # This notify shall only happen after a publish to github public
|
||||
variables:
|
||||
TEMPLATE: "discord_template_notify_dev_public.json"
|
||||
before_script:
|
||||
- !reference [".notify_discord", "before_script"]
|
||||
- export EXTRA_VERSION_IDENTIFIER=$((CI_PIPELINE_IID + BASE_BUILD_NUMER))
|
||||
rules:
|
||||
- if: $NEW_BRANCH == "dev-c3"
|
||||
variables:
|
||||
DISCORD_HOOK: "${DISCORD_NEW_BUILD_WEBHOOK_URL}" # Overriding hook because we know we are dev-c3
|
||||
- !reference [".notify_discord", "rules"]
|
||||
12
.gitmodules
vendored
12
.gitmodules
vendored
@@ -1,21 +1,21 @@
|
||||
[submodule "panda"]
|
||||
path = panda
|
||||
url = ../../sunnyhaibin/panda.git
|
||||
url = https://github.com/sunnyhaibin/panda.git
|
||||
[submodule "opendbc"]
|
||||
path = opendbc
|
||||
url = ../../sunnyhaibin/opendbc.git
|
||||
url = https://github.com/sunnyhaibin/opendbc.git
|
||||
[submodule "msgq"]
|
||||
path = msgq_repo
|
||||
url = ../../commaai/msgq.git
|
||||
url = https://github.com/commaai/msgq.git
|
||||
[submodule "rednose_repo"]
|
||||
path = rednose_repo
|
||||
url = ../../commaai/rednose.git
|
||||
url = https://github.com/commaai/rednose.git
|
||||
[submodule "body"]
|
||||
path = body
|
||||
url = ../../commaai/body.git
|
||||
url = https://github.com/commaai/body.git
|
||||
[submodule "teleoprtc_repo"]
|
||||
path = teleoprtc_repo
|
||||
url = ../../commaai/teleoprtc
|
||||
url = https://github.com/commaai/teleoprtc
|
||||
[submodule "tinygrad"]
|
||||
path = tinygrad_repo
|
||||
url = https://github.com/geohot/tinygrad.git
|
||||
|
||||
25
.idea/customTargets.xml
generated
Normal file
25
.idea/customTargets.xml
generated
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CLionExternalBuildManager">
|
||||
<target id="a62f99e8-5ec4-434c-8122-49efed5af108" name="Poetry SCons Build Debug" defaultType="TOOL">
|
||||
<configuration id="b93ec964-16e5-4962-a12e-3ed360ce8f02" name="Poetry SCons Build Debug">
|
||||
<build type="TOOL">
|
||||
<tool actionId="Tool_External Tools_Poetry SCons Build Debug" />
|
||||
</build>
|
||||
<clean type="TOOL">
|
||||
<tool actionId="Tool_External Tools_Poetry SCons Clean" />
|
||||
</clean>
|
||||
</configuration>
|
||||
</target>
|
||||
<target id="edd8ad9d-183b-467c-a355-0d9a0ecab026" name="Poetry SCons Build Release" defaultType="TOOL">
|
||||
<configuration id="09523339-5ce3-4223-ab9e-904f38ad7752" name="Poetry SCons Build Release">
|
||||
<build type="TOOL">
|
||||
<tool actionId="Tool_External Tools_Poetry SCons Build Release" />
|
||||
</build>
|
||||
<clean type="TOOL">
|
||||
<tool actionId="Tool_External Tools_Poetry SCons Clean" />
|
||||
</clean>
|
||||
</configuration>
|
||||
</target>
|
||||
</component>
|
||||
</project>
|
||||
23
.idea/tools/External Tools.xml
generated
Normal file
23
.idea/tools/External Tools.xml
generated
Normal file
@@ -0,0 +1,23 @@
|
||||
<toolSet name="External Tools">
|
||||
<tool name="Poetry SCons Build Debug" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
|
||||
<exec>
|
||||
<option name="COMMAND" value="bash" />
|
||||
<option name="PARAMETERS" value="-c "source .venv/bin/activate && scons -u -j$(nproc) --compile_db --ccflags=\"-fno-inline\""" />
|
||||
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
|
||||
</exec>
|
||||
</tool>
|
||||
<tool name="Poetry SCons Clean" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
|
||||
<exec>
|
||||
<option name="COMMAND" value="bash" />
|
||||
<option name="PARAMETERS" value="-c "source .venv/bin/activate && scons -c" " />
|
||||
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
|
||||
</exec>
|
||||
</tool>
|
||||
<tool name="Poetry SCons Build Release" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
|
||||
<exec>
|
||||
<option name="COMMAND" value="bash" />
|
||||
<option name="PARAMETERS" value="-c "source .venv/bin/activate && scons -u -j$(nproc) --compile_db" " />
|
||||
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
|
||||
</exec>
|
||||
</tool>
|
||||
</toolSet>
|
||||
4
.lfsconfig-prebuilts
Normal file
4
.lfsconfig-prebuilts
Normal file
@@ -0,0 +1,4 @@
|
||||
[lfs]
|
||||
url = https://gitlab.com/sunnypilot/public/sunnypilot-prebuilt-lfs.git/info/lfs
|
||||
pushurl = ssh://git@gitlab.com/sunnypilot/public/sunnypilot-prebuilt-lfs.git
|
||||
locksverify = false
|
||||
10
.run/Build Debug.run.xml
Normal file
10
.run/Build Debug.run.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Build Debug" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$/selfdrive/ui" PASS_PARENT_ENVS_2="true" PROJECT_NAME="openpilot-special" TARGET_NAME="Poetry SCons Build Debug" CONFIG_NAME="Poetry SCons Build Debug" RUN_PATH="ui">
|
||||
<envs>
|
||||
<env name="QT_DBL_CLICK_DIST" value="150" />
|
||||
</envs>
|
||||
<method v="2">
|
||||
<option name="CLION.EXTERNAL.BUILD" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Build Release.run.xml
Normal file
10
.run/Build Release.run.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Build Release" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$/selfdrive/ui" PASS_PARENT_ENVS_2="true" PROJECT_NAME="openpilot-special" TARGET_NAME="Poetry SCons Build Release" CONFIG_NAME="Poetry SCons Build Release" RUN_PATH="ui">
|
||||
<envs>
|
||||
<env name="QT_DBL_CLICK_DIST" value="150" />
|
||||
</envs>
|
||||
<method v="2">
|
||||
<option name="CLION.EXTERNAL.BUILD" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
1
.vscode/launch.json
vendored
1
.vscode/launch.json
vendored
@@ -7,6 +7,7 @@
|
||||
"description": "Select the process to debug",
|
||||
"options": [
|
||||
"selfdrive/controls/controlsd.py",
|
||||
"selfdrive/navd/navd.py",
|
||||
"system/timed/timed.py",
|
||||
"tools/sim/run_bridge.py"
|
||||
]
|
||||
|
||||
@@ -1,6 +1,48 @@
|
||||
sunnypilot - 0.9.8.0 (2024-xx-xx)
|
||||
========================
|
||||
* Always on driver monitoring toggle
|
||||
************************
|
||||
* UPDATED: Synced with commaai's openpilot
|
||||
* master commit 4ef757c (July 06, 2024)
|
||||
* NEW❗: Default Driving Model: Notre Dame (July 01, 2024)
|
||||
* NEW❗: Longitudinal: Acceleration Personality thanks to kegman, rav4kumar, and arne1282!
|
||||
* Select from three distinct acceleration personalities: Eco, Normal, and Sport
|
||||
* Acceleration personalities are integrated directly into the model's acceleration matrix and can be activated in real-time!
|
||||
* NEW❗: Longitudinal: Dynamic Personality thanks to rav4kumar!
|
||||
* Dynamically adjusts following distance and reaction based on your "Driving Personality" setting
|
||||
* Personalities adapt in real-time to your speed and the distance to the lead car
|
||||
* Provides a more responsive and tailored driving experience compared to predefined settings
|
||||
* UPDATED: Driving Personality: Updated mode names
|
||||
* Aggressive, Moderate, Standard, Relaxed
|
||||
* NEW❗: Toyota - Enhanced Blind Spot Monitor (BSM) thanks to arne182, rav4kumar, and eFiniLan!
|
||||
* Enables Blind Spot Monitor (BSM) signals parsing in sunnypilot using the factory Blind Spot Monitor (BSM)
|
||||
* sunnypilot will use debugging CAN messages to receive unfiltered BSM signals, allowing detection of more objects
|
||||
* Supported platforms
|
||||
* RAV4 TSS1, equipped with factory Blind Spot Monitoring (BSM)
|
||||
* Lexus LSS1, equipped with factory Blind Spot Monitoring (BSM)
|
||||
* Toyota TSS1/1.5, equipped with factory Blind Spot Monitoring (BSM)
|
||||
* Prius TSS2, equipped with factory Blind Spot Monitoring (BSM)
|
||||
* NOTE: Only enable this feature if your Toyota/Lexus vehicle has factory Blind Spot Monitor equipped, and mentioned in the supported platforms list
|
||||
* UPDATED: Toyota: TSS2 longitudinal: Custom Tuning
|
||||
* Re-tuned and tested by the community (July 1, 2024)
|
||||
* UPDATED: Driving Model Selector v5
|
||||
* NEW❗: Driving Model additions
|
||||
* Notre Dame (July 01, 2024) - NDv3
|
||||
* UPDATED: Toyota: Continued support for Smart DSU (SDSU) and Radar CAN Filter
|
||||
* In response to the official deprecation of support for Smart DSU (SDSU) and Radar CAN Filter in the upstream ([commaai/openpilot#32777](https://github.com/commaai/openpilot/pull/32777)), sunnypilot will continue maintaining software support for Smart DSU (SDSU) and Radar CAN Filter
|
||||
* UPDATED: Continued support for Mapbox navigation
|
||||
* In response to the official temporary deprecation of support for Mapbox navigation in the upstream ([commaai/openpilot#32773](https://github.com/commaai/openpilot/pull/32773)), sunnypilot will continue maintaining software support for Mapbox navigation
|
||||
* NEW❗: Toyota - Automatic Door Locking and Unlocking thanks to AlexandreSato, cydia2020, and dragonpilot-community!
|
||||
* Auto Lock by Speed: All doors are automatically locked when vehicle speed is approximately 6 mph (10 km/h) or higher
|
||||
* Auto Unlock by Shift to P: All doors are automatically unlocked when shifting the shift lever to P
|
||||
* FIXED: Driving Personality:
|
||||
* Maniac mode now correctly enforced when selected
|
||||
* UI Updates
|
||||
* Display Metrics Below Chevron
|
||||
* NEW❗: Time to Lead Car
|
||||
* Displays the time to reach the position previously occupied by the lead car
|
||||
* NEW❗: Display Distance, Speed, and Time to Lead Car simultaneously
|
||||
* Kia Ceed Plug-in Hybrid Non-SCC 2022 support thanks to TerminatorNL!
|
||||
|
||||
sunnypilot - 0.9.7.1 (2024-06-13)
|
||||
========================
|
||||
|
||||
77
HOW-TOS.md
Normal file
77
HOW-TOS.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# How Tos
|
||||
This page is a repository of useful how-tos as a supplement for additional information.
|
||||
|
||||
Table of Contents
|
||||
=======================
|
||||
|
||||
* [Radar Tracks](#Radar-Tracks)
|
||||
* [Enable Radar Tracks](#-Enable-Radar-Tracks)
|
||||
* [Enable Mapbox Navigation](#-Enable-Mapbox-Navigation)
|
||||
|
||||
---
|
||||
|
||||
<details><summary><h3>📡 Radar Tracks</h3></summary>
|
||||
|
||||
Radar tracks can now be enabled manually on applicable cars through SSH thanks to [@greghogan](https://github.com/greghogan) and [@pd0wm](https://github.com/pd0wm).
|
||||
|
||||
Some Hyundai radars can be reconfigured to output (debug) radar points on bus 1.
|
||||
Reconfiguration is done over UDS by reading/writing to 0x0142 using the Read/Write Data By Identifier
|
||||
endpoints (0x22 & 0x2E). This script checks your radar firmware version against a list of known
|
||||
firmware versions. If you want to try on a new radar, make sure to note the default config value
|
||||
in case it is different from the other radars and you need to revert the changes.
|
||||
After changing the config the car should not show any faults when openpilot is not running.
|
||||
These config changes are persistent across car reboots. You need to run this script again
|
||||
to go back to the default values.
|
||||
|
||||
**USE AT YOUR OWN RISK!** Stock system safety features, like AEB and FCW, might be affected by these changes.
|
||||
|
||||
**How radar points can be used along with vision:**
|
||||
* Current OP long policy is identify with vision first, if vision sees a vehicle match it to a radar point. If vision sees nothing you get a false negative and no lead car detection. (Source: [Hubblesphere#7894 from comma.ai community Discord](https://discord.com/channels/469524606043160576/872899198738104330/872913890793635872))
|
||||
|
||||
### 🚨 Enable Radar Tracks
|
||||
|
||||
***(EXPERIMENTAL, as of January 1st, 2022)***
|
||||
|
||||
***(Only applicable to some Hyundai, Kia, and Genesis cars, as of January 1st, 2022)***
|
||||
|
||||
*(Base on version 0.8.12 [`devel`](https://github.com/commaai/openpilot/tree/devel))*
|
||||
|
||||
**USE AT YOUR OWN RISK!** Stock system safety features, like AEB and FCW, might be affected by these changes.
|
||||
|
||||
1. Ensure the car is at the `OFF` ignition position.
|
||||
2. Connect your compatible comma device (EON, C2, C3) to the car. comma device power should be ON.
|
||||
3. Use a laptop or applicable device to connect to your comma device via SSH. (Tips: Instructions to SSH in [HERE](https://github.com/commaai/openpilot/wiki/SSH))
|
||||
4. In the SSH terminal after successfully connected to your comma device, execute the following commands:
|
||||
1. `pkill -f openpilot`
|
||||
2. `python /data/openpilot/selfdrive/debug/hyundai_enable_radar_points.py`
|
||||
3. Follow the instructions in the script:
|
||||
* `Power on the vehicle keeping the engine off (press start button twice) then type OK to continue`.
|
||||
* If successful, the following message should appear: `[DONE]. Restart your vehicle and ensure there are no faults`.
|
||||
* If the script did not run successfully, reach out to the community in [Sunnyhaibin's Openpilot Discord Server](https://discord.gg/wRW3meAgtx) or `#hyundai-kia-genesis channel` on [commaai community Discord Server](https://discord.comma.ai) for assistance.
|
||||
4. Reboot your comma device:
|
||||
1. C3: `sudo reboot`
|
||||
2. C2 or EON: `reboot`
|
||||
5. Once your comma device is rebooted, start your car with engine on (with or without comma device connected). Ensure that there are no faults from the car. If there are faults, reach out to the community in [Sunnyhaibin's Openpilot Discord Server](https://discord.gg/wRW3meAgtx) or `#hyundai-kia-genesis channel` on [commaai community Discord Server](https://discord.comma.ai) for assistance.
|
||||
6. Go for a quick drive and drive behind a lead car with varied follow distance. Then, come back and allow the drive to upload its `rlogs` in [comma Connect](https://connect.comma.ai).
|
||||
7. With all `rlogs` uploaded, open the drive in Cabana from [comma Connect](https://connect.comma.ai). Load DBC -> `hyundai_kia_mando_front_radar.dbc`, then search `RADAR_TRACK_50x` (`x` could be anything), open any of them, and look at `LONG_DIST`.
|
||||
8. If the radar tracks data is relevant with the lead car you drove behind, you are done! Your car now have radar tracks enabled.
|
||||
</details>
|
||||
|
||||
<details><summary><h3>🗺 Enable Mapbox Navigation</h3></summary>
|
||||
|
||||
1) Create a free mapbox account. Account will ask for a credit card for verification. You will not be charged for the free tier.
|
||||
2) On the Dashboard, you will see a section called Access Tokens. Click `Create a Token`. Name it whatever you like. Set the scopes to allow everything for both Public and Secret. Copy both of these keys. **YOU WON'T BE ABLE TO ACCESS THE SECRET KEY AFTER THIS WINDOW.**
|
||||
3) Once rebooted, connect your C3 to a network with internet access and find the C3’s IP address.
|
||||
4) In a browser, navigate to that IP with **port 8082** (i.e 192.168.1.69:8082). You should be greeted with the Comma logo and a public key input field.
|
||||
5) Paste your Public token (pk.xx), click enter, paste your Secret key (sk.xx), click enter. You can now search for places. This page will be available at your devices’s IP address/port 8082 to search for destinations.
|
||||
6) To set Home and Work addresses, search for a place, select Home/Work from the dropdown and click Navigate. For non-Home/Work destinations, select Recent Places.<br>*At this time, it is not possible to search directly on the C3.*
|
||||
|
||||
**TIPS:**
|
||||
- If your C3 is showing a black screen that says “Map Loading”, performing a reboot via the UI should fix it.
|
||||
- If your phone can create a Hotspot, you are able to connect the C3 to your phone hotspot and use your phone browser to search for places.
|
||||
- In the Navigation panel on the C3, you can select Home, Work, and from a list of Recent Places you have navigated to without needing a browser (assuming the C3 is connected to the internet.)
|
||||
|
||||
**IMPORTANT NOTE:** Your C3 will require an active internet connection to download map data, generate driving directions, and ETA. Once map data and directions are downloaded, it *is* possible to use it offline, however nothing will update (such as new driving direction after a missed turn, updated ETA, map data further into your drive etc.)
|
||||
|
||||
***NAVIGATION NOTE:** At this time, mapbox does not support alphanumeric addresses (i.e W123N1234 Main St). There is currently no known workaround for this.*
|
||||
</details>
|
||||
3
Jenkinsfile
vendored
3
Jenkinsfile
vendored
@@ -26,6 +26,7 @@ export SOURCE_DIR=${env.SOURCE_DIR}
|
||||
export GIT_BRANCH=${env.GIT_BRANCH}
|
||||
export GIT_COMMIT=${env.GIT_COMMIT}
|
||||
export AZURE_TOKEN='${env.AZURE_TOKEN}'
|
||||
export MAPBOX_TOKEN='${env.MAPBOX_TOKEN}'
|
||||
# only use 1 thread for tici tests since most require HIL
|
||||
export PYTEST_ADDOPTS="-n 0"
|
||||
|
||||
@@ -134,8 +135,10 @@ def pcStage(String stageName, Closure body) {
|
||||
def setupCredentials() {
|
||||
withCredentials([
|
||||
string(credentialsId: 'azure_token', variable: 'AZURE_TOKEN'),
|
||||
string(credentialsId: 'mapbox_token', variable: 'MAPBOX_TOKEN')
|
||||
]) {
|
||||
env.AZURE_TOKEN = "${AZURE_TOKEN}"
|
||||
env.MAPBOX_TOKEN = "${MAPBOX_TOKEN}"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
21
LICENSE.md
Normal file
21
LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Custom MIT License
|
||||
|
||||
Copyright (c) 2024, Haibin Wen, SUNNYPILOT LLC
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to view and modify the Software, subject to the following conditions:
|
||||
|
||||
1. **Permission Required**: Permission Required for Commercial, For-Profit, or Closed Source Use: Use of the Software, in whole or in part, for any commercial purposes, for-profit projects, or in closed source projects requires explicit written permission from the original author(s).
|
||||
|
||||
2. **Redistribution**: Any redistribution of the Software, modified or unmodified, must retain this license notice and the following acknowledgment:
|
||||
"This software is licensed under a custom license requiring permission for use."
|
||||
|
||||
3. **Visibility**: Any project that uses the Software must visibly mention the following acknowledgment:
|
||||
"This project uses software from Haibin Wen and SUNNYPILOT LLC and is licensed under a custom license requiring permission for use."
|
||||
|
||||
4. **No Warranty**: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Contact sunnypilot Support <support@sunnypilot.ai> for permission requests.
|
||||
|
||||
---
|
||||
|
||||
Haibin Wen, SUNNYPILOT LLC
|
||||
53
README.md
53
README.md
@@ -48,7 +48,6 @@ Join the official sunnypilot Discord server to stay up to date with all the late
|
||||
To use sunnypilot in a car, you need the following:
|
||||
* A supported device to run this software
|
||||
* a [comma three](https://comma.ai/shop/products/three), or
|
||||
* a comma two (only with older versions below 0.8.13)
|
||||
* This software
|
||||
* One of [the 250+ supported cars](https://github.com/commaai/openpilot/blob/master/docs/CARS.md). We support Honda, Toyota, Hyundai, Nissan, Kia, Chrysler, Lexus, Acura, Audi, VW, Ford and more. If your car is not supported but has adaptive cruise control and lane-keeping assist, it's likely able to run sunnypilot.
|
||||
* A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car
|
||||
@@ -115,40 +114,12 @@ Please refer to [Recommended Branches](#-recommended-branches) to find your pref
|
||||
|
||||
Requires further assistance with software installation? Join the [sunnypilot Discord server](https://discord.sunnypilot.com) and message us in the `#installation-help` channel.
|
||||
|
||||
comma two
|
||||
------
|
||||
|
||||
1. [Factory reset/uninstall](https://github.com/commaai/openpilot/wiki/FAQ#how-can-i-reset-the-device) the previous software if you have another software/fork installed.
|
||||
2. After factory reset/uninstall and upon reboot, select `Custom Software` when given the option.
|
||||
3. Input the installation URL per [Recommended Branches](#-recommended-branches). Example: ```https://smiskol.com/fork/sunnyhaibin/0.8.12-4-prod```
|
||||
4. Complete the rest of the installation following the onscreen instructions.
|
||||
|
||||
Requires further assistance with software installation? Join the [sunnypilot Discord server](https://discord.sunnypilot.com) and message us in the `#installation-help` channel.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>SSH (More Versatile)</summary>
|
||||
<br>
|
||||
|
||||
Prerequisites: [How to SSH](https://github.com/commaai/openpilot/wiki/SSH)
|
||||
|
||||
If you are looking to install sunnypilot via SSH, run the following command in an SSH terminal after connecting to your device:
|
||||
|
||||
comma three:
|
||||
------
|
||||
* [`release-c3`](https://github.com/sunnyhaibin/openpilot/tree/release-c3):
|
||||
|
||||
```
|
||||
cd /data; rm -rf ./openpilot; git clone -b release-c3 --recurse-submodules https://github.com/sunnyhaibin/sunnypilot.git openpilot; cd openpilot; sudo reboot
|
||||
```
|
||||
|
||||
comma two:
|
||||
------
|
||||
* [`0.8.12-prod-personal-hkg`](https://github.com/sunnyhaibin/openpilot/tree/0.8.12-prod-personal-hkg):
|
||||
|
||||
```
|
||||
cd /data; rm -rf ./openpilot; git clone -b 0.8.12-prod-personal-hkg --recurse-submodules https://github.com/sunnyhaibin/sunnypilot.git openpilot; cd openpilot; sudo reboot
|
||||
cd /data && rm -rf ./openpilot && git clone -b release-c3 --recurse-submodules https://github.com/sunnyhaibin/sunnypilot.git openpilot && cd openpilot && sudo reboot
|
||||
```
|
||||
|
||||
After running the command to install the desired branch, your comma device should reboot.
|
||||
@@ -170,16 +141,16 @@ After running the command to install the desired branch, your comma device shoul
|
||||
* Speed Limit Control (SLC) - Set speed limit based on map data or car interface (if applicable)
|
||||
* HKG only: Highway Driving Assist (HDA) status integration - Use cars native speed sign detection to set desired speed (on applicable HKG cars only)
|
||||
- [**Gap Adjust Cruise (GAC)**](#gap-adjust-cruise) - Allow `GAP`/`INTERVAL`/`DISTANCE` button on the steering wheel or on-screen button to adjust the follow distance from the lead car. See table below for options
|
||||
- [**Quiet Drive 🤫**](#-quiet-drive) - Toggle to mute all notification sounds (excluding driver safety warnings)
|
||||
- [**Auto Lane Change Timer**](#Auto-Lane-Change-Timer) - Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set
|
||||
- [**Force Car Recognition (FCR)**](#Force-Car-Recognition-) - Use a selector to force your car to be recognized by sunnypilot
|
||||
- [**Fix sunnypilot No Offroad**](#Fix-sunnypilot-No-Offroad) - Enforce sunnypilot to go offroad and turns off after shutting down the car. This feature fixes non-official devices running sunnypilot without comma power
|
||||
- [**Enable ACC+MADS with RES+/SET-**](#Enable-ACC+MADS-with-RES+/SET-) - Engage both ACC and MADS with a single press of RES+ or SET- button
|
||||
- [**Offline OSM Maps**](#Offline-OSM-Maps) - OSM database can now be downloaded locally for offline use[^2]. This enables offline SLC, V-TSC and M-TSC. Currently available for US South, US West, US Northeast, Florida, Taiwan, South Africa and New Zealand
|
||||
- [**Various Live Tuning**](#Various-Live-Tuning) - Ability to tailor your driving experience on the fly:
|
||||
* Enforce Torque Lateral Control - Use the newest [torque controller](https://blog.comma.ai/0815release/#torque-controller) for all vehicles.
|
||||
* Torque Lateral Control Live Tune - Ability to adjust the torque controller’s `FRICTION` and `LAT_ACCEL_FACTOR` values to suit your vehicle.
|
||||
* Torque Lateral Controller Self-Tune - Enable automatic turning for the Torque controller.
|
||||
- [**Quiet Drive 🤫**](#-quiet-drive) - Toggle to mute all notification sounds (excluding driver safety warnings)
|
||||
- [**Auto Lane Change Timer**](#Auto-Lane-Change-Timer) - Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set
|
||||
- [**Force Car Recognition (FCR)**](#Force-Car-Recognition-) - Use a selector to force your car to be recognized by sunnypilot
|
||||
- [**Fix sunnypilot No Offroad**](#Fix-sunnypilot-No-Offroad) - Enforce sunnypilot to go offroad and turns off after shutting down the car. This feature fixes non-official devices running sunnypilot without comma power
|
||||
- [**Enable ACC+MADS with RES+/SET-**](#Enable-ACC+MADS-with-RES+/SET-) - Engage both ACC and MADS with a single press of RES+ or SET- button
|
||||
- [**Offline OSM Maps**](#Offline-OSM-Maps) - OSM database can now be downloaded locally for offline use[^2]. This enables offline SLC, V-TSC and M-TSC. Currently available for US South, US West, US Northeast, Florida, Taiwan, South Africa and New Zealand
|
||||
- [**Various Live Tuning**](#Various-Live-Tuning) - Ability to tailor your driving experience on the fly:
|
||||
* Enforce Torque Lateral Control - Use the newest [torque controller](https://blog.comma.ai/0815release/#torque-controller) for all vehicles.
|
||||
* Torque Lateral Control Live Tune - Ability to adjust the torque controller’s `FRICTION` and `LAT_ACCEL_FACTOR` values to suit your vehicle.
|
||||
* Torque Lateral Controller Self-Tune - Enable automatic turning for the Torque controller.
|
||||
|
||||
### Visual Enhancements
|
||||
* **M.A.D.S Status Icon** - Dedicated icon to display M.A.D.S. engagement status
|
||||
@@ -355,7 +326,7 @@ Example:
|
||||
|
||||
---
|
||||
|
||||
How-To instructions can be found in [HOW-TOS.md](https://github.com/sunnyhaibin/openpilot/blob/(!)README/HOW-TOS.md).
|
||||
How-To instructions can be found in [HOW-TOS.md](HOW-TOS.md).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
22
SConstruct
22
SConstruct
@@ -14,6 +14,8 @@ SCons.Warnings.warningAsException(True)
|
||||
|
||||
TICI = os.path.isfile('/TICI')
|
||||
AGNOS = TICI
|
||||
UBUNTU_FOCAL = int(subprocess.check_output('[ -f /etc/os-release ] && . /etc/os-release && [ "$ID" = "ubuntu" ] && [ "$VERSION_ID" = "20.04" ] && echo 1 || echo 0', shell=True, encoding='utf-8').rstrip())
|
||||
Export('UBUNTU_FOCAL')
|
||||
|
||||
Decider('MD5-timestamp')
|
||||
|
||||
@@ -70,6 +72,12 @@ AddOption('--minimal',
|
||||
default=os.path.exists(File('#.lfsconfig').abspath), # minimal by default on release branch (where there's no LFS)
|
||||
help='the minimum build to run openpilot. no tests, tools, etc.')
|
||||
|
||||
AddOption('--stock-ui',
|
||||
action='store_true',
|
||||
dest='stock_ui',
|
||||
default=False,
|
||||
help='Build stock UI instead of sunnypilot UI')
|
||||
|
||||
## Architecture name breakdown (arch)
|
||||
## - larch64: linux tici aarch64
|
||||
## - aarch64: linux pc aarch64
|
||||
@@ -173,6 +181,10 @@ if arch != "Darwin":
|
||||
cflags += ['-DSWAGLOG="\\"common/swaglog.h\\""']
|
||||
cxxflags += ['-DSWAGLOG="\\"common/swaglog.h\\""']
|
||||
|
||||
if not GetOption('stock_ui'):
|
||||
cflags += ["-DSUNNYPILOT"]
|
||||
cxxflags += ["-DSUNNYPILOT"]
|
||||
|
||||
ccflags_option = GetOption('ccflags')
|
||||
if ccflags_option:
|
||||
ccflags += ccflags_option.split(' ')
|
||||
@@ -211,6 +223,8 @@ env = Environment(
|
||||
"#cereal",
|
||||
"#msgq",
|
||||
"#opendbc/can",
|
||||
"#third_party/maplibre-native-qt/include",
|
||||
f"#third_party/maplibre-native-qt/{arch}/include"
|
||||
],
|
||||
|
||||
CC='clang',
|
||||
@@ -244,7 +258,8 @@ if GetOption('compile_db'):
|
||||
env.CompilationDatabase('compile_commands.json')
|
||||
|
||||
# Setup cache dir
|
||||
cache_dir = '/data/scons_cache' if AGNOS else '/tmp/scons_cache'
|
||||
default_cache_dir = '/data/scons_cache' if AGNOS else '/tmp/scons_cache'
|
||||
cache_dir = ARGUMENTS.get('cache_dir', default_cache_dir)
|
||||
CacheDir(cache_dir)
|
||||
Clean(["."], cache_dir)
|
||||
|
||||
@@ -275,7 +290,7 @@ Export('envCython')
|
||||
|
||||
# Qt build environment
|
||||
qt_env = env.Clone()
|
||||
qt_modules = ["Widgets", "Gui", "Core", "Network", "Concurrent", "Multimedia", "Quick", "Qml", "QuickWidgets", "DBus", "Xml"]
|
||||
qt_modules = ["Widgets", "Gui", "Core", "Network", "Concurrent", "Multimedia", "Quick", "Qml", "QuickWidgets", "Location", "Positioning", "DBus", "Xml"]
|
||||
|
||||
qt_libs = []
|
||||
if arch == "Darwin":
|
||||
@@ -328,7 +343,8 @@ qt_flags = [
|
||||
"-DQT_MESSAGELOGCONTEXT",
|
||||
]
|
||||
qt_env['CXXFLAGS'] += qt_flags
|
||||
qt_env['LIBPATH'] += ['#selfdrive/ui', ]
|
||||
qt_env['LIBPATH'] += ['#selfdrive/ui', f"#third_party/maplibre-native-qt/{arch}/lib"]
|
||||
qt_env['RPATH'] += [Dir(f"#third_party/maplibre-native-qt/{arch}/lib").srcnode().abspath]
|
||||
qt_env['LIBS'] = qt_libs
|
||||
|
||||
if GetOption("clazy"):
|
||||
|
||||
@@ -18,9 +18,27 @@ enum LongitudinalPersonalitySP {
|
||||
relaxed @3;
|
||||
}
|
||||
|
||||
enum AccelerationPersonality {
|
||||
sport @0;
|
||||
normal @1;
|
||||
eco @2;
|
||||
stock @3;
|
||||
}
|
||||
|
||||
enum ModelGeneration {
|
||||
default @0;
|
||||
one @1;
|
||||
two @2;
|
||||
three @3;
|
||||
four @4;
|
||||
five @5;
|
||||
}
|
||||
|
||||
struct ControlsStateSP @0x81c2f05a394cf4af {
|
||||
lateralState @0 :Text;
|
||||
personality @8 :LongitudinalPersonalitySP;
|
||||
dynamicPersonality @9 :Bool;
|
||||
accelPersonality @10 :AccelerationPersonality;
|
||||
|
||||
lateralControlState :union {
|
||||
indiState @1 :LateralINDIState;
|
||||
@@ -180,6 +198,9 @@ struct E2eLongStateSP @0xa5cd762cd951a455 {
|
||||
struct ModelDataV2SP @0xf98d843bfd7004a3 {
|
||||
laneChangePrev @0 :Bool;
|
||||
laneChangeEdgeBlock @1 :Bool;
|
||||
customModel @2 :Bool;
|
||||
modelGeneration @3 :ModelGeneration;
|
||||
modelCapabilities @4 :UInt32;
|
||||
}
|
||||
|
||||
struct CustomReserved7 @0xb86e6369214c01c8 {
|
||||
|
||||
@@ -1,46 +1,27 @@
|
||||
import jwt
|
||||
import os
|
||||
import requests
|
||||
from datetime import datetime, timedelta, UTC
|
||||
from openpilot.system.hardware.hw import Paths
|
||||
from openpilot.system.version import get_version
|
||||
from .comma_connect import CommaConnectApi
|
||||
from .sunnylink import SunnylinkApi
|
||||
|
||||
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
|
||||
|
||||
class Api:
|
||||
def __init__(self, dongle_id):
|
||||
self.dongle_id = dongle_id
|
||||
with open(Paths.persist_root()+'/comma/id_rsa') as f:
|
||||
self.private_key = f.read()
|
||||
def __init__(self, dongle_id, use_sunnylink=False):
|
||||
if use_sunnylink:
|
||||
self.service = SunnylinkApi(dongle_id)
|
||||
else:
|
||||
self.service = CommaConnectApi(dongle_id)
|
||||
|
||||
def request(self, method, endpoint, **params):
|
||||
return self.service.request(method, endpoint, **params)
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
return self.request('GET', *args, **kwargs)
|
||||
return self.service.get(*args, **kwargs)
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
return self.request('POST', *args, **kwargs)
|
||||
|
||||
def request(self, method, endpoint, timeout=None, access_token=None, **params):
|
||||
return api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params)
|
||||
return self.service.post(*args, **kwargs)
|
||||
|
||||
def get_token(self, expiry_hours=1):
|
||||
now = datetime.now(UTC).replace(tzinfo=None)
|
||||
payload = {
|
||||
'identity': self.dongle_id,
|
||||
'nbf': now,
|
||||
'iat': now,
|
||||
'exp': now + timedelta(hours=expiry_hours)
|
||||
}
|
||||
token = jwt.encode(payload, self.private_key, algorithm='RS256')
|
||||
if isinstance(token, bytes):
|
||||
token = token.decode('utf8')
|
||||
return token
|
||||
return self.service.get_token(expiry_hours)
|
||||
|
||||
|
||||
def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
|
||||
headers = {}
|
||||
if access_token is not None:
|
||||
headers['Authorization'] = "JWT " + access_token
|
||||
|
||||
headers['User-Agent'] = "openpilot-" + get_version()
|
||||
|
||||
return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params)
|
||||
def api_get(endpoint, method='GET', timeout=None, access_token=None, use_sunnylink=False, **params):
|
||||
return CommaConnectApi(None).api_get(endpoint, method, timeout, access_token, **params) if not use_sunnylink else \
|
||||
SunnylinkApi(None).api_get(endpoint, method, timeout, access_token, **params)
|
||||
|
||||
56
common/api/base.py
Normal file
56
common/api/base.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import jwt
|
||||
import requests
|
||||
import unicodedata
|
||||
from datetime import datetime, timedelta, UTC
|
||||
from openpilot.system.hardware.hw import Paths
|
||||
from openpilot.system.version import get_version
|
||||
|
||||
|
||||
class BaseApi:
|
||||
def __init__(self, dongle_id, api_host, user_agent="openpilot-"):
|
||||
self.dongle_id = dongle_id
|
||||
self.api_host = api_host
|
||||
self.user_agent = user_agent
|
||||
with open(Paths.persist_root()+'/comma/id_rsa') as f:
|
||||
self.private_key = f.read()
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
return self.request('GET', *args, **kwargs)
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
return self.request('POST', *args, **kwargs)
|
||||
|
||||
def request(self, method, endpoint, timeout=None, access_token=None, **params):
|
||||
return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params)
|
||||
|
||||
def _get_token(self, expiry_hours=1, **extra_payload):
|
||||
now = datetime.now(UTC).replace(tzinfo=None)
|
||||
payload = {
|
||||
'identity': self.dongle_id,
|
||||
'nbf': now,
|
||||
'iat': now,
|
||||
'exp': now + timedelta(hours=expiry_hours),
|
||||
**extra_payload
|
||||
}
|
||||
token = jwt.encode(payload, self.private_key, algorithm='RS256')
|
||||
if isinstance(token, bytes):
|
||||
token = token.decode('utf8')
|
||||
return token
|
||||
|
||||
def get_token(self, expiry_hours=1):
|
||||
return self._get_token(expiry_hours)
|
||||
|
||||
def remove_non_ascii_chars(self, text):
|
||||
normalized_text = unicodedata.normalize('NFD', text)
|
||||
ascii_encoded_text = normalized_text.encode('ascii', 'ignore')
|
||||
return ascii_encoded_text.decode()
|
||||
|
||||
def api_get(self, endpoint, method='GET', timeout=None, access_token=None, **params):
|
||||
headers = {}
|
||||
if access_token is not None:
|
||||
headers['Authorization'] = "JWT " + access_token
|
||||
|
||||
version = self.remove_non_ascii_chars(get_version())
|
||||
headers['User-Agent'] = self.user_agent + version
|
||||
|
||||
return requests.request(method, self.api_host + "/" + endpoint, timeout=timeout, headers=headers, params=params)
|
||||
11
common/api/comma_connect.py
Normal file
11
common/api/comma_connect.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import os
|
||||
|
||||
from openpilot.common.api.base import BaseApi
|
||||
|
||||
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
|
||||
|
||||
|
||||
class CommaConnectApi(BaseApi):
|
||||
def __init__(self, dongle_id):
|
||||
super().__init__(dongle_id, API_HOST)
|
||||
self.user_agent = "openpilot-"
|
||||
155
common/api/sunnylink.py
Normal file
155
common/api/sunnylink.py
Normal file
@@ -0,0 +1,155 @@
|
||||
import os
|
||||
import time
|
||||
import jwt
|
||||
import json
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timedelta
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.system.hardware import HARDWARE
|
||||
from openpilot.system.hardware.hw import Paths
|
||||
|
||||
from openpilot.common.api.base import BaseApi
|
||||
|
||||
API_HOST = os.getenv('SUNNYLINK_API_HOST', 'https://stg.api.sunnypilot.ai')
|
||||
UNREGISTERED_SUNNYLINK_DONGLE_ID = "UnregisteredDevice"
|
||||
MAX_RETRIES = 6
|
||||
CRASH_LOG_DIR = '/data/community/crashes'
|
||||
|
||||
class SunnylinkApi(BaseApi):
|
||||
def __init__(self, dongle_id):
|
||||
super().__init__(dongle_id, API_HOST)
|
||||
self.user_agent = "sunnypilot-"
|
||||
self.spinner = None
|
||||
self.params = Params()
|
||||
|
||||
def api_get(self, endpoint, method='GET', timeout=10, access_token=None, **kwargs):
|
||||
if not self.params.get_bool("SunnylinkEnabled"):
|
||||
return None
|
||||
|
||||
return super().api_get(endpoint, method, timeout, access_token, **kwargs)
|
||||
|
||||
def resume_queued(self, timeout=10, **kwargs):
|
||||
sunnylinkId, commaId = self._resolve_dongle_ids()
|
||||
return self.api_get(f"ws/{sunnylinkId}/resume_queued", "POST", timeout, access_token=self.get_token(), **kwargs)
|
||||
|
||||
def get_token(self, expiry_hours=1):
|
||||
# Add your additional data here
|
||||
additional_data = {}
|
||||
return super()._get_token(expiry_hours, **additional_data)
|
||||
|
||||
def _status_update(self, message):
|
||||
print(message)
|
||||
if self.spinner:
|
||||
self.spinner.update(message)
|
||||
time.sleep(0.5)
|
||||
|
||||
def _resolve_dongle_ids(self):
|
||||
sunnylink_dongle_id = self.params.get("SunnylinkDongleId", encoding='utf-8')
|
||||
comma_dongle_id = self.dongle_id or self.params.get("DongleId", encoding='utf-8')
|
||||
return sunnylink_dongle_id, comma_dongle_id
|
||||
|
||||
def _resolve_imeis(self):
|
||||
imei1, imei2 = None, None
|
||||
imei_try = 0
|
||||
while imei1 is None and imei2 is None and imei_try < MAX_RETRIES:
|
||||
try:
|
||||
imei1, imei2 = self.params.get("IMEI", encoding='utf8') or HARDWARE.get_imei(0), HARDWARE.get_imei(1)
|
||||
except Exception:
|
||||
self._status_update(f"Error getting imei, trying again... [{imei_try+1}/{MAX_RETRIES}]")
|
||||
time.sleep(1)
|
||||
imei_try += 1
|
||||
return imei1, imei2
|
||||
|
||||
def _resolve_serial(self):
|
||||
serial = self.params.get("HardwareSerial", encoding='utf8') or HARDWARE.get_serial()
|
||||
return serial
|
||||
|
||||
def register_device(self, spinner=None, timeout=60, verbose=False):
|
||||
self.spinner = spinner
|
||||
|
||||
sunnylink_dongle_id, comma_dongle_id = self._resolve_dongle_ids()
|
||||
|
||||
if comma_dongle_id is None:
|
||||
self._status_update("Comma dongle ID not found, deferring sunnylink's registration to comma's registration process.")
|
||||
return None
|
||||
|
||||
imei1, imei2 = self._resolve_imeis()
|
||||
serial = self._resolve_serial()
|
||||
|
||||
if sunnylink_dongle_id not in (None, UNREGISTERED_SUNNYLINK_DONGLE_ID):
|
||||
return sunnylink_dongle_id
|
||||
|
||||
privkey_path = Path(Paths.persist_root()+"/comma/id_rsa")
|
||||
pubkey_path = Path(Paths.persist_root()+"/comma/id_rsa.pub")
|
||||
|
||||
start_time = time.monotonic()
|
||||
successful_registration = False
|
||||
if not pubkey_path.is_file():
|
||||
sunnylink_dongle_id = UNREGISTERED_SUNNYLINK_DONGLE_ID
|
||||
self._status_update("Public key not found, setting dongle ID to unregistered.")
|
||||
else:
|
||||
Params().put("LastSunnylinkPingTime", "0") # Reset the last ping time to 0 if we are trying to register
|
||||
with pubkey_path.open() as f1, privkey_path.open() as f2:
|
||||
public_key = f1.read()
|
||||
private_key = f2.read()
|
||||
|
||||
backoff = 1
|
||||
while True:
|
||||
register_token = jwt.encode({'register': True, 'exp': datetime.utcnow() + timedelta(hours=1)}, private_key, algorithm='RS256')
|
||||
try:
|
||||
if verbose or time.monotonic() - start_time < timeout / 2:
|
||||
self._status_update("Registering device to sunnylink...")
|
||||
elif time.monotonic() - start_time >= timeout / 2:
|
||||
self._status_update("Still registering device to sunnylink...")
|
||||
|
||||
resp = self.api_get("v2/pilotauth/", method='POST', timeout=15, imei=imei1, imei2=imei2, serial=serial, comma_dongle_id=comma_dongle_id, public_key=public_key, register_token=register_token)
|
||||
|
||||
if resp is None:
|
||||
raise Exception("Unable to register device, request was None")
|
||||
|
||||
if resp.status_code in (409, 412):
|
||||
timeout = time.monotonic() - start_time # Don't retry if the public key is already in use
|
||||
key_in_use = "Public key is already in use, is your key unique? Contact your vendor for a new key."
|
||||
unsafe_key = "Public key is known to not be unique and it's unsafe. Contact your vendor for a new key."
|
||||
error_message = key_in_use if resp.status_code == 409 else unsafe_key
|
||||
raise Exception(error_message)
|
||||
|
||||
if resp.status_code != 200:
|
||||
raise Exception(f"Failed to register with sunnylink. Status code: {resp.status_code}\nData\n:{resp.text}")
|
||||
|
||||
dongleauth = json.loads(resp.text)
|
||||
sunnylink_dongle_id = dongleauth["device_id"]
|
||||
if sunnylink_dongle_id:
|
||||
self._status_update("Device registered successfully.")
|
||||
successful_registration = True
|
||||
break
|
||||
except Exception as e:
|
||||
if verbose:
|
||||
self._status_update(f"Waiting {backoff}s before retry, Exception occurred during registration: [{str(e)}]")
|
||||
|
||||
if not os.path.exists(CRASH_LOG_DIR):
|
||||
os.makedirs(CRASH_LOG_DIR)
|
||||
|
||||
with open(f'{CRASH_LOG_DIR}/error.txt', 'a') as f:
|
||||
f.write(f"[{datetime.now()}] sunnylink: {str(e)}\n")
|
||||
|
||||
backoff = min(backoff * 2, 60)
|
||||
time.sleep(backoff)
|
||||
|
||||
if time.monotonic() - start_time > timeout:
|
||||
self._status_update(f"Giving up on sunnylink's registration after {timeout}s. Will retry on next boot.")
|
||||
time.sleep(3)
|
||||
break
|
||||
|
||||
self.params.put("SunnylinkDongleId", sunnylink_dongle_id or UNREGISTERED_SUNNYLINK_DONGLE_ID)
|
||||
|
||||
# Set the last ping time to the current time since we were just talking to the API
|
||||
last_ping = int(time.monotonic() * 1e9) if successful_registration else start_time
|
||||
Params().put("LastSunnylinkPingTime", str(last_ping))
|
||||
|
||||
# Disable sunnylink if registration was not successful
|
||||
if not successful_registration:
|
||||
Params().put_bool("SunnylinkEnabled", False)
|
||||
|
||||
self.spinner = None
|
||||
return sunnylink_dongle_id
|
||||
1
common/model.h
Normal file
1
common/model.h
Normal file
@@ -0,0 +1 @@
|
||||
#define CURRENT_MODEL "Notre Dame (July 1, 2024)"
|
||||
262
common/params.cc
262
common/params.cc
@@ -91,6 +91,7 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"AccessToken", CLEAR_ON_MANAGER_START | DONT_LOG},
|
||||
{"AlwaysOnDM", PERSISTENT},
|
||||
{"ApiCache_Device", PERSISTENT},
|
||||
{"ApiCache_NavDestinations", PERSISTENT},
|
||||
{"AssistNowToken", PERSISTENT},
|
||||
{"AthenadPid", PERSISTENT},
|
||||
{"AthenadUploadQueue", PERSISTENT},
|
||||
@@ -110,45 +111,46 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"CurrentBootlog", PERSISTENT},
|
||||
{"CurrentRoute", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"DisableLogging", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"DisablePowerDown", PERSISTENT},
|
||||
{"DisableUpdates", PERSISTENT},
|
||||
{"DisengageOnAccelerator", PERSISTENT},
|
||||
{"DisablePowerDown", PERSISTENT | BACKUP},
|
||||
{"DisableUpdates", PERSISTENT | BACKUP},
|
||||
{"DisengageOnAccelerator", PERSISTENT | BACKUP},
|
||||
{"DmModelInitialized", CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"DongleId", PERSISTENT},
|
||||
{"DoReboot", CLEAR_ON_MANAGER_START},
|
||||
{"DoShutdown", CLEAR_ON_MANAGER_START},
|
||||
{"DoUninstall", CLEAR_ON_MANAGER_START},
|
||||
{"ExperimentalLongitudinalEnabled", PERSISTENT | DEVELOPMENT_ONLY},
|
||||
{"ExperimentalMode", PERSISTENT},
|
||||
{"ExperimentalModeConfirmed", PERSISTENT},
|
||||
{"ExperimentalLongitudinalEnabled", PERSISTENT | DEVELOPMENT_ONLY | BACKUP},
|
||||
{"ExperimentalMode", PERSISTENT | BACKUP},
|
||||
{"ExperimentalModeConfirmed", PERSISTENT | BACKUP},
|
||||
{"FirmwareQueryDone", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"ForcePowerDown", PERSISTENT},
|
||||
{"GitBranch", PERSISTENT},
|
||||
{"GitCommit", PERSISTENT},
|
||||
{"GitCommitDate", PERSISTENT},
|
||||
{"GitDiff", PERSISTENT},
|
||||
{"GithubSshKeys", PERSISTENT},
|
||||
{"GithubUsername", PERSISTENT},
|
||||
{"GithubSshKeys", PERSISTENT | BACKUP},
|
||||
{"GithubUsername", PERSISTENT | BACKUP},
|
||||
{"GitRemote", PERSISTENT},
|
||||
{"GsmApn", PERSISTENT},
|
||||
{"GsmMetered", PERSISTENT},
|
||||
{"GsmRoaming", PERSISTENT},
|
||||
{"GsmApn", PERSISTENT | BACKUP},
|
||||
{"GsmMetered", PERSISTENT | BACKUP},
|
||||
{"GsmRoaming", PERSISTENT | BACKUP},
|
||||
{"HardwareSerial", PERSISTENT},
|
||||
{"HasAcceptedTerms", PERSISTENT},
|
||||
{"IMEI", PERSISTENT},
|
||||
{"InstallDate", PERSISTENT},
|
||||
{"IsDriverViewEnabled", CLEAR_ON_MANAGER_START},
|
||||
{"IsEngaged", PERSISTENT},
|
||||
{"IsLdwEnabled", PERSISTENT},
|
||||
{"IsMetric", PERSISTENT},
|
||||
{"IsLdwEnabled", PERSISTENT | BACKUP},
|
||||
{"IsMetric", PERSISTENT | BACKUP},
|
||||
{"IsOffroad", CLEAR_ON_MANAGER_START},
|
||||
{"IsOnroad", PERSISTENT},
|
||||
{"IsRhdDetected", PERSISTENT},
|
||||
{"IsReleaseBranch", CLEAR_ON_MANAGER_START},
|
||||
{"IsReleaseSPBranch", CLEAR_ON_MANAGER_START},
|
||||
{"IsTakingSnapshot", CLEAR_ON_MANAGER_START},
|
||||
{"IsTestedBranch", CLEAR_ON_MANAGER_START},
|
||||
{"JoystickDebugMode", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"LanguageSetting", PERSISTENT},
|
||||
{"LanguageSetting", PERSISTENT | BACKUP},
|
||||
{"LastAthenaPingTime", CLEAR_ON_MANAGER_START},
|
||||
{"LastGPSPosition", PERSISTENT},
|
||||
{"LastManagerExitReason", CLEAR_ON_MANAGER_START},
|
||||
@@ -158,7 +160,12 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"LastUpdateTime", PERSISTENT},
|
||||
{"LiveParameters", PERSISTENT},
|
||||
{"LiveTorqueParameters", PERSISTENT | DONT_LOG},
|
||||
{"LongitudinalPersonality", PERSISTENT},
|
||||
{"LongitudinalPersonality", PERSISTENT | BACKUP},
|
||||
{"NavDestination", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"NavDestinationWaypoints", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"NavPastDestinations", PERSISTENT},
|
||||
{"NavSettingLeftSide", PERSISTENT | BACKUP},
|
||||
{"NavSettingTime24h", PERSISTENT | BACKUP},
|
||||
{"NetworkMetered", PERSISTENT},
|
||||
{"ObdMultiplexingChanged", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"ObdMultiplexingEnabled", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
@@ -174,17 +181,18 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"Offroad_TemperatureTooHigh", CLEAR_ON_MANAGER_START},
|
||||
{"Offroad_UnofficialHardware", CLEAR_ON_MANAGER_START},
|
||||
{"Offroad_UpdateFailed", CLEAR_ON_MANAGER_START},
|
||||
{"OpenpilotEnabledToggle", PERSISTENT},
|
||||
{"Offroad_OSMUpdateRequired", CLEAR_ON_MANAGER_START},
|
||||
{"OpenpilotEnabledToggle", PERSISTENT | BACKUP},
|
||||
{"PandaHeartbeatLost", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"PandaSomResetTriggered", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"PandaSignatures", CLEAR_ON_MANAGER_START},
|
||||
{"PrimeType", PERSISTENT},
|
||||
{"RecordFront", PERSISTENT},
|
||||
{"RecordFront", PERSISTENT | BACKUP},
|
||||
{"RecordFrontLock", PERSISTENT}, // for the internal fleet
|
||||
{"ReplayControlsState", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"RouteCount", PERSISTENT},
|
||||
{"SnoozeUpdate", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"SshEnabled", PERSISTENT},
|
||||
{"SshEnabled", PERSISTENT | BACKUP},
|
||||
{"TermsVersion", PERSISTENT},
|
||||
{"TrainingVersion", PERSISTENT},
|
||||
{"UbloxAvailable", PERSISTENT},
|
||||
@@ -201,99 +209,149 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"UpdaterLastFetchTime", PERSISTENT},
|
||||
{"Version", PERSISTENT},
|
||||
|
||||
{"AccMadsCombo", PERSISTENT},
|
||||
{"AmapKey1", PERSISTENT},
|
||||
{"AmapKey2", PERSISTENT},
|
||||
{"AutoLaneChangeTimer", PERSISTENT},
|
||||
{"AutoLaneChangeBsmDelay", PERSISTENT},
|
||||
{"BelowSpeedPause", PERSISTENT},
|
||||
{"BrakeLights", PERSISTENT},
|
||||
{"BrightnessControl", PERSISTENT},
|
||||
{"ButtonAutoHide", PERSISTENT},
|
||||
{"CameraControl", PERSISTENT},
|
||||
{"CameraControlToggle", PERSISTENT},
|
||||
{"CameraOffset", PERSISTENT},
|
||||
{"CarModel", PERSISTENT},
|
||||
{"CarModelText", PERSISTENT},
|
||||
{"ChevronInfo", PERSISTENT},
|
||||
{"CustomBootScreen", PERSISTENT},
|
||||
{"CustomMapboxTokenPk", PERSISTENT},
|
||||
{"CustomMapboxTokenSk", PERSISTENT},
|
||||
{"CustomOffsets", PERSISTENT},
|
||||
{"CustomStockLong", PERSISTENT},
|
||||
{"CustomTorqueLateral", PERSISTENT},
|
||||
{"DevUI", PERSISTENT},
|
||||
{"DevUIInfo", PERSISTENT},
|
||||
{"DisableOnroadUploads", PERSISTENT},
|
||||
{"DisengageLateralOnBrake", PERSISTENT},
|
||||
{"DynamicExperimentalControl", PERSISTENT},
|
||||
{"DynamicExperimentalControlToggle", PERSISTENT},
|
||||
{"DynamicLaneProfile", PERSISTENT},
|
||||
{"DynamicLaneProfileToggle", PERSISTENT},
|
||||
{"EnableAmap", PERSISTENT},
|
||||
{"EnableDebugSnapshot", PERSISTENT},
|
||||
{"EnableGmap", PERSISTENT},
|
||||
{"EnableMads", PERSISTENT},
|
||||
{"EndToEndLongAlertLead", PERSISTENT},
|
||||
{"EndToEndLongAlertLight", PERSISTENT},
|
||||
{"EndToEndLongAlertUI", PERSISTENT},
|
||||
{"EndToEndLongToggle", PERSISTENT},
|
||||
{"EnforceTorqueLateral", PERSISTENT},
|
||||
{"EnhancedScc", PERSISTENT},
|
||||
{"AccelPersonality", PERSISTENT | BACKUP},
|
||||
{"AccMadsCombo", PERSISTENT | BACKUP},
|
||||
{"AmapKey1", PERSISTENT | BACKUP},
|
||||
{"AmapKey2", PERSISTENT | BACKUP},
|
||||
{"ApiCache_DriveStats", PERSISTENT | BACKUP},
|
||||
{"AutoLaneChangeTimer", PERSISTENT | BACKUP},
|
||||
{"AutoLaneChangeBsmDelay", PERSISTENT | BACKUP},
|
||||
{"BelowSpeedPause", PERSISTENT | BACKUP},
|
||||
{"BrakeLights", PERSISTENT | BACKUP},
|
||||
{"BrightnessControl", PERSISTENT | BACKUP},
|
||||
{"ButtonAutoHide", PERSISTENT | BACKUP},
|
||||
{"CameraControl", PERSISTENT | BACKUP},
|
||||
{"CameraControlToggle", PERSISTENT | BACKUP},
|
||||
{"CameraOffset", PERSISTENT | BACKUP},
|
||||
{"CarModel", PERSISTENT | BACKUP},
|
||||
{"CarModelText", PERSISTENT | BACKUP},
|
||||
{"ChevronInfo", PERSISTENT | BACKUP},
|
||||
{"CustomBootScreen", PERSISTENT | BACKUP},
|
||||
{"CustomDrivingModel", PERSISTENT},
|
||||
{"CustomMapboxTokenPk", PERSISTENT | BACKUP},
|
||||
{"CustomMapboxTokenSk", PERSISTENT | BACKUP},
|
||||
{"CustomOffsets", PERSISTENT | BACKUP},
|
||||
{"CustomStockLong", PERSISTENT | BACKUP},
|
||||
{"CustomTorqueLateral", PERSISTENT | BACKUP},
|
||||
{"DevUIInfo", PERSISTENT | BACKUP},
|
||||
{"DisableOnroadUploads", PERSISTENT | BACKUP},
|
||||
{"DisengageLateralOnBrake", PERSISTENT | BACKUP},
|
||||
{"DrivingModelGeneration", PERSISTENT},
|
||||
{"DrivingModelMetadataText", PERSISTENT},
|
||||
{"DrivingModelName", PERSISTENT},
|
||||
{"DrivingModelText", PERSISTENT},
|
||||
{"DrivingModelUrl", PERSISTENT},
|
||||
{"DynamicExperimentalControl", PERSISTENT | BACKUP},
|
||||
{"DynamicLaneProfile", PERSISTENT | BACKUP},
|
||||
{"DynamicPersonality", PERSISTENT | BACKUP},
|
||||
{"EnableAmap", PERSISTENT | BACKUP},
|
||||
{"EnableGmap", PERSISTENT | BACKUP},
|
||||
{"EnableMads", PERSISTENT | BACKUP},
|
||||
{"EnableSlc", PERSISTENT | BACKUP},
|
||||
{"EndToEndLongAlertLead", PERSISTENT | BACKUP},
|
||||
{"EndToEndLongAlertLight", PERSISTENT | BACKUP},
|
||||
{"EndToEndLongAlertUI", PERSISTENT | BACKUP},
|
||||
{"EndToEndLongToggle", PERSISTENT | BACKUP},
|
||||
{"EnforceTorqueLateral", PERSISTENT | BACKUP},
|
||||
{"EnhancedScc", PERSISTENT | BACKUP},
|
||||
{"FeatureStatus", PERSISTENT | BACKUP},
|
||||
{"FleetManagerPin", PERSISTENT},
|
||||
{"GapAdjustCruise", PERSISTENT},
|
||||
{"GapAdjustCruiseMax", PERSISTENT},
|
||||
{"GapAdjustCruiseMin", PERSISTENT},
|
||||
{"GapAdjustCruiseMode", PERSISTENT},
|
||||
{"GapAdjustCruiseTr", PERSISTENT},
|
||||
{"GmapKey", PERSISTENT},
|
||||
{"HandsOnWheelMonitoring", PERSISTENT},
|
||||
{"HideVEgoUi", PERSISTENT},
|
||||
{"HkgSmoothStop", PERSISTENT},
|
||||
{"ForceOffroad", CLEAR_ON_MANAGER_START},
|
||||
{"GmapKey", PERSISTENT | BACKUP},
|
||||
{"HandsOnWheelMonitoring", PERSISTENT | BACKUP},
|
||||
{"HasAcceptedTermsSP", PERSISTENT},
|
||||
{"HideVEgoUi", PERSISTENT | BACKUP},
|
||||
{"HkgSmoothStop", PERSISTENT | BACKUP},
|
||||
{"HotspotOnBoot", PERSISTENT},
|
||||
{"LastCarModel", PERSISTENT},
|
||||
{"HotspotOnBootConfirmed", PERSISTENT},
|
||||
{"LastCarModel", PERSISTENT | BACKUP},
|
||||
{"LastSpeedLimitSignTap", PERSISTENT},
|
||||
{"LiveTorque", PERSISTENT},
|
||||
{"LkasToggle", PERSISTENT},
|
||||
{"MadsCruiseMain", PERSISTENT},
|
||||
{"MadsIconToggle", PERSISTENT},
|
||||
{"MapboxFullScreen", PERSISTENT},
|
||||
{"MaxTimeOffroad", PERSISTENT},
|
||||
{"OnroadScreenOff", PERSISTENT},
|
||||
{"OnroadScreenOffBrightness", PERSISTENT},
|
||||
{"OnroadScreenOffEvent", PERSISTENT},
|
||||
{"OsmDbUpdatesCheck", PERSISTENT},
|
||||
{"LastSunnylinkPingTime", CLEAR_ON_MANAGER_START},
|
||||
{"LiveTorque", PERSISTENT | BACKUP},
|
||||
{"LiveTorqueRelaxed", PERSISTENT | BACKUP},
|
||||
{"LkasToggle", PERSISTENT | BACKUP},
|
||||
{"MadsCruiseMain", PERSISTENT | BACKUP},
|
||||
{"MadsIconToggle", PERSISTENT | BACKUP},
|
||||
{"MapboxFullScreen", PERSISTENT | BACKUP},
|
||||
{"MapTargetVelocities", PERSISTENT},
|
||||
{"Map3DBuildings", PERSISTENT | BACKUP},
|
||||
{"MaxTimeOffroad", PERSISTENT | BACKUP},
|
||||
{"NavModelText", PERSISTENT | BACKUP},
|
||||
{"NavModelUrl", PERSISTENT | BACKUP},
|
||||
{"NNFF", PERSISTENT | BACKUP},
|
||||
{"NNFFCarModel", PERSISTENT | BACKUP},
|
||||
{"OnroadScreenOff", PERSISTENT | BACKUP},
|
||||
{"OnroadScreenOffBrightness", PERSISTENT | BACKUP},
|
||||
{"OnroadScreenOffEvent", PERSISTENT | BACKUP},
|
||||
{"OnroadSettings", PERSISTENT | BACKUP},
|
||||
{"OsmLocal", PERSISTENT},
|
||||
{"OsmLocalDb", PERSISTENT},
|
||||
{"OsmLocationName", PERSISTENT},
|
||||
{"OsmLocationTitle", PERSISTENT},
|
||||
{"OsmLocationUrl", PERSISTENT},
|
||||
{"OsmWayTest", PERSISTENT},
|
||||
{"PathOffset", PERSISTENT},
|
||||
{"QuietDrive", PERSISTENT},
|
||||
{"RoadEdge", PERSISTENT},
|
||||
{"ReverseAccChange", PERSISTENT},
|
||||
{"ReverseDmCam", PERSISTENT},
|
||||
{"ScreenRecorder", PERSISTENT},
|
||||
{"ShowDebugUI", PERSISTENT},
|
||||
{"SidebarTemperature", PERSISTENT},
|
||||
{"SidebarTemperatureOptions", PERSISTENT},
|
||||
{"SpeedLimitControl", PERSISTENT},
|
||||
{"SpeedLimitPercOffset", PERSISTENT},
|
||||
{"SpeedLimitValueOffset", PERSISTENT},
|
||||
{"SpeedLimitOffsetType", PERSISTENT},
|
||||
{"StandStillTimer", PERSISTENT},
|
||||
{"StockLongToyota", PERSISTENT},
|
||||
{"TorqueDeadzoneDeg", PERSISTENT},
|
||||
{"TorqueFriction", PERSISTENT},
|
||||
{"TorqueMaxLatAccel", PERSISTENT},
|
||||
{"ToyotaTSS2Long", PERSISTENT},
|
||||
{"TrueVEgoUi", PERSISTENT},
|
||||
{"TurnSpeedControl", PERSISTENT},
|
||||
{"TurnVisionControl", PERSISTENT},
|
||||
{"VisionCurveLaneless", PERSISTENT},
|
||||
{"VwAccType", PERSISTENT},
|
||||
{"OsmDownloadedDate", PERSISTENT},
|
||||
{"PathOffset", PERSISTENT | BACKUP},
|
||||
{"PauseLateralSpeed", PERSISTENT | BACKUP},
|
||||
{"QuietDrive", PERSISTENT | BACKUP},
|
||||
{"RoadEdge", PERSISTENT | BACKUP},
|
||||
{"ReverseAccChange", PERSISTENT | BACKUP},
|
||||
{"ReverseDmCam", PERSISTENT | BACKUP},
|
||||
{"ScreenRecorder", PERSISTENT | BACKUP},
|
||||
{"ShowDebugUI", PERSISTENT | BACKUP},
|
||||
{"SidebarTemperatureOptions", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitControlPolicy", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitEngageType", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitValueOffset", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitOffsetType", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitWarningFlash", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitWarningType", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitWarningValueOffset", PERSISTENT | BACKUP},
|
||||
{"SpeedLimitWarningOffsetType", PERSISTENT | BACKUP},
|
||||
{"StandStillTimer", PERSISTENT | BACKUP},
|
||||
{"StockLongToyota", PERSISTENT | BACKUP},
|
||||
{"SubaruManualParkingBrakeSng", PERSISTENT | BACKUP},
|
||||
{"SunnylinkDongleId", PERSISTENT},
|
||||
{"SunnylinkEnabled", PERSISTENT},
|
||||
{"SunnylinkdPid", PERSISTENT},
|
||||
{"TermsVersionSunnypilot", PERSISTENT},
|
||||
{"TorqueDeadzoneDeg", PERSISTENT | BACKUP},
|
||||
{"TorqueFriction", PERSISTENT | BACKUP},
|
||||
{"TorqueMaxLatAccel", PERSISTENT | BACKUP},
|
||||
{"TorquedOverride", PERSISTENT | BACKUP},
|
||||
{"ToyotaAutoLockBySpeed", PERSISTENT | BACKUP},
|
||||
{"ToyotaAutoUnlockByShifter", PERSISTENT | BACKUP},
|
||||
{"ToyotaEnhancedBsm", PERSISTENT | BACKUP},
|
||||
{"ToyotaSnG", PERSISTENT | BACKUP},
|
||||
{"ToyotaTSS2Long", PERSISTENT | BACKUP},
|
||||
{"TrueVEgoUi", PERSISTENT | BACKUP},
|
||||
{"TurnSpeedControl", PERSISTENT | BACKUP},
|
||||
{"TurnVisionControl", PERSISTENT | BACKUP},
|
||||
{"DriverCameraHardwareMissing", PERSISTENT},
|
||||
{"VisionCurveLaneless", PERSISTENT | BACKUP},
|
||||
{"VwAccType", PERSISTENT | BACKUP},
|
||||
{"VwCCOnly", PERSISTENT | BACKUP},
|
||||
{"Offroad_ForceStatus", CLEAR_ON_MANAGER_START},
|
||||
{"Offroad_SupersededUpdate", PERSISTENT},
|
||||
|
||||
{"SunnylinkCache_Users", PERSISTENT},
|
||||
{"SunnylinkCache_Roles", PERSISTENT},
|
||||
{"EnableGitlabRunner", PERSISTENT | BACKUP},
|
||||
{"EnableSunnylinkUploader", PERSISTENT | BACKUP},
|
||||
|
||||
// PFEIFER - MAPD {{
|
||||
{"MapdVersion", PERSISTENT},
|
||||
{"RoadName", CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"MapSpeedLimit", CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"MapAdvisorySpeedLimit", CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"NextMapSpeedLimit", CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"OSMDownloadBounds", PERSISTENT},
|
||||
{"OSMDownloadLocations", PERSISTENT},
|
||||
{"OsmDownloadedDate", PERSISTENT},
|
||||
{"OsmStateTitle", PERSISTENT},
|
||||
{"OsmStateName", PERSISTENT},
|
||||
{"OSMDownloadProgress", CLEAR_ON_MANAGER_START},
|
||||
{"OsmDbUpdatesCheck", CLEAR_ON_MANAGER_START}, // mapd database update happens with device ON, reset on boot
|
||||
// }} PFEIFER - MAPD
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -16,6 +16,7 @@ enum ParamKeyType {
|
||||
CLEAR_ON_OFFROAD_TRANSITION = 0x10,
|
||||
DONT_LOG = 0x20,
|
||||
DEVELOPMENT_ONLY = 0x40,
|
||||
BACKUP = 0x80,
|
||||
ALL = 0xFFFFFFFF
|
||||
};
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
from libcpp cimport bool
|
||||
from libcpp.string cimport string
|
||||
from libcpp.vector cimport vector
|
||||
from libcpp.map cimport map
|
||||
|
||||
cdef extern from "common/params.h":
|
||||
cpdef enum ParamKeyType:
|
||||
@@ -11,6 +12,7 @@ cdef extern from "common/params.h":
|
||||
CLEAR_ON_ONROAD_TRANSITION
|
||||
CLEAR_ON_OFFROAD_TRANSITION
|
||||
DEVELOPMENT_ONLY
|
||||
BACKUP
|
||||
ALL
|
||||
|
||||
cdef cppclass c_Params "Params":
|
||||
@@ -26,6 +28,7 @@ cdef extern from "common/params.h":
|
||||
string getParamPath(string) nogil
|
||||
void clearAll(ParamKeyType)
|
||||
vector[string] allKeys()
|
||||
map[string, string] readAll()
|
||||
|
||||
|
||||
def ensure_bytes(v):
|
||||
@@ -116,3 +119,6 @@ cdef class Params:
|
||||
|
||||
def all_keys(self):
|
||||
return self.p.allKeys()
|
||||
|
||||
def read_all(self):
|
||||
return self.p.readAll()
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
import gc
|
||||
import os
|
||||
import time
|
||||
import threading
|
||||
import psutil
|
||||
from collections import deque
|
||||
|
||||
from openpilot.common.threadname import getthreadname
|
||||
@@ -44,6 +46,14 @@ def config_realtime_process(cores: int | list[int], priority: int) -> None:
|
||||
set_core_affinity(c)
|
||||
|
||||
|
||||
def set_thread_affinity(thread: threading.Thread, cores: list[int]) -> None:
|
||||
try:
|
||||
process = psutil.Process(thread.ident)
|
||||
process.cpu_affinity(cores)
|
||||
except Exception as e:
|
||||
print(f"Error setting thread affinity: {e}")
|
||||
|
||||
|
||||
class Ratekeeper:
|
||||
def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None:
|
||||
"""Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative."""
|
||||
|
||||
@@ -86,7 +86,8 @@ function launch {
|
||||
if [ ! -f $DIR/prebuilt ]; then
|
||||
./build.py
|
||||
fi
|
||||
./manager.py
|
||||
|
||||
./mapd_installer.py; ./manager.py
|
||||
|
||||
# if broken, keep on screen error
|
||||
while true; do sleep 1; done
|
||||
|
||||
2
panda
2
panda
Submodule panda updated: 6e117a24aa...5d92bdc6de
128
release/build_dev.sh
Executable file
128
release/build_dev.sh
Executable file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/bash -e
|
||||
|
||||
# git diff --name-status origin/release3-staging | grep "^A" | less
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
|
||||
cd $DIR
|
||||
|
||||
BUILD_DIR=/data/openpilot
|
||||
SOURCE_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
FILES_SRC="release/files_tici"
|
||||
DEV_BRANCH="dev-c3"
|
||||
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
# set git username/password
|
||||
source /data/identity.sh
|
||||
git remote add origin https://github.com/sunnyhaibin/sunnypilot.git
|
||||
git fetch origin $DEV_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
cd $SOURCE_DIR
|
||||
cp -pR --parents $(cat release/files_common) $BUILD_DIR/
|
||||
cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/
|
||||
|
||||
# in the directory
|
||||
cd $BUILD_DIR
|
||||
|
||||
rm -f panda/board/obj/panda.bin.signed
|
||||
rm -f panda/board/obj/panda_h7.bin.signed
|
||||
rm -f panda/board/obj/bootstub.panda.bin
|
||||
rm -f panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
VERSION=$(date '+%Y.%m.%d')
|
||||
echo "#define COMMA_VERSION \"$VERSION-dev\"" > common/version.h
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$DEV_BRANCH
|
||||
|
||||
# Build panda firmware
|
||||
pushd panda/
|
||||
scons -u .
|
||||
mv board/obj/panda.bin.signed /tmp/panda.bin.signed
|
||||
mv board/obj/panda_h7.bin.signed /tmp/panda_h7.bin.signed
|
||||
mv board/obj/bootstub.panda.bin /tmp/bootstub.panda.bin
|
||||
mv board/obj/bootstub.panda_h7.bin /tmp/bootstub.panda_h7.bin
|
||||
popd
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc)
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
echo "submodules found:"
|
||||
git submodule--helper list
|
||||
exit 1
|
||||
fi
|
||||
git submodule status
|
||||
|
||||
# Cleanup
|
||||
find . -name '*.a' -delete
|
||||
find . -name '*.o' -delete
|
||||
find . -name '*.os' -delete
|
||||
find . -name '*.pyc' -delete
|
||||
find . -name 'moc_*' -delete
|
||||
find . -name '*.cc' -delete
|
||||
find . -name '__pycache__' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
rm -rf panda/board panda/certs panda/crypto
|
||||
rm -rf .sconsign.dblite Jenkinsfile release/
|
||||
rm selfdrive/modeld/models/supercombo.onnx
|
||||
rm -rf selfdrive/ui/replay/
|
||||
# Move back signed panda fw
|
||||
mkdir -p panda/board/obj
|
||||
mv /tmp/panda.bin.signed panda/board/obj/panda.bin.signed
|
||||
mv /tmp/panda_h7.bin.signed panda/board/obj/panda_h7.bin.signed
|
||||
mv /tmp/bootstub.panda.bin panda/board/obj/bootstub.panda.bin
|
||||
mv /tmp/bootstub.panda_h7.bin panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
# Restore third_party
|
||||
git checkout third_party/
|
||||
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "sunnypilot v$VERSION
|
||||
version: sunnypilot v$SP_VERSION release
|
||||
date: $DATETIME
|
||||
master commit: $GIT_HASH
|
||||
"
|
||||
git branch -m dev-c3
|
||||
|
||||
# Run tests
|
||||
#TEST_FILES="tools/"
|
||||
#cd $SOURCE_DIR
|
||||
#cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 selfdrive/test/test_onroad.py
|
||||
#selfdrive/manager/test/test_manager.py
|
||||
#selfdrive/car/tests/test_car_interfaces.py
|
||||
#rm -rf $TEST_FILES
|
||||
|
||||
if [ ! -z "$PUSH" ]; then
|
||||
echo "[-] pushing T=$SECONDS"
|
||||
git push -f origin $DEV_BRANCH
|
||||
fi
|
||||
|
||||
echo "[-] done T=$SECONDS"
|
||||
@@ -19,14 +19,17 @@ fi
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
git remote add origin git@github.com:commaai/openpilot.git
|
||||
git checkout --orphan $RELEASE_BRANCH
|
||||
# set git username/password
|
||||
source /data/identity.sh
|
||||
git remote add origin https://github.com/sunnyhaibin/sunnypilot.git
|
||||
git fetch origin $RELEASE_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
@@ -38,20 +41,23 @@ cd $BUILD_DIR
|
||||
|
||||
rm -f panda/board/obj/panda.bin.signed
|
||||
rm -f panda/board/obj/panda_h7.bin.signed
|
||||
rm -f panda/board/obj/bootstub.panda.bin
|
||||
rm -f panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}')
|
||||
echo "#define COMMA_VERSION \"$VERSION-release\"" > common/version.h
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "openpilot v$VERSION release"
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$RELEASE_BRANCH
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc) --minimal
|
||||
|
||||
# release panda fw
|
||||
CERT=/data/pandaextra/certs/release RELEASE=1 scons -j$(nproc) panda/
|
||||
scons -j$(nproc) panda/
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
@@ -67,9 +73,12 @@ find . -name '*.o' -delete
|
||||
find . -name '*.os' -delete
|
||||
find . -name '*.pyc' -delete
|
||||
find . -name 'moc_*' -delete
|
||||
find . -name '*.cc' -delete
|
||||
find . -name '__pycache__' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
rm -rf .sconsign.dblite Jenkinsfile release/
|
||||
rm selfdrive/modeld/models/supercombo.onnx
|
||||
rm -rf selfdrive/ui/replay/
|
||||
|
||||
find third_party/ -name '*x86*' -exec rm -r {} +
|
||||
find third_party/ -name '*Darwin*' -exec rm -r {} +
|
||||
@@ -81,19 +90,25 @@ git checkout third_party/
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "openpilot v$VERSION"
|
||||
git commit --amend -m "sunnypilot v$VERSION"
|
||||
git branch -m release-c3
|
||||
|
||||
# Run tests
|
||||
TEST_FILES="tools/"
|
||||
cd $SOURCE_DIR
|
||||
cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
cd $BUILD_DIR
|
||||
RELEASE=1 pytest -n0 -s selfdrive/test/test_onroad.py
|
||||
#TEST_FILES="tools/"
|
||||
#cd $SOURCE_DIR
|
||||
#cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 pytest -n0 -s selfdrive/test/test_onroad.py
|
||||
#system/manager/test/test_manager.py
|
||||
pytest selfdrive/car/tests/test_car_interfaces.py
|
||||
rm -rf $TEST_FILES
|
||||
#pytest selfdrive/car/tests/test_car_interfaces.py
|
||||
#rm -rf $TEST_FILES
|
||||
|
||||
if [ ! -z "$RELEASE_BRANCH" ]; then
|
||||
echo "[-] pushing release T=$SECONDS"
|
||||
|
||||
125
release/build_staging.sh
Executable file
125
release/build_staging.sh
Executable file
@@ -0,0 +1,125 @@
|
||||
#!/usr/bin/bash -e
|
||||
|
||||
# git diff --name-status origin/release3-staging | grep "^A" | less
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
|
||||
cd $DIR
|
||||
|
||||
BUILD_DIR=/data/openpilot
|
||||
SOURCE_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
FILES_SRC="release/files_tici"
|
||||
STAGING_BRANCH="staging-c3"
|
||||
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
# set git username/password
|
||||
source /data/identity.sh
|
||||
git remote add origin https://github.com/sunnyhaibin/sunnypilot.git
|
||||
git fetch origin $STAGING_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
cd $SOURCE_DIR
|
||||
cp -pR --parents $(cat release/files_common) $BUILD_DIR/
|
||||
cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/
|
||||
|
||||
# in the directory
|
||||
cd $BUILD_DIR
|
||||
|
||||
rm -f panda/board/obj/panda.bin.signed
|
||||
rm -f panda/board/obj/panda_h7.bin.signed
|
||||
rm -f panda/board/obj/bootstub.panda.bin
|
||||
rm -f panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}')
|
||||
echo "#define COMMA_VERSION \"$VERSION-staging\"" > common/version.h
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$STAGING_BRANCH
|
||||
|
||||
# Build panda firmware
|
||||
pushd panda/
|
||||
scons -u .
|
||||
mv board/obj/panda.bin.signed /tmp/panda.bin.signed
|
||||
mv board/obj/panda_h7.bin.signed /tmp/panda_h7.bin.signed
|
||||
mv board/obj/bootstub.panda.bin /tmp/bootstub.panda.bin
|
||||
mv board/obj/bootstub.panda_h7.bin /tmp/bootstub.panda_h7.bin
|
||||
popd
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc)
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
echo "submodules found:"
|
||||
git submodule--helper list
|
||||
exit 1
|
||||
fi
|
||||
git submodule status
|
||||
|
||||
# Cleanup
|
||||
find . -name '*.a' -delete
|
||||
find . -name '*.o' -delete
|
||||
find . -name '*.os' -delete
|
||||
find . -name '*.pyc' -delete
|
||||
find . -name 'moc_*' -delete
|
||||
find . -name '*.cc' -delete
|
||||
find . -name '__pycache__' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
rm -rf panda/board panda/certs panda/crypto
|
||||
rm -rf .sconsign.dblite Jenkinsfile release/
|
||||
rm selfdrive/modeld/models/supercombo.onnx
|
||||
#rm models/supercombo_badweights.thneed
|
||||
rm -rf selfdrive/ui/replay/
|
||||
# Move back signed panda fw
|
||||
mkdir -p panda/board/obj
|
||||
mv /tmp/panda.bin.signed panda/board/obj/panda.bin.signed
|
||||
mv /tmp/panda_h7.bin.signed panda/board/obj/panda_h7.bin.signed
|
||||
mv /tmp/bootstub.panda.bin panda/board/obj/bootstub.panda.bin
|
||||
mv /tmp/bootstub.panda_h7.bin panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
# Restore third_party
|
||||
git checkout third_party/
|
||||
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "sunnypilot v$VERSION"
|
||||
git branch -m staging-c3
|
||||
|
||||
# Run tests
|
||||
#TEST_FILES="tools/"
|
||||
#cd $SOURCE_DIR
|
||||
#cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 selfdrive/test/test_onroad.py
|
||||
#selfdrive/manager/test/test_manager.py
|
||||
#selfdrive/car/tests/test_car_interfaces.py
|
||||
#rm -rf $TEST_FILES
|
||||
|
||||
if [ ! -z "$PUSH" ]; then
|
||||
echo "[-] pushing T=$SECONDS"
|
||||
git push -f origin $STAGING_BRANCH
|
||||
fi
|
||||
|
||||
echo "[-] done T=$SECONDS"
|
||||
45
release/ci/build.sh
Executable file
45
release/ci/build.sh
Executable file
@@ -0,0 +1,45 @@
|
||||
# UNUSED YET BUT I WANT TO KEEP IT BECAUSE I INTEND TO USE IT SOON
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# set -e
|
||||
|
||||
# DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
# cd $DIR
|
||||
|
||||
# # Take parameters as arguments
|
||||
# SOURCE_DIR=$1
|
||||
# OUTPUT_DIR=$2
|
||||
|
||||
# # Check parameters
|
||||
# if [ -z "$SOURCE_DIR" ] || [ -z "$OUTPUT_DIR" ]; then
|
||||
# echo "Error: No source or output directory provided."
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
# if [ -z "$TARGETPLATFORM" ]; then
|
||||
# # Detect the platform (e.g., x86_64, aarch64, etc.)
|
||||
# platform=$(uname -m)
|
||||
|
||||
# # Map to Docker's platform syntax
|
||||
# if [ "$platform" = "x86_64" ]; then
|
||||
# TARGETPLATFORM="linux/amd64"
|
||||
# elif [ "$platform" = "aarch64" ]; then
|
||||
# TARGETPLATFORM="linux/arm64"
|
||||
# # Add here more elif statements for other architectures if needed.
|
||||
# else
|
||||
# echo "Unknown platform: $platform"
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
# export TARGETPLATFORM
|
||||
# fi
|
||||
|
||||
# echo "TARGETPLATFORM IS: [${TARGETPLATFORM}]"
|
||||
|
||||
# # Let's bring the submodules!
|
||||
# git submodule update --init --recursive
|
||||
|
||||
# # Build
|
||||
# docker compose -f ${SOURCE_DIR}/docker-compose.yml build
|
||||
# docker compose -f ${SOURCE_DIR}/docker-compose.yml up
|
||||
27
release/ci/build_and_publish.sh
Executable file
27
release/ci/build_and_publish.sh
Executable file
@@ -0,0 +1,27 @@
|
||||
# UNUSED YET BUT I WANT TO KEEP IT BECAUSE I INTEND TO USE IT SOON
|
||||
|
||||
# #!/usr/bin/env bash
|
||||
# DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
# cd $DIR
|
||||
|
||||
# DEV_BRANCH=$1
|
||||
# GIT_ORIGIN=$2
|
||||
# if [ -z "$DEV_BRANCH" ]; then
|
||||
# DEV_BRANCH="dev-c3-test"
|
||||
# fi
|
||||
|
||||
# if [ -z "$GIT_ORIGIN" ]; then
|
||||
# GIT_ORIGIN="git@github.com:devtekve/openpilot-og.git" #This is a default that should be changed
|
||||
# echo "No GIT_ORIGIN provided, we will use the default [${GIT_ORIGIN}]"
|
||||
# fi
|
||||
|
||||
# VERSION=$(date '+%Y.%m.%d')
|
||||
# SOURCE_DIR="$(git rev-parse --show-toplevel)"
|
||||
# OUTPUT_DIR=${SOURCE_DIR}/output
|
||||
|
||||
|
||||
# echo "Calling to build [${DIR}/build.sh ${SOURCE_DIR} ${OUTPUT_DIR} ${VERSION}]"
|
||||
# $DIR/build.sh "${SOURCE_DIR}" "${OUTPUT_DIR}" "${VERSION}"
|
||||
|
||||
# echo "Calling to publish [${DIR}/publish.sh ${SOURCE_DIR} ${OUTPUT_DIR} ${DEV_BRANCH} ${VERSION} ${GIT_ORIGIN}]"
|
||||
# $DIR/publish.sh "${SOURCE_DIR}" "${OUTPUT_DIR}" "${DEV_BRANCH}" "${VERSION}" "${GIT_ORIGIN}"
|
||||
13
release/ci/discord_template_notify_dev_private.json
Normal file
13
release/ci/discord_template_notify_dev_private.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"embeds": [
|
||||
{
|
||||
"title": "❗️ Action Required for `${CI_COMMIT_REF_NAME}` ❗️",
|
||||
"description": "[${CI_PROJECT_NAME}](${CI_PROJECT_URL}): Pipeline [#${CI_PIPELINE_ID}](${CI_PROJECT_URL}/-/pipelines/${CI_PIPELINE_ID}) of branch [${CI_COMMIT_REF_NAME}](${CI_PROJECT_URL}/-/commits/${CI_COMMIT_REF_NAME}) by ${GITLAB_USER_NAME} (${GITLAB_USER_LOGIN}) is ready to publish manually as [${NEW_BRANCH}](${PUBLIC_REPO_URL}/tree/${NEW_BRANCH})",
|
||||
"color": 16763904,
|
||||
"author": {
|
||||
"name": "${GITLAB_USER_LOGIN}",
|
||||
"icon_url": "${AVATAR_URL}"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
9
release/ci/discord_template_notify_dev_public.json
Normal file
9
release/ci/discord_template_notify_dev_public.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"embeds": [
|
||||
{
|
||||
"title": "🎉 sunnypilot `${NEW_BRANCH}` New Update 🎉",
|
||||
"description": "[sunnypilot](${PUBLIC_REPO_URL}): Build #${EXTRA_VERSION_IDENTIFIER} of branch [${NEW_BRANCH}](${PUBLIC_REPO_URL}/tree/${NEW_BRANCH}) has been published.\n\nDrive safe! 🚗💨",
|
||||
"color": 4321431
|
||||
}
|
||||
]
|
||||
}
|
||||
107
release/ci/install_gitlab_runner.sh
Executable file
107
release/ci/install_gitlab_runner.sh
Executable file
@@ -0,0 +1,107 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Check if script arguments are present, if not exit the script
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "No arguments provided. A GitLab token is required to run this script."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Constants
|
||||
GITLAB_RUNNER_DOWNLOAD_URL="https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm64"
|
||||
GITLAB_RUNNER_USER_NAME="gitlab-runner"
|
||||
USER_GROUPS="comma,gpu,gpio,sudo"
|
||||
GITLAB_BASE_DIR="/data/gitlab"
|
||||
GITLAB_BIN_DIR="${GITLAB_BASE_DIR}/bin"
|
||||
GITLAB_BUILDS_DIR="${GITLAB_BASE_DIR}/builds"
|
||||
GITLAB_LOGS_DIR="${GITLAB_BASE_DIR}/logs"
|
||||
GITLAB_CACHE_DIR="${GITLAB_BASE_DIR}/cache"
|
||||
GITLAB_OPENPILOT_DIR="${GITLAB_BASE_DIR}/openpilot"
|
||||
SERVICE_NAME="gitlab-runner"
|
||||
|
||||
create_gitlab_runner_directories() {
|
||||
sudo mkdir -p "$GITLAB_BIN_DIR" "$GITLAB_BUILDS_DIR" "$GITLAB_LOGS_DIR" "$GITLAB_CACHE_DIR" "$GITLAB_OPENPILOT_DIR"
|
||||
mkdir -p "/data/openpilot"
|
||||
sudo chown -R comma:comma "/data/openpilot"
|
||||
}
|
||||
|
||||
download_and_setup_gitlab_runner() {
|
||||
sudo curl -L --output "$GITLAB_BIN_DIR/gitlab-runner" "$GITLAB_RUNNER_DOWNLOAD_URL"
|
||||
sudo chmod +x "$GITLAB_BIN_DIR/gitlab-runner"
|
||||
}
|
||||
|
||||
setup_gitlab_runner_user() {
|
||||
sudo useradd --comment 'GitLab Runner' --create-home --home-dir ${GITLAB_BASE_DIR} ${GITLAB_RUNNER_USER_NAME} --shell /bin/bash -G ${USER_GROUPS} || sudo usermod -aG ${USER_GROUPS} ${GITLAB_RUNNER_USER_NAME}
|
||||
export GITLAB_BASE_DIR # Export it to make it available to sub-processes
|
||||
sudo -u ${GITLAB_RUNNER_USER_NAME} bash -c "truncate -s 0 '${GITLAB_BASE_DIR}/.bash_logout'"
|
||||
}
|
||||
|
||||
create_sudoers_entry() {
|
||||
sudo grep -qxF "${GITLAB_RUNNER_USER_NAME} ALL=(ALL) NOPASSWD: ALL" /etc/sudoers || echo "${GITLAB_RUNNER_USER_NAME} ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
|
||||
}
|
||||
|
||||
generate_gitlab_config_file() {
|
||||
cat <<EOL | sudo tee "$GITLAB_BASE_DIR/config.toml"
|
||||
[[runners]]
|
||||
name = "tici"
|
||||
url = "https://gitlab.com/"
|
||||
token = "$1"
|
||||
executor = "shell"
|
||||
builds_dir = "$GITLAB_BUILDS_DIR"
|
||||
[runners.custom_build_dir]
|
||||
[runners.docker]
|
||||
volumes = ["$GITLAB_CACHE_DIR:/cache"]
|
||||
[runners.cache]
|
||||
MaxUploadedArchiveSize = 0
|
||||
[runners.custom]
|
||||
config_exec = "$GITLAB_LOGS_DIR"
|
||||
EOL
|
||||
}
|
||||
|
||||
set_gitlab_directory_permissions() {
|
||||
sudo chown -R ${GITLAB_RUNNER_USER_NAME}:comma "$GITLAB_BASE_DIR"
|
||||
sudo chmod g+rwx "$GITLAB_BASE_DIR"
|
||||
sudo chmod g+s "$GITLAB_BASE_DIR"
|
||||
}
|
||||
|
||||
# Please note that when the gitlab runner is started, linux implicitly executes "source /etc/profile" for every logged shell. This will make scons available
|
||||
create_gitlab_runner_service() {
|
||||
cat <<EOL | sudo tee /etc/systemd/system/${SERVICE_NAME}.service
|
||||
[Unit]
|
||||
Description=GitLab Runner
|
||||
After=syslog.target network.target
|
||||
ConditionFileIsExecutable=$GITLAB_BIN_DIR/gitlab-runner
|
||||
[Service]
|
||||
StartLimitInterval=5
|
||||
StartLimitBurst=10
|
||||
ExecStart=/usr/bin/unshare -m -- sh -c 'mount --bind $GITLAB_OPENPILOT_DIR /data/openpilot && exec $GITLAB_BIN_DIR/gitlab-runner "run" "--working-directory" "$GITLAB_BUILDS_DIR" "--config" "$GITLAB_BASE_DIR/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "${GITLAB_RUNNER_USER_NAME}"'
|
||||
Restart=always
|
||||
RestartSec=120
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOL
|
||||
}
|
||||
|
||||
start_gitlab_runner_service() {
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl disable gitlab-runner # Intentionally making sure the service is NOT enabled on boot.
|
||||
sudo systemctl start gitlab-runner
|
||||
}
|
||||
|
||||
# Make the filesystem writable
|
||||
sudo mount -o remount,rw /
|
||||
|
||||
# Ensure filesystem is remounted as read-only on script exit
|
||||
trap "sudo mount -o remount,ro /" EXIT
|
||||
|
||||
# Call functions
|
||||
setup_gitlab_runner_user
|
||||
create_sudoers_entry
|
||||
create_gitlab_runner_directories
|
||||
download_and_setup_gitlab_runner
|
||||
generate_gitlab_config_file "$1"
|
||||
set_gitlab_directory_permissions
|
||||
create_gitlab_runner_service
|
||||
start_gitlab_runner_service
|
||||
|
||||
# End of install script
|
||||
79
release/ci/publish.sh
Executable file
79
release/ci/publish.sh
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
cd $DIR
|
||||
|
||||
# Take parameters as arguments
|
||||
SOURCE_DIR=$1
|
||||
OUTPUT_DIR=$2
|
||||
DEV_BRANCH=$3
|
||||
VERSION=$4
|
||||
GIT_ORIGIN=$5
|
||||
EXTRA_VERSION_IDENTIFIER=$6
|
||||
|
||||
# Check parameters
|
||||
if [ -z "$SOURCE_DIR" ] || [ -z "$OUTPUT_DIR" ]; then
|
||||
echo "Error: No source or output directory provided."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$DEV_BRANCH" ] || [ -z "$VERSION" ]; then
|
||||
echo "Error: No dev branch or version provided."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$GIT_ORIGIN" ]; then
|
||||
echo "Error: No GIT_ORIGIN provided"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# "Tagging"
|
||||
echo "#define COMMA_VERSION \"$VERSION\"" > ${OUTPUT_DIR}/common/version.h
|
||||
|
||||
## set git identity
|
||||
#source $DIR/identity.sh
|
||||
#export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
cd $OUTPUT_DIR
|
||||
git init
|
||||
|
||||
# set git username/password
|
||||
#source /data/identity.sh
|
||||
|
||||
git rm -rf $OUTPUT_DIR/.git || true # Doing cleanup, but it might fail if the .git doesn't exist or not allowed to delete
|
||||
git remote remove origin || true # ensure cleanup
|
||||
git remote add origin $GIT_ORIGIN
|
||||
#git push origin -d $DEV_BRANCH || true # Ensuring we delete the remote branch if it exists as we are wiping it out
|
||||
git fetch origin $DEV_BRANCH || (git checkout -b $DEV_BRANCH && git commit --allow-empty -m "sunnypilot v$VERSION release" && git push -u origin $DEV_BRANCH)
|
||||
git lfs install
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$DEV_BRANCH
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
if [ "$EXTRA_VERSION_IDENTIFIER" = "-release" ] || [ "$EXTRA_VERSION_IDENTIFIER" = "-staging" ]; then
|
||||
export VERSION=${VERSION%"$EXTRA_VERSION_IDENTIFIER"}
|
||||
git commit --amend -m "sunnypilot v$VERSION"
|
||||
else
|
||||
git commit --amend -m "sunnypilot v$VERSION
|
||||
version: sunnypilot v$SP_VERSION release
|
||||
date: $DATETIME
|
||||
master commit: $GIT_HASH
|
||||
"
|
||||
fi
|
||||
git branch -m $DEV_BRANCH
|
||||
|
||||
# Push!
|
||||
echo "[-] pushing T=$SECONDS"
|
||||
git push -f origin $DEV_BRANCH
|
||||
75
release/ci/sanity_check.sh
Executable file
75
release/ci/sanity_check.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Check if the correct number of arguments are provided
|
||||
if [ "$#" -lt 2 ]; then
|
||||
echo "Error: Missing required arguments."
|
||||
echo "Usage: $0 \"ext1,ext2,...\" \"dir1,dir2,...\" [expect_no_match]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Convert comma-separated lists of extensions and directory patterns to arrays
|
||||
IFS=',' read -r -a file_extensions <<< "$1"
|
||||
IFS=',' read -r -a dir_patterns <<< "$2"
|
||||
|
||||
# Boolean argument to determine the script's behavior when matches are found
|
||||
expect_no_match=${3:-true} # Default to true if not provided
|
||||
|
||||
# Validate that file_extensions and dir_patterns are not empty
|
||||
if [ ${#file_extensions[@]} -eq 0 ]; then
|
||||
echo "Error: No file extensions provided."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ${#dir_patterns[@]} -eq 0 ]; then
|
||||
echo "Error: No directory patterns provided."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Define the command and arguments as an array
|
||||
find_command=(find . \( -false)
|
||||
|
||||
for ext in "${file_extensions[@]}"; do
|
||||
find_command+=(-o -type f -name "*$ext")
|
||||
done
|
||||
for dir in "${dir_patterns[@]}"; do
|
||||
find_command+=(-o -type d -path "$dir")
|
||||
done
|
||||
|
||||
find_command+=(\) -print)
|
||||
|
||||
# Debug print
|
||||
echo "Executing find_command ${find_command[@]}"
|
||||
# Execute the find command
|
||||
FOUND=$("${find_command[@]}")
|
||||
|
||||
# Function to handle found matches
|
||||
handle_found() {
|
||||
local count=$(echo "$FOUND" | grep -c '^')
|
||||
if [ "$expect_no_match" = true ]; then
|
||||
echo "Failure: Unexpected match$( [ "$count" -gt 1 ] && echo "es" ) found ($count):"
|
||||
echo "$FOUND"
|
||||
exit 1
|
||||
else
|
||||
echo "Success: Expected match$( [ "$count" -gt 1 ] && echo "es" ) found ($count):"
|
||||
echo "$FOUND"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to handle no matches found
|
||||
handle_not_found() {
|
||||
if [ "$expect_no_match" = false ]; then
|
||||
echo "Failure: Expected matches not found."
|
||||
exit 1
|
||||
else
|
||||
echo "Success: No matches found as expected."
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if any files or directories are found and handle accordingly
|
||||
if [ -n "$FOUND" ]; then
|
||||
handle_found
|
||||
else
|
||||
handle_not_found
|
||||
fi
|
||||
7
release/ci/sync-lfs.sh
Normal file
7
release/ci/sync-lfs.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
mv .lfsconfig .lfsconfig.bak
|
||||
mv .lfsconfig-comma .lfsconfig
|
||||
git lfs fetch --all; git lfs pull
|
||||
mv .lfsconfig .lfsconfig-comma
|
||||
mv .lfsconfig.bak .lfsconfig
|
||||
git lfs fetch --all; git lfs push origin main
|
||||
58
release/ci/uninstall_gitlab_runner.sh
Executable file
58
release/ci/uninstall_gitlab_runner.sh
Executable file
@@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
# Define directories and user
|
||||
GITLAB_BASE_DIR="/data/gitlab"
|
||||
BIN_DIR="$GITLAB_BASE_DIR/bin"
|
||||
BUILDS_DIR="$GITLAB_BASE_DIR/builds"
|
||||
OPENPILOT_DIR="$GITLAB_BASE_DIR/openpilot"
|
||||
LOGS_DIR="$GITLAB_BASE_DIR/logs"
|
||||
CACHE_DIR="$GITLAB_BASE_DIR/cache"
|
||||
RUNNER_USERNAME="gitlab-runner"
|
||||
# Define the systemd service name
|
||||
SERVICE_NAME="gitlab-runner"
|
||||
USER_GROUPS="comma,gpu,gpio,sudo"
|
||||
|
||||
# Function to stop and disable the systemd service
|
||||
stop_service() {
|
||||
sudo systemctl stop ${SERVICE_NAME}
|
||||
sudo systemctl disable ${SERVICE_NAME}
|
||||
}
|
||||
|
||||
# Function to remove the systemd service file
|
||||
remove_service_file() {
|
||||
sudo rm /etc/systemd/system/${SERVICE_NAME}.service
|
||||
sudo systemctl daemon-reload
|
||||
}
|
||||
|
||||
# Function to delete the GitLab Runner directories
|
||||
delete_directories() {
|
||||
sudo rm -rf "$BIN_DIR/gitlab-runner"
|
||||
sudo rm -rf "$GITLAB_BASE_DIR" "$BIN_DIR" "$BUILDS_DIR" "$LOGS_DIR" "$CACHE_DIR" "$OPENPILOT_DIR"
|
||||
}
|
||||
|
||||
# Function to remove the GitLab Runner user
|
||||
delete_user() {
|
||||
for group in ${USER_GROUPS//,/ }
|
||||
do
|
||||
sudo gpasswd -d ${RUNNER_USERNAME} ${group}
|
||||
done
|
||||
sudo userdel -r ${RUNNER_USERNAME}
|
||||
}
|
||||
|
||||
# Function to remove sudoers entry
|
||||
remove_sudoers_entry() {
|
||||
sudo sed -i.bak "/${RUNNER_USERNAME} ALL=(ALL) NOPASSWD: ALL/d" /etc/sudoers
|
||||
}
|
||||
|
||||
# Make filesystem writable
|
||||
sudo mount -o remount rw /
|
||||
|
||||
# Ensure filesystem is remounted as read-only on script exit
|
||||
trap "sudo mount -o remount ro /" EXIT
|
||||
|
||||
# Call functions
|
||||
stop_service
|
||||
remove_service_file
|
||||
delete_directories
|
||||
delete_user
|
||||
remove_sudoers_entry
|
||||
# End of uninstall script
|
||||
@@ -1,4 +1,4 @@
|
||||
export GIT_COMMITTER_NAME="Vehicle Researcher"
|
||||
export GIT_COMMITTER_EMAIL="user@comma.ai"
|
||||
export GIT_AUTHOR_NAME="Vehicle Researcher"
|
||||
export GIT_AUTHOR_EMAIL="user@comma.ai"
|
||||
export GIT_COMMITTER_NAME="Jason Wen"
|
||||
export GIT_COMMITTER_EMAIL="haibin.wen3@gmail.com"
|
||||
export GIT_AUTHOR_NAME="Jason Wen"
|
||||
export GIT_AUTHOR_EMAIL="haibin.wen3@gmail.com"
|
||||
|
||||
@@ -37,7 +37,7 @@ blacklist = [
|
||||
".github/",
|
||||
".devcontainer/",
|
||||
"Darwin/",
|
||||
".vscode",
|
||||
".vscode/",
|
||||
|
||||
# common things
|
||||
"LICENSE",
|
||||
@@ -51,10 +51,52 @@ blacklist = [
|
||||
".gitmodules",
|
||||
]
|
||||
|
||||
# Sunnypilot blacklist
|
||||
sunnypilot_blacklist = [
|
||||
"system/loggerd/sunnylink_uploader.py", # Temporarily, until we are ready to roll it out widely
|
||||
"system/manager/gitlab_runner.sh",
|
||||
".idea/",
|
||||
".run/",
|
||||
".run/",
|
||||
".*__pycache__/.*",
|
||||
".*\.pyc",
|
||||
"tinygrad/*",
|
||||
"teleoprtc/*",
|
||||
"third_party/snpe/x86_64/*",
|
||||
"body/board/canloader.py",
|
||||
"body/board/flash_base.sh",
|
||||
"body/board/flash_knee.sh",
|
||||
"body/board/recover.sh",
|
||||
".*/test/",
|
||||
".*/tests/",
|
||||
".*tinygrad_repo/tinygrad/renderer/",
|
||||
"README.md",
|
||||
".*internal/",
|
||||
"docs/.*",
|
||||
".sconsign.dblite",
|
||||
"release/ci/scons_cache/",
|
||||
".gitlab-ci.yml",
|
||||
".clang-tidy",
|
||||
".dockerignore",
|
||||
".editorconfig",
|
||||
".gitmodules",
|
||||
".pre-commit-config.yaml",
|
||||
".python-version",
|
||||
"Dockerfile",
|
||||
"dockerfile",
|
||||
"SECURITY.md",
|
||||
"codecov.yml",
|
||||
"conftest.py",
|
||||
"poetry.lock",
|
||||
]
|
||||
|
||||
# Merge the blacklists
|
||||
blacklist += sunnypilot_blacklist
|
||||
|
||||
# gets you through the blacklist
|
||||
whitelist = [
|
||||
"tools/lib/",
|
||||
"tools/bodyteleop/",
|
||||
"^tools/lib/(?!.*__pycache__).*$",
|
||||
"tools/bodyteleop/(?!.*__pycache__).*$",
|
||||
|
||||
"tinygrad_repo/openpilot/compile2.py",
|
||||
"tinygrad_repo/extra/onnx.py",
|
||||
@@ -127,6 +169,47 @@ whitelist = [
|
||||
"opendbc/tesla_powertrain.dbc",
|
||||
]
|
||||
|
||||
# Sunnypilot whitelist
|
||||
sunnypilot_whitelist = [
|
||||
"^README.md",
|
||||
".*selfdrive/test/fuzzy_generation.py",
|
||||
".*selfdrive/test/helpers.py",
|
||||
".*selfdrive/test/__init__.py",
|
||||
".*selfdrive/test/setup_device_ci.sh",
|
||||
".*selfdrive/test/test_time_to_onroad.py",
|
||||
".*selfdrive/test/test_onroad.py",
|
||||
".*system/manager/test/test_manager.py",
|
||||
".*system/manager/test/__init__.py",
|
||||
".*system/qcomgpsd/tests/test_qcomgpsd.py",
|
||||
".*system/updated/casync/tests/test_casync.py",
|
||||
".*system/updated/tests/test_git.py",
|
||||
".*system/updated/tests/test_base.py",
|
||||
".*tools/lib/tests/test_route_library.py",
|
||||
".*tools/lib/tests/test_caching.py",
|
||||
".*tools/lib/tests/test_logreader.py",
|
||||
".*tools/lib/tests/test_readers.py",
|
||||
".*tools/lib/tests/__init__.py",
|
||||
".*tools/lib/tests/test_comma_car_segments.py",
|
||||
".*selfdrive/ui/tests/test_translations.py",
|
||||
".*selfdrive/car/tests/__init__.py",
|
||||
".*selfdrive/car/tests/test_car_interfaces.py",
|
||||
".*selfdrive/navd/tests/test_navd.py",
|
||||
".*selfdrive/navd/tests/test_map_renderer.py",
|
||||
".*selfdrive/boardd/tests/test_boardd_loopback.py",
|
||||
".*tinygrad_repo/tinygrad/renderer/opencl.py",
|
||||
".*tinygrad_repo/tinygrad/renderer/cstyle.py",
|
||||
".*INTEGRATION.md",
|
||||
".*HOW-TOS.md",
|
||||
".*CARS.md",
|
||||
".*LIMITATIONS.md",
|
||||
".*CONTRIBUTING.md",
|
||||
".*sunnyhaibin0850_qrcode_paypal.me.png",
|
||||
"opendbc/.*.dbc",
|
||||
]
|
||||
|
||||
# Merge the whitelists
|
||||
whitelist += sunnypilot_whitelist
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for f in Path(ROOT).rglob("**/*"):
|
||||
|
||||
130
release/sunnypilot/build_dev.sh
Normal file
130
release/sunnypilot/build_dev.sh
Normal file
@@ -0,0 +1,130 @@
|
||||
#!/usr/bin/bash -e
|
||||
|
||||
# git diff --name-status origin/release3-staging | grep "^A" | less
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
|
||||
cd $DIR
|
||||
|
||||
BUILD_DIR=/data/media/openpilot-dev
|
||||
SOURCE_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
FILES_SRC="release/files_tici"
|
||||
DEV_BRANCH="dev-c3"
|
||||
|
||||
BUILD_PANDA_DIR=/data/media/panda/openpilot-dev
|
||||
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
# set git username/password
|
||||
source /data/identity.sh
|
||||
git remote add origin https://github.com/sunnyhaibin/sunnypilot.git
|
||||
git fetch origin $DEV_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
cd $SOURCE_DIR
|
||||
cp -pR --parents $(cat release/files_common) $BUILD_DIR/
|
||||
cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/
|
||||
|
||||
# in the directory
|
||||
cd $BUILD_DIR
|
||||
|
||||
rm -f panda/board/obj/panda.bin.signed
|
||||
rm -f panda/board/obj/panda_h7.bin.signed
|
||||
rm -f panda/board/obj/bootstub.panda.bin
|
||||
rm -f panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
VERSION=$(date '+%Y.%m.%d')
|
||||
echo "#define COMMA_VERSION \"$VERSION-dev\"" > common/version.h
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$DEV_BRANCH
|
||||
|
||||
# Build panda firmware
|
||||
pushd panda/
|
||||
scons -u .
|
||||
mv board/obj/panda.bin.signed $BUILD_PANDA_DIR/panda.bin.signed
|
||||
mv board/obj/panda_h7.bin.signed $BUILD_PANDA_DIR/panda_h7.bin.signed
|
||||
mv board/obj/bootstub.panda.bin $BUILD_PANDA_DIR/bootstub.panda.bin
|
||||
mv board/obj/bootstub.panda_h7.bin $BUILD_PANDA_DIR/bootstub.panda_h7.bin
|
||||
popd
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc)
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
echo "submodules found:"
|
||||
git submodule--helper list
|
||||
exit 1
|
||||
fi
|
||||
git submodule status
|
||||
|
||||
# Cleanup
|
||||
find . -name '*.a' -delete
|
||||
find . -name '*.o' -delete
|
||||
find . -name '*.os' -delete
|
||||
find . -name '*.pyc' -delete
|
||||
find . -name 'moc_*' -delete
|
||||
find . -name '*.cc' -delete
|
||||
find . -name '__pycache__' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
rm -rf panda/board panda/certs panda/crypto
|
||||
rm -rf .sconsign.dblite Jenkinsfile release/
|
||||
rm selfdrive/modeld/models/supercombo.onnx
|
||||
rm -rf selfdrive/ui/replay/
|
||||
# Move back signed panda fw
|
||||
mkdir -p panda/board/obj
|
||||
mv $BUILD_PANDA_DIR/panda.bin.signed panda/board/obj/panda.bin.signed
|
||||
mv $BUILD_PANDA_DIR/panda_h7.bin.signed panda/board/obj/panda_h7.bin.signed
|
||||
mv $BUILD_PANDA_DIR/bootstub.panda.bin panda/board/obj/bootstub.panda.bin
|
||||
mv $BUILD_PANDA_DIR/bootstub.panda_h7.bin panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
# Restore third_party
|
||||
git checkout third_party/
|
||||
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "sunnypilot v$VERSION
|
||||
version: sunnypilot v$SP_VERSION release
|
||||
date: $DATETIME
|
||||
master commit: $GIT_HASH
|
||||
"
|
||||
git branch -m dev-c3
|
||||
|
||||
# Run tests
|
||||
#TEST_FILES="tools/"
|
||||
#cd $SOURCE_DIR
|
||||
#cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 selfdrive/test/test_onroad.py
|
||||
#selfdrive/manager/test/test_manager.py
|
||||
#selfdrive/car/tests/test_car_interfaces.py
|
||||
#rm -rf $TEST_FILES
|
||||
|
||||
if [ ! -z "$PUSH" ]; then
|
||||
echo "[-] pushing T=$SECONDS"
|
||||
git push -f origin $DEV_BRANCH
|
||||
fi
|
||||
|
||||
echo "[-] done T=$SECONDS"
|
||||
127
release/sunnypilot/build_release.sh
Normal file
127
release/sunnypilot/build_release.sh
Normal file
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/bash -e
|
||||
|
||||
# git diff --name-status origin/release3-staging | grep "^A" | less
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
|
||||
cd $DIR
|
||||
|
||||
BUILD_DIR=/data/media/openpilot-release
|
||||
SOURCE_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
FILES_SRC="release/files_tici"
|
||||
RELEASE_BRANCH="release-c3"
|
||||
|
||||
BUILD_PANDA_DIR=/data/media/panda/openpilot-release
|
||||
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
# set git username/password
|
||||
source /data/identity.sh
|
||||
git remote add origin https://github.com/sunnyhaibin/sunnypilot.git
|
||||
git fetch origin $RELEASE_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
cd $SOURCE_DIR
|
||||
cp -pR --parents $(cat release/files_common) $BUILD_DIR/
|
||||
cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/
|
||||
|
||||
# in the directory
|
||||
cd $BUILD_DIR
|
||||
|
||||
rm -f panda/board/obj/panda.bin.signed
|
||||
rm -f panda/board/obj/panda_h7.bin.signed
|
||||
rm -f panda/board/obj/bootstub.panda.bin
|
||||
rm -f panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}')
|
||||
echo "#define COMMA_VERSION \"$VERSION-release\"" > common/version.h
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$RELEASE_BRANCH
|
||||
|
||||
# Build panda firmware
|
||||
pushd panda/
|
||||
scons -u .
|
||||
mv board/obj/panda.bin.signed $BUILD_PANDA_DIR/panda.bin.signed
|
||||
mv board/obj/panda_h7.bin.signed $BUILD_PANDA_DIR/panda_h7.bin.signed
|
||||
mv board/obj/bootstub.panda.bin $BUILD_PANDA_DIR/bootstub.panda.bin
|
||||
mv board/obj/bootstub.panda_h7.bin $BUILD_PANDA_DIR/bootstub.panda_h7.bin
|
||||
popd
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc)
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
echo "submodules found:"
|
||||
git submodule--helper list
|
||||
exit 1
|
||||
fi
|
||||
git submodule status
|
||||
|
||||
# Cleanup
|
||||
find . -name '*.a' -delete
|
||||
find . -name '*.o' -delete
|
||||
find . -name '*.os' -delete
|
||||
find . -name '*.pyc' -delete
|
||||
find . -name 'moc_*' -delete
|
||||
find . -name '*.cc' -delete
|
||||
find . -name '__pycache__' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
rm -rf panda/board panda/certs panda/crypto
|
||||
rm -rf .sconsign.dblite Jenkinsfile release/
|
||||
rm selfdrive/modeld/models/supercombo.onnx
|
||||
#rm models/supercombo_badweights.thneed
|
||||
rm -rf selfdrive/ui/replay/
|
||||
# Move back signed panda fw
|
||||
mkdir -p panda/board/obj
|
||||
mv $BUILD_PANDA_DIR/panda.bin.signed panda/board/obj/panda.bin.signed
|
||||
mv $BUILD_PANDA_DIR/panda_h7.bin.signed panda/board/obj/panda_h7.bin.signed
|
||||
mv $BUILD_PANDA_DIR/bootstub.panda.bin panda/board/obj/bootstub.panda.bin
|
||||
mv $BUILD_PANDA_DIR/bootstub.panda_h7.bin panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
# Restore third_party
|
||||
git checkout third_party/
|
||||
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "sunnypilot v$VERSION"
|
||||
git branch -m release-c3
|
||||
|
||||
# Run tests
|
||||
#TEST_FILES="tools/"
|
||||
#cd $SOURCE_DIR
|
||||
#cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 selfdrive/test/test_onroad.py
|
||||
#selfdrive/manager/test/test_manager.py
|
||||
#selfdrive/car/tests/test_car_interfaces.py
|
||||
#rm -rf $TEST_FILES
|
||||
|
||||
if [ ! -z "$PUSH" ]; then
|
||||
echo "[-] pushing T=$SECONDS"
|
||||
git push -f origin $RELEASE_BRANCH
|
||||
fi
|
||||
|
||||
echo "[-] done T=$SECONDS"
|
||||
127
release/sunnypilot/build_staging.sh
Normal file
127
release/sunnypilot/build_staging.sh
Normal file
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/bash -e
|
||||
|
||||
# git diff --name-status origin/release3-staging | grep "^A" | less
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
|
||||
cd $DIR
|
||||
|
||||
BUILD_DIR=/data/media/openpilot-staging
|
||||
SOURCE_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
FILES_SRC="release/files_tici"
|
||||
STAGING_BRANCH="staging-c3"
|
||||
|
||||
BUILD_PANDA_DIR=/data/media/panda/openpilot-staging
|
||||
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
# set git username/password
|
||||
source /data/identity.sh
|
||||
git remote add origin https://github.com/sunnyhaibin/sunnypilot.git
|
||||
git fetch origin $STAGING_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
cd $SOURCE_DIR
|
||||
cp -pR --parents $(cat release/files_common) $BUILD_DIR/
|
||||
cp -pR --parents $(cat $FILES_SRC) $BUILD_DIR/
|
||||
|
||||
# in the directory
|
||||
cd $BUILD_DIR
|
||||
|
||||
rm -f panda/board/obj/panda.bin.signed
|
||||
rm -f panda/board/obj/panda_h7.bin.signed
|
||||
rm -f panda/board/obj/bootstub.panda.bin
|
||||
rm -f panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}')
|
||||
echo "#define COMMA_VERSION \"$VERSION-staging\"" > common/version.h
|
||||
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "sunnypilot v$VERSION release"
|
||||
git branch --set-upstream-to=origin/$STAGING_BRANCH
|
||||
|
||||
# Build panda firmware
|
||||
pushd panda/
|
||||
scons -u .
|
||||
mv board/obj/panda.bin.signed $BUILD_PANDA_DIR/panda.bin.signed
|
||||
mv board/obj/panda_h7.bin.signed $BUILD_PANDA_DIR/panda_h7.bin.signed
|
||||
mv board/obj/bootstub.panda.bin $BUILD_PANDA_DIR/bootstub.panda.bin
|
||||
mv board/obj/bootstub.panda_h7.bin $BUILD_PANDA_DIR/bootstub.panda_h7.bin
|
||||
popd
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc)
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
echo "submodules found:"
|
||||
git submodule--helper list
|
||||
exit 1
|
||||
fi
|
||||
git submodule status
|
||||
|
||||
# Cleanup
|
||||
find . -name '*.a' -delete
|
||||
find . -name '*.o' -delete
|
||||
find . -name '*.os' -delete
|
||||
find . -name '*.pyc' -delete
|
||||
find . -name 'moc_*' -delete
|
||||
find . -name '*.cc' -delete
|
||||
find . -name '__pycache__' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
rm -rf panda/board panda/certs panda/crypto
|
||||
rm -rf .sconsign.dblite Jenkinsfile release/
|
||||
rm selfdrive/modeld/models/supercombo.onnx
|
||||
#rm models/supercombo_badweights.thneed
|
||||
rm -rf selfdrive/ui/replay/
|
||||
# Move back signed panda fw
|
||||
mkdir -p panda/board/obj
|
||||
mv $BUILD_PANDA_DIR/panda.bin.signed panda/board/obj/panda.bin.signed
|
||||
mv $BUILD_PANDA_DIR/panda_h7.bin.signed panda/board/obj/panda_h7.bin.signed
|
||||
mv $BUILD_PANDA_DIR/bootstub.panda.bin panda/board/obj/bootstub.panda.bin
|
||||
mv $BUILD_PANDA_DIR/bootstub.panda_h7.bin panda/board/obj/bootstub.panda_h7.bin
|
||||
|
||||
# Restore third_party
|
||||
git checkout third_party/
|
||||
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# include source commit hash and build date in commit
|
||||
GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse HEAD)
|
||||
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
||||
SP_VERSION=$(cat $SOURCE_DIR/common/version.h | awk -F\" '{print $2}')
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "sunnypilot v$VERSION"
|
||||
git branch -m staging-c3
|
||||
|
||||
# Run tests
|
||||
#TEST_FILES="tools/"
|
||||
#cd $SOURCE_DIR
|
||||
#cp -pR -n --parents $TEST_FILES $BUILD_DIR/
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 selfdrive/test/test_onroad.py
|
||||
#selfdrive/manager/test/test_manager.py
|
||||
#selfdrive/car/tests/test_car_interfaces.py
|
||||
#rm -rf $TEST_FILES
|
||||
|
||||
if [ ! -z "$PUSH" ]; then
|
||||
echo "[-] pushing T=$SECONDS"
|
||||
git push -f origin $STAGING_BRANCH
|
||||
fi
|
||||
|
||||
echo "[-] done T=$SECONDS"
|
||||
4
release/sunnypilot/identity.sh
Normal file
4
release/sunnypilot/identity.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
export GIT_COMMITTER_NAME="Jason Wen"
|
||||
export GIT_COMMITTER_EMAIL="haibin.wen3@gmail.com"
|
||||
export GIT_AUTHOR_NAME="Jason Wen"
|
||||
export GIT_AUTHOR_EMAIL="haibin.wen3@gmail.com"
|
||||
5
scripts/mapd_dep_compress.sh
Normal file
5
scripts/mapd_dep_compress.sh
Normal file
@@ -0,0 +1,5 @@
|
||||
#! usr/bin/bash
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null && pwd)"
|
||||
|
||||
tar -cf - -C "$DIR/third_party" mapd | xz -9zev -T0 > "$DIR/selfdrive/mapd/assets/mapd_deps.tar.xz"
|
||||
79
scripts/sp_carname_generator.py
Normal file
79
scripts/sp_carname_generator.py
Normal file
@@ -0,0 +1,79 @@
|
||||
import json
|
||||
import os
|
||||
from natsort import natsorted
|
||||
from typing import Any, Dict, List
|
||||
|
||||
from cereal import car
|
||||
from common.basedir import BASEDIR
|
||||
from selfdrive.car import gen_empty_fingerprint
|
||||
from selfdrive.car.car_helpers import interfaces
|
||||
from selfdrive.car.docs import get_all_footnotes
|
||||
from openpilot.selfdrive.car.values import PLATFORMS
|
||||
|
||||
UNSUPPORTED_BRANDS = ["body", "tesla"]
|
||||
|
||||
|
||||
def get_all_car_names() -> Dict[str, str]:
|
||||
car_names = {}
|
||||
footnotes = get_all_footnotes()
|
||||
|
||||
car_names["=== Not Selected ==="] = ""
|
||||
|
||||
for model, platform in PLATFORMS.items():
|
||||
car_docs = platform.config.car_docs
|
||||
CP = interfaces[model][0].get_params(platform, fingerprint=gen_empty_fingerprint(),
|
||||
car_fw=[car.CarParams.CarFw(ecu="unknown")], experimental_long=True, docs=True)
|
||||
|
||||
if CP.dashcamOnly or not len(car_docs):
|
||||
continue
|
||||
|
||||
if not isinstance(car_docs, list):
|
||||
car_docs = (car_docs,)
|
||||
|
||||
for _car_docs in car_docs:
|
||||
if not hasattr(_car_docs, "row"):
|
||||
_car_docs.init_make(CP)
|
||||
_car_docs.init(CP, footnotes)
|
||||
car_names[_car_docs.name] = model
|
||||
|
||||
sorted_car_names = natsorted(car_names.keys(), key=lambda car: car.lower())
|
||||
return {car_name: car_names[car_name] for car_name in sorted_car_names}
|
||||
|
||||
|
||||
def get_interface_attr(attr: str, combine_brands: bool = False, ignore_none: bool = False,
|
||||
exclude_brands: List[str] = None) -> Dict[str, Any]:
|
||||
if exclude_brands is None:
|
||||
exclude_brands = []
|
||||
|
||||
result = {}
|
||||
for car_folder in sorted([x[0] for x in os.walk(BASEDIR + '/selfdrive/car')]):
|
||||
try:
|
||||
brand_name = car_folder.split('/')[-1]
|
||||
|
||||
if brand_name in exclude_brands:
|
||||
continue
|
||||
|
||||
brand_values = __import__(f'selfdrive.car.{brand_name}.values', fromlist=[attr])
|
||||
if hasattr(brand_values, attr) or not ignore_none:
|
||||
attr_data = getattr(brand_values, attr, None)
|
||||
else:
|
||||
continue
|
||||
|
||||
if combine_brands:
|
||||
if isinstance(attr_data, dict):
|
||||
for f, v in attr_data.items():
|
||||
result[f] = v
|
||||
else:
|
||||
result[brand_name] = attr_data
|
||||
except (ImportError, OSError):
|
||||
pass
|
||||
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
car_names_dict = get_all_car_names()
|
||||
|
||||
with open(BASEDIR + "/selfdrive/car/sunnypilot_carname.json", "w") as json_file:
|
||||
json.dump(car_names_dict, json_file, indent=2, ensure_ascii=False)
|
||||
json_file.write('\n')
|
||||
65
scripts/sunnypilot/Jenkinsfile
vendored
Normal file
65
scripts/sunnypilot/Jenkinsfile
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Build dev-c3') {
|
||||
when {
|
||||
branch 'master-dev-c3'
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
sshagent(['comma-three-ssh']) {
|
||||
withCredentials([string(credentialsId: 'comma-three-username-ip', variable: 'username_ip')]) {
|
||||
sh 'ssh -o StrictHostKeyChecking=no $username_ip "bash /data/update_dev.sh"'
|
||||
sh 'ssh -o StrictHostKeyChecking=no $username_ip "bash /data/build_dev.sh"'
|
||||
env.BRANCH_NAME = 'dev-c3'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build staging-c3') {
|
||||
when {
|
||||
branch 'master'
|
||||
}
|
||||
options {
|
||||
timeout(time: 10, unit: 'MINUTES')
|
||||
}
|
||||
steps {
|
||||
input "Build staging-c3?"
|
||||
script {
|
||||
sshagent(['comma-three-ssh']) {
|
||||
withCredentials([string(credentialsId: 'comma-three-username-ip', variable: 'username_ip')]) {
|
||||
sh 'ssh -o StrictHostKeyChecking=no $username_ip "bash /data/update_staging.sh"'
|
||||
sh 'ssh -o StrictHostKeyChecking=no $username_ip "bash /data/build_staging.sh"'
|
||||
env.BRANCH_NAME = 'staging-c3'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
if (env.BRANCH_NAME == 'dev-c3' || env.BRANCH_NAME == 'staging-c3') {
|
||||
withCredentials([string(credentialsId: 'discord-webhook', variable: 'discord_webhook')]) {
|
||||
discordSend(
|
||||
webhookURL: discord_webhook,
|
||||
title: 'sunnypilot Jenkins Pipeline Build',
|
||||
description: 'Branch: ' + env.BRANCH_NAME,
|
||||
result: currentBuild.currentResult,
|
||||
footer: 'Build complete'
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
28
scripts/sunnypilot/model_json_hash_generator.py
Normal file
28
scripts/sunnypilot/model_json_hash_generator.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import requests
|
||||
import hashlib
|
||||
import json
|
||||
|
||||
# Function to calculate SHA-256 hash of a file downloaded from a given URI
|
||||
def calculate_hash(download_uri):
|
||||
response = requests.get(download_uri, stream=True)
|
||||
hash_sha256 = hashlib.sha256()
|
||||
for chunk in response.iter_content(chunk_size=1024):
|
||||
hash_sha256.update(chunk)
|
||||
return hash_sha256.hexdigest()
|
||||
|
||||
# Download the models_v3.json file
|
||||
models_v3_url = "https://docs.sunnypilot.ai/models_v3.json"
|
||||
response = requests.get(models_v3_url)
|
||||
models_data = response.json()
|
||||
|
||||
# Iterate through each model and calculate SHA-256 for its files
|
||||
for model_key, model_info in models_data.items():
|
||||
# Calculate and insert the SHA-256 hash for each download URI
|
||||
model_info['download_uri'] = {'url': model_info['download_uri'], 'sha256': calculate_hash(model_info['download_uri'])}
|
||||
model_info['download_uri_nav'] = {'url': model_info['download_uri_nav'], 'sha256': calculate_hash(model_info['download_uri_nav'])}
|
||||
model_info['download_uri_metadata'] = {'url': model_info['download_uri_metadata'], 'sha256': calculate_hash(model_info['download_uri_metadata'])}
|
||||
|
||||
# Save the updated JSON with hashes
|
||||
updated_json_file_path = 'updated_models_v3.json' # Path for the updated JSON file
|
||||
with open(updated_json_file_path, 'w') as file:
|
||||
json.dump(models_data, file, indent=4)
|
||||
@@ -2,5 +2,6 @@ SConscript(['pandad/SConscript'])
|
||||
SConscript(['controls/lib/lateral_mpc_lib/SConscript'])
|
||||
SConscript(['controls/lib/longitudinal_mpc_lib/SConscript'])
|
||||
SConscript(['locationd/SConscript'])
|
||||
SConscript(['navd/SConscript'])
|
||||
SConscript(['modeld/SConscript'])
|
||||
SConscript(['ui/SConscript'])
|
||||
BIN
selfdrive/assets/img_map.png
LFS
Normal file
BIN
selfdrive/assets/img_map.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/img_minus_arrow_down.png
LFS
Normal file
BIN
selfdrive/assets/img_minus_arrow_down.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/img_plus_arrow_up.png
LFS
Normal file
BIN
selfdrive/assets/img_plus_arrow_up.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/default_marker.svg
LFS
Normal file
BIN
selfdrive/assets/navigation/default_marker.svg
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_arrive.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_arrive.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_arrive_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_arrive_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_arrive_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_arrive_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_arrive_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_arrive_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_close.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_close.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue_slight_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue_slight_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue_slight_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue_slight_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_continue_uturn.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_continue_uturn.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_depart.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_depart.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_depart_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_depart_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_depart_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_depart_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_depart_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_depart_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_end_of_road_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_end_of_road_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_end_of_road_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_end_of_road_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_flag.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_flag.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_fork.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_fork.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_fork_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_fork_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_fork_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_fork_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_fork_slight_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_fork_slight_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_fork_slight_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_fork_slight_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_fork_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_fork_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid_slight_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid_slight_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid_slight_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid_slight_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_invalid_uturn.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_invalid_uturn.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_merge_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_merge_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_merge_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_merge_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_merge_slight_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_merge_slight_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_merge_slight_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_merge_slight_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_merge_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_merge_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_new_name_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_new_name_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_new_name_sharp_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_sharp_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_new_name_sharp_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_sharp_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_new_name_slight_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_slight_left.png
LFS
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user