mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-06-11 15:14:36 +08:00
Compare commits
999 Commits
archive/ma
...
archive/se
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
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/
|
||||
|
||||
|
||||
258
.gitlab-ci.yml
Normal file
258
.gitlab-ci.yml
Normal file
@@ -0,0 +1,258 @@
|
||||
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"
|
||||
|
||||
stages:
|
||||
- build
|
||||
- sanity
|
||||
- publish
|
||||
- notify
|
||||
|
||||
default:
|
||||
retry: 2
|
||||
tags:
|
||||
- sunnypilot
|
||||
- x86
|
||||
|
||||
.default_before_script: &default_before_script
|
||||
- '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
|
||||
# We are a merge request
|
||||
- if: $CI_MERGE_REQUEST_IID
|
||||
variables:
|
||||
EXTRA_VERSION_IDENTIFIER: "-${CI_PIPELINE_IID}"
|
||||
NEW_BRANCH: ${CI_COMMIT_REF_NAME}-prebuilt
|
||||
when: always
|
||||
|
||||
# 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"
|
||||
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"
|
||||
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"
|
||||
- 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 -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: $CI_MERGE_REQUEST_IID
|
||||
when: manual
|
||||
- if: $NEW_BRANCH
|
||||
when: always
|
||||
|
||||
check no source code sent:
|
||||
image: alpine
|
||||
stage: sanity
|
||||
variables:
|
||||
FORBIDDEN_FILE_EXTENSIONS: "*.a,*.o,*.os,*.pyc,moc_*,*.cc,Jenkinsfile,supercombo.onnx,.sconsign.dblite"
|
||||
FORBIDDEN_DIR_PATTERNS: "*panda/certs,*panda/crypto,*release,*.github,*selfdrive/ui/replay,*__pycache__"
|
||||
REQUIRED_FILE_EXTENSIONS: "*.py,*.json"
|
||||
REQUIRED_DIR_PATTERNS: "*selfdrive/ui,*openpilot"
|
||||
before_script:
|
||||
- apk update && apk upgrade
|
||||
- apk add bash findutils
|
||||
script:
|
||||
- cd ${OUTPUT_DIR}
|
||||
- echo "Checking that we have properly cleaned up"
|
||||
- ${CI_DIR}/sanity_check.sh "$FORBIDDEN_FILE_EXTENSIONS" "$FORBIDDEN_DIR_PATTERNS" true
|
||||
- echo "Checking that our sanity check works and also checking that some required files are indeed found"
|
||||
- ${CI_DIR}/sanity_check.sh "$REQUIRED_FILE_EXTENSIONS" "$REQUIRED_DIR_PATTERNS" false
|
||||
rules:
|
||||
- if: $NEW_BRANCH
|
||||
when: on_success
|
||||
- when: never
|
||||
|
||||
.publish_base: &publish_base
|
||||
image: alpine
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: normal
|
||||
stage: publish
|
||||
needs:
|
||||
- job: build
|
||||
artifacts: true
|
||||
- job: "check no source code sent"
|
||||
artifacts: false
|
||||
optional: false
|
||||
before_script:
|
||||
- 'apk update && apk upgrade'
|
||||
- 'apk add git bash openssh'
|
||||
- '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.git
|
||||
rules:
|
||||
- if: $NEW_BRANCH
|
||||
when: on_success
|
||||
- when: never
|
||||
|
||||
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: $NEW_BRANCH
|
||||
when: manual
|
||||
- when: never
|
||||
|
||||
.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"
|
||||
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>
|
||||
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)
|
||||
========================
|
||||
|
||||
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
|
||||
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 #${CI_PIPELINE_IID} 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
|
||||
78
release/ci/publish.sh
Executable file
78
release/ci/publish.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/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)
|
||||
|
||||
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.
BIN
selfdrive/assets/navigation/direction_new_name_slight_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_slight_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_new_name_straight.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_new_name_straight.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_notification_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_notification_left.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_notification_right.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_notification_right.png
LFS
Normal file
Binary file not shown.
BIN
selfdrive/assets/navigation/direction_notification_sharp_left.png
LFS
Normal file
BIN
selfdrive/assets/navigation/direction_notification_sharp_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