This commit is contained in:
firestar5683
2026-03-27 18:05:44 -05:00
parent ac4cec2e22
commit 3d8af2361e
1943 changed files with 4675 additions and 4661 deletions
@@ -1,4 +1,4 @@
name: Compile FrogPilot
name: Compile StarPilot
on:
workflow_dispatch:
@@ -13,18 +13,18 @@ on:
type: string
default: ""
required: false
publish_frogpilot:
description: "Push to FrogPilot"
publish_starpilot:
description: "Push to StarPilot"
type: boolean
default: false
required: false
publish_staging:
description: "Push to FrogPilot-Staging"
description: "Push to StarPilot-Staging"
type: boolean
default: false
required: false
publish_testing:
description: "Push to FrogPilot-Testing"
description: "Push to StarPilot-Testing"
type: boolean
default: false
required: false
@@ -88,7 +88,7 @@ jobs:
with:
ref: ${{ needs.get_branch.outputs.branch }}
sparse-checkout: |
frogpilot/ui/
starpilot/ui/
selfdrive/controls/lib/alerts_offroad.json
selfdrive/ui/
selfdrive/ui/translations/
@@ -151,7 +151,7 @@ jobs:
git config http.postBuffer 104857600
git config user.name "$GIT_NAME"
git config user.email "$GIT_EMAIL"
git remote set-url origin "https://${{ secrets.PERSONAL_ACCESS_TOKEN }}@github.com/FrogAi/FrogPilot.git"
git remote set-url origin "https://${{ secrets.PERSONAL_ACCESS_TOKEN }}@github.com/FrogAi/StarPilot.git"
- name: Sync Translation Updates
if: inputs.update_translations
@@ -181,7 +181,7 @@ jobs:
find .github -mindepth 1 -maxdepth 1 ! -name 'workflows' -exec rm -rf {} +
find .github/workflows -mindepth 1 ! \( \
-type f \( \
-name 'compile_frogpilot.yaml' -o \
-name 'compile_starpilot.yaml' -o \
-name 'review_pull_request.yaml' -o \
-name 'schedule_update.yaml' -o \
-name 'update_pr_branch.yaml' -o \
@@ -214,24 +214,24 @@ jobs:
if: inputs.publish_staging
continue-on-error: true
run: |
curl -fLsS https://raw.githubusercontent.com/FrogAi/FrogPilot/FrogPilot-Staging/.github/update_date -o .github/update_date || echo "No update_date found, skipping..."
curl -fLsS https://raw.githubusercontent.com/FrogAi/StarPilot/StarPilot-Staging/.github/update_date -o .github/update_date || echo "No update_date found, skipping..."
- name: Commit and Push Build
run: |
git add -f .
git commit -m "Compile FrogPilot"
git commit -m "Compile StarPilot"
git push --force origin HEAD
if [ "${{ inputs.publish_frogpilot }}" = "true" ]; then
git push --force origin HEAD:FrogPilot
if [ "${{ inputs.publish_starpilot }}" = "true" ]; then
git push --force origin HEAD:StarPilot
fi
if [ "${{ inputs.publish_staging }}" = "true" ]; then
git push --force origin HEAD:FrogPilot-Staging
git push --force origin HEAD:StarPilot-Staging
fi
if [ "${{ inputs.publish_testing }}" = "true" ]; then
git push --force origin HEAD:FrogPilot-Testing
git push --force origin HEAD:StarPilot-Testing
fi
if [ -n "$CUSTOM_BRANCH" ]; then
+1 -1
View File
@@ -34,5 +34,5 @@ jobs:
echo "Valid target branch."
gh pr comment "$PR_NUMBER" --repo "$REPO" \
--body "Thank you for your PR! If you're not already in the FrogPilot Discord, [feel free to join](https://discord.FrogPilot.com) and let me know you've opened a PR!"
--body "Thank you for your PR! If you're not already in the StarPilot Discord, [feel free to join](https://discord.StarPilot.com) and let me know you've opened a PR!"
fi
+3 -3
View File
@@ -1,16 +1,16 @@
name: Schedule FrogPilot Update
name: Schedule StarPilot Update
on:
workflow_dispatch:
inputs:
scheduled_date:
description: "Enter the date to update the \"FrogPilot\" branch (YYYY-MM-DD)"
description: "Enter the date to update the \"StarPilot\" branch (YYYY-MM-DD)"
required: true
env:
GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com"
GIT_NAME: "James"
TARGET_BRANCH: "FrogPilot-Staging"
TARGET_BRANCH: "StarPilot-Staging"
UPDATE_FILE_PATH: ".github/update_date"
jobs:
+5 -5
View File
@@ -4,13 +4,13 @@ run-name: Update MAKE-PRS-HERE
on:
push:
branches:
- FrogPilot-Testing
- StarPilot-Testing
env:
GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com"
GIT_NAME: "James"
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
SOURCE_BRANCH: FrogPilot-Testing
SOURCE_BRANCH: StarPilot-Testing
TARGET_BRANCH: MAKE-PRS-HERE
TZ: America/Phoenix
@@ -33,13 +33,13 @@ jobs:
git config --global user.name "$GIT_NAME"
git config --global user.email "$GIT_EMAIL"
- name: Revert "Compile FrogPilot"
- name: Revert "Compile StarPilot"
id: prepare_source
run: |
COMPILE_COMMIT=$(git rev-list HEAD -n 1 --grep="Compile FrogPilot" || true)
COMPILE_COMMIT=$(git rev-list HEAD -n 1 --grep="Compile StarPilot" || true)
if [ -n "$COMPILE_COMMIT" ]; then
echo "Found 'Compile FrogPilot' at $COMPILE_COMMIT. Reverting..."
echo "Found 'Compile StarPilot' at $COMPILE_COMMIT. Reverting..."
git revert --no-edit "$COMPILE_COMMIT"
else
echo "Compile commit not found. Proceeding with current source state."
+7 -7
View File
@@ -1,13 +1,13 @@
name: Update FrogPilot Branch
name: Update StarPilot Branch
on:
schedule:
- cron: "0 18 * * 6"
env:
BRANCH_FROGPILOT: FrogPilot
BRANCH_PREVIOUS: FrogPilot-Previous
BRANCH_STAGING: FrogPilot-Staging
BRANCH_STARPILOT: StarPilot
BRANCH_PREVIOUS: StarPilot-Previous
BRANCH_STAGING: StarPilot-Staging
GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com"
GIT_NAME: "James"
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
@@ -102,6 +102,6 @@ jobs:
- name: Push and Sync Branches
run: |
git push origin "$BRANCH_STAGING" --force
git fetch origin "$BRANCH_FROGPILOT:$BRANCH_FROGPILOT"
git push origin "$BRANCH_FROGPILOT:$BRANCH_PREVIOUS" --force
git push origin "$BRANCH_STAGING:$BRANCH_FROGPILOT" --force
git fetch origin "$BRANCH_STARPILOT:$BRANCH_STARPILOT"
git push origin "$BRANCH_STARPILOT:$BRANCH_PREVIOUS" --force
git push origin "$BRANCH_STAGING:$BRANCH_STARPILOT" --force
+4 -4
View File
@@ -15,8 +15,8 @@ on:
env:
GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com"
GIT_NAME: "James"
GITLAB_REPO_DIR: "FrogPilot-Resources"
GITLAB_URL: "gitlab.com/FrogAi/FrogPilot-Resources.git"
GITLAB_REPO_DIR: "StarPilot-Resources"
GITLAB_URL: "gitlab.com/FrogAi/StarPilot-Resources.git"
OPENPILOT_DIR: "/data/openpilot"
jobs:
@@ -26,7 +26,7 @@ jobs:
- name: Get Version
id: get_version
run: |
VERSION=$(grep -oP '^VERSION\s*=\s*"\K[^"]+' "$OPENPILOT_DIR/frogpilot/assets/model_manager.py")
VERSION=$(grep -oP '^VERSION\s*=\s*"\K[^"]+' "$OPENPILOT_DIR/starpilot/assets/model_manager.py")
echo "VERSION=$VERSION"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
@@ -35,7 +35,7 @@ jobs:
env:
GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
run: |
WORK_DIR="$RUNNER_TEMP/frogpilot_tinygrad"
WORK_DIR="$RUNNER_TEMP/starpilot_tinygrad"
rm -rf "$WORK_DIR" && mkdir -p "$WORK_DIR"
echo "work_dir=$WORK_DIR" >> "$GITHUB_OUTPUT"
+3 -3
View File
@@ -17,8 +17,8 @@ Openpilot provides
StarPilot adds support for many GM vehicles along with improved tuning,
especially for radar-less (camera only) vehicles.
StarPilot is built off of [FrogPilot](https://github.com/FrogAi/FrogPilot)
and supports the major features FrogPilot offers.
StarPilot is built off of [StarPilot](https://github.com/FrogAi/StarPilot)
and supports the major features StarPilot offers.
StarPilot has a vibrant, welcoming community [discord](https://firestar.link/discord).
Stop by to chat or ask questions!
@@ -48,7 +48,7 @@ Download models, change settings, update software, visualize live model outputs
* High quality dashcam recordings*
* Enhanced tuning for CEM (dynamic experimental mode switching)
\* [Inherited from FrogPilot](https://github.com/FrogAi/FrogPilot#openpilot-vs-frogpilot)
\* [Inherited from StarPilot](https://github.com/FrogAi/StarPilot#openpilot-vs-starpilot)
## GM-only Features
+6 -6
View File
@@ -637,7 +637,7 @@ Legend: ✅ = Full | 🟡 = Structure/stub | 🔴 = Not started
#### Completed (March 17, 2026)
- **Created `StarPilotState` singleton** (`selfdrive/ui/lib/starpilot_state.py`) with:
- `StarPilotCarState` dataclass with all car type, capability, and value fields
- Reads `CarParamsPersistent`, `FrogPilotCarParamsPersistent`, `LiveTorqueParameters`, `FrogPilotToggles` from Params
- Reads `CarParamsPersistent`, `StarPilotCarParamsPersistent`, `LiveTorqueParameters`, `StarPilotToggles` from Params
- Throttled updates (2.0s interval) to avoid slowing UI
- PC/desktop fallback mode with configurable car make/model
- Global import: `from openpilot.selfdrive.ui.lib.starpilot_state import starpilot_state`
@@ -1270,7 +1270,7 @@ emit closeSubSubSubPanel(); // Back from Level 4 → Level 3
**Longitudinal Panel Structure** (17 sub-panels, ~80 controls):
```
FROGPILOT LONGITUDINAL LAYOUT (top level - MANAGE buttons)
STARPILOT LONGITUDINAL LAYOUT (top level - MANAGE buttons)
├── Advanced Longitudinal Tuning → StarPilotAdvancedLongLayout
│ └── 8 value controls
├── Conditional Experimental Mode → StarPilotConditionalExpLayout
@@ -1741,7 +1741,7 @@ KM_TO_MILE = 0.621371
| Rainbow Path | Toggle | | |
| Random Events | Toggle | | |
| Random Themes | TOGGLE+TOGGLE | - | Includes "Include Holiday Themes" |
| Startup Alert | BUTTON | STOCK, FROGPILOT, CUSTOM, CLEAR | |
| Startup Alert | BUTTON | STOCK, STARPILOT, CUSTOM, CLEAR | |
| Download Status | LABEL | - | Shows download progress |
**Custom Themes Sub-Panel** (7 theme types, each with DELETE/DOWNLOAD/SELECT):
@@ -1973,7 +1973,7 @@ Acura, Audi, Buick, Cadillac, Chevrolet, Chrysler, CUPRA, Dodge, Ford, Genesis,
| Debug Mode | Toggle | |
| Flash Panda | BUTTON | FLASH |
| Force Drive State | BUTTONS | OFFROAD / ONROAD / OFF |
| Pair to "The Pond" | BUTTON | PAIR/UNPAIR |
| Galaxy | BUTTON | PAIR/UNPAIR |
| Report a Bug | BUTTON | REPORT |
| Reset Toggles to Default | BUTTON | RESET |
| Reset Toggles to Stock | BUTTON | RESET |
@@ -2613,9 +2613,9 @@ ensures that if the car state changes (e.g. from a CarParams update), the UI ref
**Data sources parsed:**
1. `CarParamsPersistent` — Car fingerprint, lateral tuning, capabilities
2. `FrogPilotCarParamsPersistent` — canUsePedal, canUseSDSU, openpilotLongitudinalControlDisabled
2. `StarPilotCarParamsPersistent` — canUsePedal, canUseSDSU, openpilotLongitudinalControlDisabled
3. `LiveTorqueParameters` — hasAutoTune (useParams)
4. `FrogPilotToggles` — JSON blob with supplementary toggles
4. `StarPilotToggles` — JSON blob with supplementary toggles
**Update throttling:** 2.0s minimum interval between heavy param parsing
+12 -12
View File
@@ -12,7 +12,7 @@ using Car = import "car.capnp";
# DO rename the structs
# DON'T change the identifier (e.g. @0x81c2f05a394cf4af)
struct FrogPilotCarControl @0x81c2f05a394cf4af {
struct StarPilotCarControl @0x81c2f05a394cf4af {
hudControl @0 :HUDControl;
struct HUDControl {
@@ -51,7 +51,7 @@ struct FrogPilotCarControl @0x81c2f05a394cf4af {
}
}
struct FrogPilotCarParams @0xaedffd8f31e7b55d {
struct StarPilotCarParams @0xaedffd8f31e7b55d {
alternativeExperience @0 :Int16;
canUsePedal @1 :Bool;
canUseSDSU @2 :Bool;
@@ -65,7 +65,7 @@ struct FrogPilotCarParams @0xaedffd8f31e7b55d {
}
}
struct FrogPilotCarState @0xf35cc4560bbf6ec2 {
struct StarPilotCarState @0xf35cc4560bbf6ec2 {
accelPressed @0 :Bool;
alwaysOnLateralEnabled @1 :Bool;
brakeLights @2 :Bool;
@@ -84,12 +84,12 @@ struct FrogPilotCarState @0xf35cc4560bbf6ec2 {
gasStack @15 :Bool; # Compatibility with older StarPilot payloads
}
struct FrogPilotDeviceState @0xda96579883444c35 {
struct StarPilotDeviceState @0xda96579883444c35 {
freeSpace @0 :Int16;
usedSpace @1 :Int16;
}
struct FrogPilotModelDataV2 @0x80ae746ee2596b11 {
struct StarPilotModelDataV2 @0x80ae746ee2596b11 {
turnDirection @0 :TurnDirection;
enum TurnDirection {
@@ -99,7 +99,7 @@ struct FrogPilotModelDataV2 @0x80ae746ee2596b11 {
}
}
struct FrogPilotOnroadEvent @0xa5cd762cd951a455 {
struct StarPilotOnroadEvent @0xa5cd762cd951a455 {
name @0 :EventName;
enable @1 :Bool;
@@ -148,7 +148,7 @@ struct FrogPilotOnroadEvent @0xa5cd762cd951a455 {
}
}
struct FrogPilotPlan @0xf98d843bfd7004a3 {
struct StarPilotPlan @0xf98d843bfd7004a3 {
accelerationJerk @0 :Float32;
cscControllingSpeed @1 :Bool;
cscSpeed @2 :Float32;
@@ -159,8 +159,8 @@ struct FrogPilotPlan @0xf98d843bfd7004a3 {
experimentalMode @7 :Bool;
forcingStop @8 :Bool;
forcingStopLength @9 :Float32;
frogpilotEvents @10 :List(FrogPilotOnroadEvent);
frogpilotToggles @11 :Text;
starpilotEvents @10 :List(StarPilotOnroadEvent);
starpilotToggles @11 :Text;
increasedStoppedDistance @12 :Float32;
lateralCheck @13 :Bool;
laneWidthLeft @14 :Float32;
@@ -188,7 +188,7 @@ struct FrogPilotPlan @0xf98d843bfd7004a3 {
trackingLead @36 :Bool;
}
struct FrogPilotRadarState @0xb86e6369214c01c8 {
struct StarPilotRadarState @0xb86e6369214c01c8 {
leadLeft @0 :LeadData;
leadRight @1 :LeadData;
@@ -213,7 +213,7 @@ struct FrogPilotRadarState @0xb86e6369214c01c8 {
}
}
struct FrogPilotSelfdriveState @0xf416ec09499d9d19 {
struct StarPilotSelfdriveState @0xf416ec09499d9d19 {
alertText1 @0 :Text;
alertText2 @1 :Text;
alertStatus @2 :AlertStatus;
@@ -225,7 +225,7 @@ struct FrogPilotSelfdriveState @0xf416ec09499d9d19 {
normal @0;
userPrompt @1;
critical @2;
frogpilot @3;
starpilot @3;
}
enum AlertSize {
Binary file not shown.
Binary file not shown.
+9 -9
View File
@@ -2625,15 +2625,15 @@ struct Event {
# DO change the name of the field and struct
# DON'T change the ID (e.g. @107)
# DON'T change which struct it points to
frogpilotCarControl @107 :Custom.FrogPilotCarControl;
frogpilotCarParams @108 :Custom.FrogPilotCarParams;
frogpilotCarState @109 :Custom.FrogPilotCarState;
frogpilotDeviceState @110 :Custom.FrogPilotDeviceState;
frogpilotModelV2 @111 :Custom.FrogPilotModelDataV2;
frogpilotOnroadEvents @112 :List(Custom.FrogPilotOnroadEvent);
frogpilotPlan @113 :Custom.FrogPilotPlan;
frogpilotRadarState @114 :Custom.FrogPilotRadarState;
frogpilotSelfdriveState @115 :Custom.FrogPilotSelfdriveState;
starpilotCarControl @107 :Custom.StarPilotCarControl;
starpilotCarParams @108 :Custom.StarPilotCarParams;
starpilotCarState @109 :Custom.StarPilotCarState;
starpilotDeviceState @110 :Custom.StarPilotDeviceState;
starpilotModelV2 @111 :Custom.StarPilotModelDataV2;
starpilotOnroadEvents @112 :List(Custom.StarPilotOnroadEvent);
starpilotPlan @113 :Custom.StarPilotPlan;
starpilotRadarState @114 :Custom.StarPilotRadarState;
starpilotSelfdriveState @115 :Custom.StarPilotSelfdriveState;
customReserved9 @116 :Custom.CustomReserved9;
customReserved10 @136 :Custom.CustomReserved10;
customReserved11 @137 :Custom.CustomReserved11;
+3 -3
View File
@@ -197,7 +197,7 @@ class SubMaster:
self.data[s] = getattr(data.as_reader(), s)
self.freq_tracker[s] = FrequencyTracker(SERVICE_LIST[s].frequency, self.update_freq, s == poll)
# FrogPilot variables
# StarPilot variables
self.addr = addr
self.poll = poll
@@ -252,7 +252,7 @@ class SubMaster:
def all_checks(self, service_list: Optional[List[str]] = None) -> bool:
return self.all_alive(service_list) and self.all_freq_ok(service_list) and self.all_valid(service_list)
# FrogPilot variables
# StarPilot variables
def extend(self, new_services: List[str]):
return SubMaster(
self.services + new_services,
@@ -286,7 +286,7 @@ class PubMaster:
def all_readers_updated(self, s: str) -> bool:
return self.sock[s].all_readers_updated() # type: ignore
# FrogPilot variables
# StarPilot variables
def extend(self, new_services: List[str]):
for service in new_services:
if service not in self.sock:
Binary file not shown.
+9 -9
View File
@@ -83,15 +83,15 @@ static std::map<std::string, service> services = {
{ "customReservedRawData0", {"customReservedRawData0", true, 0.000000, -1, 256000}},
{ "customReservedRawData1", {"customReservedRawData1", true, 0.000000, -1, 256000}},
{ "customReservedRawData2", {"customReservedRawData2", true, 0.000000, -1, 256000}},
{ "frogpilotCarControl", {"frogpilotCarControl", true, 100.000000, 10, 256000}},
{ "frogpilotCarParams", {"frogpilotCarParams", true, 0.020000, 1, 256000}},
{ "frogpilotCarState", {"frogpilotCarState", true, 100.000000, 10, 256000}},
{ "frogpilotDeviceState", {"frogpilotDeviceState", true, 2.000000, 1, 256000}},
{ "frogpilotModelV2", {"frogpilotModelV2", true, 20.000000, -1, 256000}},
{ "frogpilotOnroadEvents", {"frogpilotOnroadEvents", true, 1.000000, 1, 256000}},
{ "frogpilotPlan", {"frogpilotPlan", true, 20.000000, 10, 256000}},
{ "frogpilotRadarState", {"frogpilotRadarState", true, 20.000000, 5, 256000}},
{ "frogpilotSelfdriveState", {"frogpilotSelfdriveState", true, 100.000000, 10, 256000}},
{ "starpilotCarControl", {"starpilotCarControl", true, 100.000000, 10, 256000}},
{ "starpilotCarParams", {"starpilotCarParams", true, 0.020000, 1, 256000}},
{ "starpilotCarState", {"starpilotCarState", true, 100.000000, 10, 256000}},
{ "starpilotDeviceState", {"starpilotDeviceState", true, 2.000000, 1, 256000}},
{ "starpilotModelV2", {"starpilotModelV2", true, 20.000000, -1, 256000}},
{ "starpilotOnroadEvents", {"starpilotOnroadEvents", true, 1.000000, 1, 256000}},
{ "starpilotPlan", {"starpilotPlan", true, 20.000000, 10, 256000}},
{ "starpilotRadarState", {"starpilotRadarState", true, 20.000000, 5, 256000}},
{ "starpilotSelfdriveState", {"starpilotSelfdriveState", true, 100.000000, 10, 256000}},
{ "mapdExtendedOut", {"mapdExtendedOut", true, 1.000000, 1, 2097152}},
{ "mapdIn", {"mapdIn", true, 1.000000, 1, 2097152}},
{ "mapdOut", {"mapdOut", true, 20.000000, 20, 2097152}},
+10 -10
View File
@@ -103,16 +103,16 @@ _services: dict[str, tuple] = {
"customReservedRawData1": (True, 0.),
"customReservedRawData2": (True, 0.),
# FrogPilot variables
"frogpilotCarControl": (True, 100., 10),
"frogpilotCarParams": (True, 0.02, 1),
"frogpilotCarState": (True, 100., 10),
"frogpilotDeviceState": (True, 2., 1),
"frogpilotModelV2": (True, 20.),
"frogpilotOnroadEvents": (True, 1., 1),
"frogpilotPlan": (True, 20., 10),
"frogpilotRadarState": (True, 20., 5),
"frogpilotSelfdriveState": (True, 100., 10),
# StarPilot variables
"starpilotCarControl": (True, 100., 10),
"starpilotCarParams": (True, 0.02, 1),
"starpilotCarState": (True, 100., 10),
"starpilotDeviceState": (True, 2., 1),
"starpilotModelV2": (True, 20.),
"starpilotOnroadEvents": (True, 1., 1),
"starpilotPlan": (True, 20., 10),
"starpilotRadarState": (True, 20., 5),
"starpilotSelfdriveState": (True, 100., 10),
"mapdExtendedOut": (True, 1., 1, QueueSize.MEDIUM),
"mapdIn": (True, 1., 1, QueueSize.MEDIUM),
"mapdOut": (True, 20., 20, QueueSize.MEDIUM),
+1 -1
View File
@@ -5,7 +5,7 @@ from datetime import datetime, timedelta, UTC
from openpilot.system.hardware.hw import Paths
from openpilot.system.version import get_version
from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server
from openpilot.starpilot.common.starpilot_utilities import use_konik_server
API_HOST = os.getenv('API_HOST', f"https://api.{'konik.ai' if use_konik_server() else 'commadotai.com'}")
+1 -1
View File
@@ -70,7 +70,7 @@ std::string resolve_program_path(const char *path) {
}
// Recover from build-path-embedded absolute paths like "/work/selfdrive/...".
for (const char *marker : {"/selfdrive/", "/frogpilot/", "/common/"}) {
for (const char *marker : {"/selfdrive/", "/starpilot/", "/common/"}) {
if (const size_t idx = resolved_path.find(marker); idx != std::string::npos) {
const std::string candidate = basedir + "/" + resolved_path.substr(idx + 1);
if (util::file_exists(candidate)) {
+1 -1
View File
@@ -19,7 +19,7 @@ class CV:
# Mass
LB_TO_KG = 0.453592
# FrogPilot variables
# StarPilot variables
METER_TO_FOOT = 3.28084
FOOT_TO_METER = 1. / METER_TO_FOOT
CM_TO_INCH = 1. / 2.54
Binary file not shown.
+4 -4
View File
@@ -94,7 +94,7 @@ private:
Params::Params(const std::string &path, bool memory) {
params_prefix = "/" + util::getenv("OPENPILOT_PREFIX", "d");
// FrogPilot variables
// StarPilot variables
std::string params_folder;
if (memory) {
params_folder = Path::shm_path() + "/params";
@@ -179,7 +179,7 @@ int Params::remove(const std::string &key) {
FileLock file_lock(params_path + "/.lock");
int result = unlink(getParamPath(key).c_str());
// FrogPilot variables
// StarPilot variables
if (!cache_path.empty()) {
unlink((cache_path + key).c_str());
}
@@ -231,7 +231,7 @@ void Params::clearAll(ParamKeyFlag key_flag) {
if (it == keys.end() || (it->second.flags & key_flag)) {
unlink(getParamPath(de->d_name).c_str());
// FrogPilot variables
// StarPilot variables
if (!cache_path.empty()) {
unlink((cache_path + de->d_name).c_str());
}
@@ -261,7 +261,7 @@ void Params::asyncWriteThread() {
}
}
// FrogPilot variables
// StarPilot variables
int Params::getTuningLevel(const std::string &key) {
return keys[key].tuning_level;
}
+3 -3
View File
@@ -36,7 +36,7 @@ struct ParamKeyAttributes {
ParamKeyType type;
std::optional<std::string> default_value = std::nullopt;
// FrogPilot variables
// StarPilot variables
std::optional<std::string> stock_value = std::nullopt;
int tuning_level = 0;
@@ -83,7 +83,7 @@ public:
putNonBlocking(key, val ? "1" : "0");
}
// FrogPilot variables
// StarPilot variables
int getInt(const std::string &key, bool block = false) {
std::string value = get(key, block);
return value.empty() ? 0 : std::stoi(value);
@@ -122,6 +122,6 @@ private:
std::future<void> future;
SafeQueue<std::pair<std::string, std::string>> queue;
// FrogPilot variables
// StarPilot variables
std::string cache_path;
};
+7 -7
View File
@@ -135,7 +135,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"UptimeOnroad", {PERSISTENT, FLOAT, "0.0"}},
{"Version", {PERSISTENT, STRING}},
// FrogPilot variables
// StarPilot variables
{"AccelerationPath", {PERSISTENT, BOOL, "1", "0", 2}},
{"AccelerationProfile", {PERSISTENT, INT, "2", "0", 0}},
{"AdjacentLeadsUI", {PERSISTENT, BOOL, "1", "0", 3}},
@@ -261,12 +261,12 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"ForceStops", {PERSISTENT, BOOL, "0", "0", 2}},
{"ForceTorqueController", {PERSISTENT, BOOL, "0", "0", 3}},
{"FPSCounter", {PERSISTENT, BOOL, "1", "0", 3}},
{"FrogPilotApiToken", {PERSISTENT | DONT_LOG, STRING, "", "", 0}},
{"FrogPilotCarParams", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BYTES, "", ""}},
{"FrogPilotCarParamsPersistent", {PERSISTENT, BYTES, "", ""}},
{"FrogPilotDongleId", {PERSISTENT | DONT_LOG, STRING, "", "", 0}},
{"FrogPilotStats", {PERSISTENT | DONT_LOG, JSON, "{}", "{}"}},
{"FrogPilotTogglesUpdated", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}},
{"StarPilotApiToken", {PERSISTENT | DONT_LOG, STRING, "", "", 0}},
{"StarPilotCarParams", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BYTES, "", ""}},
{"StarPilotCarParamsPersistent", {PERSISTENT, BYTES, "", ""}},
{"StarPilotDongleId", {PERSISTENT | DONT_LOG, STRING, "", "", 0}},
{"StarPilotStats", {PERSISTENT | DONT_LOG, JSON, "{}", "{}"}},
{"StarPilotTogglesUpdated", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}},
{"FrogsGoMoosTweak", {PERSISTENT, BOOL, "1", "0", 2}},
{"GoatScream", {PERSISTENT, BOOL, "0", "0", 1}},
{"GreenLightAlert", {PERSISTENT, BOOL, "0", "0", 0}},
+9 -9
View File
@@ -6097,7 +6097,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com
* def __cinit__(self, d="", *, memory=False, return_defaults=False):
* cdef string path = <string>d.encode() # <<<<<<<<<<<<<<
*
* # FrogPilot variables
* # StarPilot variables
*/
__pyx_t_2 = __pyx_v_d;
__Pyx_INCREF(__pyx_t_2);
@@ -6115,7 +6115,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com
/* "common/params_pyx.pyx":119
*
* # FrogPilot variables
* # StarPilot variables
* cdef bool c_memory = memory # <<<<<<<<<<<<<<
*
* with nogil:
@@ -6182,7 +6182,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com
* self.p = new c_Params(path, c_memory)
* self.d = d # <<<<<<<<<<<<<<
*
* # FrogPilot variables
* # StarPilot variables
*/
__pyx_t_1 = __pyx_v_d;
__Pyx_INCREF(__pyx_t_1);
@@ -6195,7 +6195,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com
/* "common/params_pyx.pyx":126
*
* # FrogPilot variables
* # StarPilot variables
* self.m = memory # <<<<<<<<<<<<<<
*
* self.return_defaults = return_defaults or memory
@@ -10127,7 +10127,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_38cpp2python(struct __pyx
* cdef ParamKeyType t = self.p.getKeyType(k)
* return self._cpp2python(t, value, None, key) # <<<<<<<<<<<<<<
*
* # FrogPilot variables
* # StarPilot variables
*/
__Pyx_XDECREF(__pyx_r);
__pyx_t_2 = ((PyObject *)__pyx_v_self);
@@ -10170,7 +10170,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_38cpp2python(struct __pyx
/* "common/params_pyx.pyx":245
*
* # FrogPilot variables
* # StarPilot variables
* def get_key_flag(self, key): # <<<<<<<<<<<<<<
* return self.p.getKeyFlag(self.check_key(key))
*
@@ -10274,7 +10274,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_40get_key_flag(struct __p
__Pyx_RefNannySetupContext("get_key_flag", 0);
/* "common/params_pyx.pyx":246
* # FrogPilot variables
* # StarPilot variables
* def get_key_flag(self, key):
* return self.p.getKeyFlag(self.check_key(key)) # <<<<<<<<<<<<<<
*
@@ -10301,7 +10301,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_40get_key_flag(struct __p
/* "common/params_pyx.pyx":245
*
* # FrogPilot variables
* # StarPilot variables
* def get_key_flag(self, key): # <<<<<<<<<<<<<<
* return self.p.getKeyFlag(self.check_key(key))
*
@@ -12347,7 +12347,7 @@ __Pyx_RefNannySetupContext("PyInit_params_pyx", 0);
/* "common/params_pyx.pyx":245
*
* # FrogPilot variables
* # StarPilot variables
* def get_key_flag(self, key): # <<<<<<<<<<<<<<
* return self.p.getKeyFlag(self.check_key(key))
*
+6 -6
View File
@@ -20,7 +20,7 @@ cdef extern from "common/params.h":
CLEAR_ON_IGNITION_ON
ALL
# FrogPilot variables
# StarPilot variables
DONT_LOG
cpdef enum ParamKeyType:
@@ -48,7 +48,7 @@ cdef extern from "common/params.h":
void clearAll(ParamKeyFlag)
vector[string] allKeys()
# FrogPilot variables
# StarPilot variables
ParamKeyFlag getKeyFlag(string) nogil
optional[string] getStockValue(string) nogil
@@ -108,21 +108,21 @@ cdef class Params:
cdef c_Params* p
cdef str d
# FrogPilot variables
# StarPilot variables
cdef bool m
cdef bool return_defaults
def __cinit__(self, d="", *, memory=False, return_defaults=False):
cdef string path = <string>d.encode()
# FrogPilot variables
# StarPilot variables
cdef bool c_memory = memory
with nogil:
self.p = new c_Params(path, c_memory)
self.d = d
# FrogPilot variables
# StarPilot variables
self.m = memory
self.return_defaults = return_defaults or memory
@@ -241,7 +241,7 @@ cdef class Params:
cdef ParamKeyType t = self.p.getKeyType(k)
return self._cpp2python(t, value, None, key)
# FrogPilot variables
# StarPilot variables
def get_key_flag(self, key):
return self.p.getKeyFlag(self.check_key(key))
Binary file not shown.
+1 -1
View File
@@ -37,7 +37,7 @@ const double MS_TO_MPH = MS_TO_KPH * KM_TO_MILE;
const double METER_TO_MILE = KM_TO_MILE / 1000.0;
const double METER_TO_FOOT = 3.28084;
// FrogPilot variables
// StarPilot variables
const double FOOT_TO_METER = 1. / METER_TO_FOOT;
const double CM_TO_INCH = 1. / 2.54;
const double INCH_TO_CM = 1. / CM_TO_INCH;
+4 -4
View File
@@ -17,7 +17,7 @@ For the full StarPilot branch workflow, including host-native shorthand tools su
Fast path (no physical comma):
```bash
cd /path/to/frogpilot
cd /path/to/starpilot
scripts/laptop_device_build.sh setup
```
@@ -30,7 +30,7 @@ scripts/starpilot_build_flow.sh laptop-setup
### Option A: no physical comma (AGNOS-based)
```bash
cd /path/to/frogpilot
cd /path/to/starpilot
scripts/laptop_device_build.sh build-image
scripts/laptop_device_build.sh setup-sysroot-agnos
```
@@ -38,7 +38,7 @@ scripts/laptop_device_build.sh setup-sysroot-agnos
### Option B: copy sysroot from a comma device
```bash
cd /path/to/frogpilot
cd /path/to/starpilot
scripts/laptop_device_build.sh setup-sysroot <device-ip> comma 22
scripts/laptop_device_build.sh build-image
```
@@ -52,7 +52,7 @@ scripts/laptop_device_build.sh setup <device-ip> comma 22
## Build device-compatible artifacts
```bash
cd /path/to/frogpilot
cd /path/to/starpilot
scripts/laptop_device_build.sh build
```
-203
View File
@@ -1,203 +0,0 @@
#!/usr/bin/env python3
import json
import cereal.messaging as messaging
from openpilot.common.constants import CV
from openpilot.common.filter_simple import FirstOrderFilter
from openpilot.common.gps import get_gps_location_service
from openpilot.common.params import Params
from openpilot.common.realtime import DT_MDL
from openpilot.selfdrive.car.cruise import V_CRUISE_MAX, V_CRUISE_UNSET
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import A_CHANGE_COST, DANGER_ZONE_COST, J_EGO_COST, STOP_DISTANCE
from openpilot.frogpilot.common.frogpilot_utilities import calculate_lane_width, calculate_road_curvature
from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, MINIMUM_LATERAL_ACCELERATION, PLANNER_TIME, THRESHOLD
from openpilot.frogpilot.controls.lib.conditional_experimental_mode import ConditionalExperimentalMode
from openpilot.frogpilot.controls.lib.frogpilot_acceleration import FrogPilotAcceleration
from openpilot.frogpilot.controls.lib.frogpilot_events import FrogPilotEvents
from openpilot.frogpilot.controls.lib.frogpilot_following import FrogPilotFollowing
from openpilot.frogpilot.controls.lib.frogpilot_vcruise import FrogPilotVCruise
from openpilot.frogpilot.controls.lib.weather_checker import WeatherChecker
class FrogPilotPlanner:
def __init__(self, error_log, ThemeManager):
self.params = Params(return_defaults=True)
self.params_memory = Params(memory=True)
self.frogpilot_acceleration = FrogPilotAcceleration(self)
self.frogpilot_cem = ConditionalExperimentalMode(self)
self.frogpilot_events = FrogPilotEvents(self, error_log, ThemeManager)
self.frogpilot_following = FrogPilotFollowing(self)
self.frogpilot_vcruise = FrogPilotVCruise(self)
self.frogpilot_weather = WeatherChecker(self)
self.driving_in_curve = False
self.gps_valid = False
self.lateral_check = False
self.model_stopped = False
self.road_curvature_detected = False
self.tracking_lead = False
self.lane_width_left = 0
self.lane_width_right = 0
self.lateral_acceleration = 0
self.model_length = 0
self.road_curvature = 0
self.time_to_curve = 0
self.v_cruise = 0
self.gps_position = None
self.gps_location_service = get_gps_location_service(self.params)
self.tracking_lead_filter = FirstOrderFilter(0, 0.5, DT_MDL)
def shutdown(self):
self.frogpilot_vcruise.slc.executor.shutdown(wait=False, cancel_futures=True)
self.frogpilot_weather.executor.shutdown(wait=False, cancel_futures=True)
def update(self, now, time_validated, sm, frogpilot_toggles):
self.lead_one = sm["radarState"].leadOne
controls_enabled = sm["selfdriveState"].enabled
v_cruise_kph = min(sm["carState"].vCruise, V_CRUISE_MAX)
if 0 < v_cruise_kph < V_CRUISE_UNSET and frogpilot_toggles.set_speed_offset > 0:
v_cruise_kph += frogpilot_toggles.set_speed_offset
v_cruise = v_cruise_kph * CV.KPH_TO_MS
v_ego = max(sm["carState"].vEgo, 0)
if controls_enabled:
self.frogpilot_acceleration.update(v_ego, sm, frogpilot_toggles)
else:
self.frogpilot_acceleration.max_accel = 0
self.frogpilot_acceleration.min_accel = 0
if controls_enabled and frogpilot_toggles.conditional_experimental_mode:
self.frogpilot_cem.update(v_ego, sm, frogpilot_toggles)
else:
self.frogpilot_cem.curve_detected = False
self.frogpilot_cem.stop_sign_and_light(v_ego, sm, PLANNER_TIME - 2)
self.driving_in_curve = abs(self.lateral_acceleration) >= MINIMUM_LATERAL_ACCELERATION
self.frogpilot_events.update(controls_enabled, v_cruise, sm, frogpilot_toggles)
self.frogpilot_following.update(controls_enabled, v_ego, sm, frogpilot_toggles)
gps_location = sm[self.gps_location_service]
self.gps_position = {
"latitude": gps_location.latitude,
"longitude": gps_location.longitude,
"bearing": gps_location.bearingDeg,
}
self.gps_valid = self.gps_position["latitude"] != 0 or self.gps_position["longitude"] != 0
self.params_memory.put("LastGPSPosition", json.dumps(self.gps_position))
if v_ego >= frogpilot_toggles.minimum_lane_change_speed:
self.lane_width_left = calculate_lane_width(sm["modelV2"].laneLines[0], sm["modelV2"].laneLines[1], sm["modelV2"].roadEdges[0])
self.lane_width_right = calculate_lane_width(sm["modelV2"].laneLines[3], sm["modelV2"].laneLines[2], sm["modelV2"].roadEdges[1])
else:
self.lane_width_left = 0
self.lane_width_right = 0
self.lateral_acceleration = v_ego**2 * sm["controlsState"].curvature
self.lateral_check = v_ego >= frogpilot_toggles.pause_lateral_below_speed
self.lateral_check |= not (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and frogpilot_toggles.pause_lateral_below_signal
self.lateral_check |= sm["carState"].standstill
self.lateral_check &= not sm["frogpilotCarState"].pauseLateral
self.model_length = sm["modelV2"].position.x[-1]
self.model_stopped = self.model_length < CRUISING_SPEED * PLANNER_TIME
self.model_stopped |= self.frogpilot_vcruise.forcing_stop
self.road_curvature, self.time_to_curve = calculate_road_curvature(sm["modelV2"])
self.road_curvature_detected = (1 / abs(self.road_curvature))**0.5 < v_ego > CRUISING_SPEED and not (sm["carState"].leftBlinker or sm["carState"].rightBlinker)
if not sm["carState"].standstill:
self.tracking_lead = self.update_lead_status(frogpilot_toggles.stop_distance)
self.v_cruise = self.frogpilot_vcruise.update(controls_enabled, now, time_validated, v_cruise, v_ego, sm, frogpilot_toggles)
if self.gps_valid and time_validated and frogpilot_toggles.weather_presets:
self.frogpilot_weather.update_weather(now, frogpilot_toggles)
else:
self.frogpilot_weather.weather_id = 0
def update_lead_status(self, stop_distance=STOP_DISTANCE):
following_lead = self.lead_one.status
following_lead &= self.lead_one.dRel < self.model_length + max(float(stop_distance), 4.0)
self.tracking_lead_filter.update(following_lead)
return self.tracking_lead_filter.x >= THRESHOLD
def publish(self, theme_updated, sm, pm, frogpilot_toggles):
frogpilot_plan_send = messaging.new_message("frogpilotPlan")
frogpilot_plan_send.valid = sm.all_checks(service_list=["carState", "controlsState", "selfdriveState", "radarState"])
frogpilotPlan = frogpilot_plan_send.frogpilotPlan
frogpilotPlan.accelerationJerk = float(A_CHANGE_COST * self.frogpilot_following.acceleration_jerk)
frogpilotPlan.dangerFactor = float(self.frogpilot_following.danger_factor)
frogpilotPlan.dangerJerk = float(DANGER_ZONE_COST * self.frogpilot_following.danger_jerk)
frogpilotPlan.speedJerk = float(J_EGO_COST * self.frogpilot_following.speed_jerk)
frogpilotPlan.tFollow = float(self.frogpilot_following.t_follow)
frogpilotPlan.cscControllingSpeed = self.frogpilot_vcruise.csc_controlling_speed
frogpilotPlan.cscSpeed = float(self.frogpilot_vcruise.csc_target)
frogpilotPlan.cscTraining = self.frogpilot_vcruise.csc.enable_training
frogpilotPlan.desiredFollowDistance = int(self.frogpilot_following.desired_follow_distance)
frogpilotPlan.disableThrottle = self.frogpilot_following.disable_throttle
frogpilotPlan.trackingLead = self.tracking_lead
frogpilotPlan.experimentalMode = self.frogpilot_cem.experimental_mode or self.frogpilot_vcruise.slc.experimental_mode
frogpilotPlan.forcingStop = self.frogpilot_vcruise.forcing_stop
frogpilotPlan.forcingStopLength = self.frogpilot_vcruise.tracked_model_length
frogpilotPlan.frogpilotEvents = self.frogpilot_events.events.to_msg()
frogpilotPlan.frogpilotToggles = json.dumps(vars(frogpilot_toggles))
if sm["frogpilotCarState"].trafficModeEnabled:
frogpilotPlan.increasedStoppedDistance = 0
else:
frogpilotPlan.increasedStoppedDistance = frogpilot_toggles.increase_stopped_distance
if self.frogpilot_weather.weather_id != 0:
frogpilotPlan.increasedStoppedDistance += self.frogpilot_weather.increase_stopped_distance
frogpilotPlan.laneWidthLeft = self.lane_width_left
frogpilotPlan.laneWidthRight = self.lane_width_right
frogpilotPlan.lateralCheck = self.lateral_check
frogpilotPlan.maxAcceleration = float(self.frogpilot_acceleration.max_accel)
frogpilotPlan.minAcceleration = float(self.frogpilot_acceleration.min_accel)
frogpilotPlan.redLight = self.frogpilot_cem.stop_light_detected
frogpilotPlan.roadCurvature = self.road_curvature
frogpilotPlan.slcMapSpeedLimit = self.frogpilot_vcruise.slc.map_speed_limit
frogpilotPlan.slcMapboxSpeedLimit = self.frogpilot_vcruise.slc.mapbox_limit
frogpilotPlan.slcNextSpeedLimit = self.frogpilot_vcruise.slc.next_speed_limit
frogpilotPlan.slcOverriddenSpeed = self.frogpilot_vcruise.slc.overridden_speed
frogpilotPlan.slcSpeedLimit = self.frogpilot_vcruise.slc_target
frogpilotPlan.slcSpeedLimitOffset = self.frogpilot_vcruise.slc_offset
frogpilotPlan.slcSpeedLimitSource = self.frogpilot_vcruise.slc.source
frogpilotPlan.speedLimitChanged = self.frogpilot_vcruise.slc.speed_limit_changed_timer > DT_MDL
frogpilotPlan.unconfirmedSlcSpeedLimit = self.frogpilot_vcruise.slc.unconfirmed_speed_limit
frogpilotPlan.themeUpdated = theme_updated
frogpilotPlan.vCruise = float(self.v_cruise)
frogpilotPlan.weatherDaytime = self.frogpilot_weather.is_daytime
frogpilotPlan.weatherId = self.frogpilot_weather.weather_id
pm.send("frogpilotPlan", frogpilot_plan_send)
-175
View File
@@ -1,175 +0,0 @@
#!/usr/bin/env python3
from openpilot.common.constants import CV
from openpilot.common.realtime import DT_MDL
from openpilot.selfdrive.car.cruise import V_CRUISE_MAX
from openpilot.selfdrive.selfdrived.events import FROGPILOT_EVENT_NAME
from openpilot.selfdrive.selfdrived.selfdrived import LONGITUDINAL_PERSONALITY_MAP, State
from openpilot.selfdrive.selfdrived.state import ACTIVE_STATES
from openpilot.selfdrive.ui.soundd import FrogPilotAudibleAlert
from openpilot.frogpilot.common.frogpilot_utilities import clean_model_name
from openpilot.frogpilot.controls.lib.frogpilot_events import RANDOM_EVENT_END, RANDOM_EVENT_START
from openpilot.frogpilot.controls.lib.weather_checker import WEATHER_CATEGORIES
class FrogPilotTracking:
def __init__(self, frogpilot_planner, frogpilot_toggles):
self.params = frogpilot_planner.params
self.frogpilot_events = frogpilot_planner.frogpilot_events
self.frogpilot_weather = frogpilot_planner.frogpilot_weather
self.frogpilot_stats = self.params.get("FrogPilotStats")
self.frogpilot_stats.pop("CurrentMonthsKilometers", None)
self.frogpilot_stats.pop("ResetStats", None)
self.drive_added = False
self.previously_enabled = False
self.distance_since_override = 0
self.tracked_time = 0
self.previous_random_events = set()
self.previous_alert = None
self.previous_sound = FrogPilotAudibleAlert.none
self.previous_state = State.disabled
self.model_name = clean_model_name(frogpilot_toggles.model_name)
def update(self, now, time_validated, sm, frogpilot_toggles):
v_cruise = min(sm["carState"].vCruiseCluster, V_CRUISE_MAX) * CV.KPH_TO_MS
v_ego = max(sm["carState"].vEgo, 0)
distance_driven = v_ego * DT_MDL
self.previously_enabled |= sm["selfdriveState"].enabled or sm["frogpilotCarState"].alwaysOnLateralEnabled
self.tracked_time += DT_MDL
if sm["selfdriveState"].alertType not in (self.previous_alert, ""):
alert_name = sm["selfdriveState"].alertType.split('/')[0]
total_events = self.frogpilot_stats.get("TotalEvents", {})
total_events[alert_name] = total_events.get(alert_name, 0) + 1
self.frogpilot_stats["TotalEvents"] = total_events
self.previous_alert = sm["selfdriveState"].alertType
if sm["selfdriveState"].enabled:
key = str(round(v_cruise, 2))
total_cruise_speed_times = self.frogpilot_stats.get("CruiseSpeedTimes", {})
total_cruise_speed_times[key] = total_cruise_speed_times.get(key, 0) + DT_MDL
self.frogpilot_stats["CruiseSpeedTimes"] = total_cruise_speed_times
self.frogpilot_stats["CurrentMonthsMeters"] = self.frogpilot_stats.get("CurrentMonthsMeters", 0) + distance_driven
if self.frogpilot_weather.sunrise != 0 and self.frogpilot_weather.sunset != 0:
if self.frogpilot_weather.is_daytime:
self.frogpilot_stats["DayTime"] = self.frogpilot_stats.get("DayTime", 0) + DT_MDL
else:
self.frogpilot_stats["NightTime"] = self.frogpilot_stats.get("NightTime", 0) + DT_MDL
if sm["selfdriveState"].state != self.previous_state:
if sm["selfdriveState"].state in ACTIVE_STATES and self.previous_state not in ACTIVE_STATES:
self.frogpilot_stats["Engages"] = self.frogpilot_stats.get("Engages", 0) + 1
if frogpilot_toggles.sound_pack == "frog":
self.frogpilot_stats["FrogChirps"] = self.frogpilot_stats.get("FrogChirps", 0) + 1
elif sm["selfdriveState"].state == State.disabled and self.previous_state in ACTIVE_STATES:
self.frogpilot_stats["Disengages"] = self.frogpilot_stats.get("Disengages", 0) + 1
if frogpilot_toggles.sound_pack == "frog":
self.frogpilot_stats["FrogSqueaks"] = self.frogpilot_stats.get("FrogSqueaks", 0) + 1
if sm["selfdriveState"].state == State.overriding and self.previous_state != State.overriding:
self.frogpilot_stats["Overrides"] = self.frogpilot_stats.get("Overrides", 0) + 1
self.previous_state = sm["selfdriveState"].state
if sm["selfdriveState"].experimentalMode:
self.frogpilot_stats["ExperimentalModeTime"] = self.frogpilot_stats.get("ExperimentalModeTime", 0) + DT_MDL
self.frogpilot_stats["FrogPilotMeters"] = self.frogpilot_stats.get("FrogPilotMeters", 0) + distance_driven
if sm["frogpilotSelfdriveState"].alertSound != self.previous_sound:
if sm["frogpilotSelfdriveState"].alertSound == FrogPilotAudibleAlert.goat:
self.frogpilot_stats["GoatScreams"] = self.frogpilot_stats.get("GoatScreams", 0) + 1
self.previous_sound = sm["frogpilotSelfdriveState"].alertSound
self.frogpilot_stats["MaxAcceleration"] = max(self.frogpilot_events.max_acceleration, self.frogpilot_stats.get("MaxAcceleration", 0))
if sm["carControl"].latActive:
self.frogpilot_stats["LateralTime"] = self.frogpilot_stats.get("LateralTime", 0) + DT_MDL
if sm["carControl"].longActive:
self.frogpilot_stats["LongitudinalTime"] = self.frogpilot_stats.get("LongitudinalTime", 0) + DT_MDL
personality_name = LONGITUDINAL_PERSONALITY_MAP.get(sm["selfdriveState"].personality, "Unknown").capitalize()
total_personality_times = self.frogpilot_stats.get("PersonalityTimes", {})
total_personality_times[personality_name] = total_personality_times.get(personality_name, 0) + DT_MDL
self.frogpilot_stats["PersonalityTimes"] = total_personality_times
elif sm["frogpilotCarState"].alwaysOnLateralEnabled:
self.frogpilot_stats["AOLTime"] = self.frogpilot_stats.get("AOLTime", 0) + DT_MDL
if sm["selfdriveState"].state in (State.disabled, State.overriding):
self.distance_since_override = 0
self.frogpilot_stats["OverrideTime"] = self.frogpilot_stats.get("OverrideTime", 0) + DT_MDL
else:
self.distance_since_override += distance_driven
self.frogpilot_stats["LongestDistanceWithoutOverride"] = max(self.distance_since_override, self.frogpilot_stats.get("LongestDistanceWithoutOverride", 0))
current_random_events = {event for event in self.frogpilot_events.events.names if RANDOM_EVENT_START <= event <= RANDOM_EVENT_END}
if len(current_random_events) > 0:
new_events = current_random_events - self.previous_random_events
if new_events:
total_random_events = self.frogpilot_stats.get("RandomEvents", {})
for event in new_events:
event_name = FROGPILOT_EVENT_NAME[event]
total_random_events[event_name] = total_random_events.get(event_name, 0) + 1
self.frogpilot_stats["RandomEvents"] = total_random_events
self.previous_random_events = current_random_events
if sm["carState"].standstill:
self.frogpilot_stats["StandstillTime"] = self.frogpilot_stats.get("StandstillTime", 0) + DT_MDL
if self.frogpilot_events.stopped_for_light:
self.frogpilot_stats["StopLightTime"] = self.frogpilot_stats.get("StopLightTime", 0) + DT_MDL
weather_api_calls = self.frogpilot_stats.get("WeatherAPICalls", {})
weather_api_calls["2.5"] = weather_api_calls.get("2.5", 0) + self.frogpilot_weather.api_25_calls
weather_api_calls["3.0"] = weather_api_calls.get("3.0", 0) + self.frogpilot_weather.api_3_calls
self.frogpilot_stats["WeatherAPICalls"] = weather_api_calls
self.frogpilot_weather.api_25_calls = 0
self.frogpilot_weather.api_3_calls = 0
suffix = "unknown"
for category in WEATHER_CATEGORIES.values():
if any(start <= self.frogpilot_weather.weather_id <= end for start, end in category["ranges"]):
suffix = category["suffix"]
break
weather_times = self.frogpilot_stats.get("WeatherTimes", {})
weather_times[suffix] = weather_times.get(suffix, 0) + DT_MDL
self.frogpilot_stats["WeatherTimes"] = weather_times
if self.tracked_time >= 60 and sm["carState"].standstill and self.previously_enabled:
if time_validated:
current_month = now.month
if current_month != self.frogpilot_stats.get("Month"):
self.frogpilot_stats.update({
"CurrentMonthsMeters": 0,
"Month": current_month
})
self.frogpilot_stats["FrogPilotSeconds"] = self.frogpilot_stats.get("FrogPilotSeconds", 0) + self.tracked_time
current_model = self.model_name
total_model_times = self.frogpilot_stats.get("ModelTimes", {})
total_model_times[current_model] = total_model_times.get(current_model, 0) + self.tracked_time
self.frogpilot_stats["ModelTimes"] = total_model_times
self.frogpilot_stats["TrackedTime"] = self.frogpilot_stats.get("TrackedTime", 0) + self.tracked_time
self.tracked_time = 0
if not self.drive_added:
self.frogpilot_stats["FrogPilotDrives"] = self.frogpilot_stats.get("FrogPilotDrives", 0) + 1
self.drive_added = True
self.params.put_nonblocking("FrogPilotStats", dict(sorted(self.frogpilot_stats.items())))
-23
View File
@@ -1,23 +0,0 @@
#pragma once
#include "frogpilot/ui/qt/offroad/frogpilot_settings.h"
class FrogPilotDataPanel : public FrogPilotListWidget {
Q_OBJECT
public:
explicit FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false);
signals:
void openSubPanel();
private:
void updateStatsLabels(FrogPilotListWidget *labelsList);
bool forceOpenDescriptions;
bool isMetric;
FrogPilotSettingsWindow *parent;
Params params;
};
-369
View File
@@ -1,369 +0,0 @@
#include "frogpilot/ui/qt/offroad/utilities.h"
FrogPilotUtilitiesPanel::FrogPilotUtilitiesPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) {
networkManager = new QNetworkAccessManager(this);
pairingPollTimer = new QTimer(this);
forceOpenDescriptions = forceOpen;
ParamControl *debugModeToggle = new ParamControl("DebugMode", tr("Debug Mode"), tr("<b>Use all of FrogPilot's developer metrics on your next drive</b> to diagnose issues and improve bug reports."), "");
if (forceOpenDescriptions) {
debugModeToggle->showDescription();
}
addItem(debugModeToggle);
ButtonControl *flashPandaButton = new ButtonControl(tr("Flash Panda"), tr("FLASH"), tr("<b>Flash the latest, official firmware onto your Panda device</b> to restore core functionality, fix bugs, or ensure you have the most up-to-date software."));
QObject::connect(flashPandaButton, &ButtonControl::clicked, [parent, flashPandaButton, this]() {
if (ConfirmationDialog::confirm(tr("Are you sure you want to flash the Panda firmware?"), tr("Flash"), this)) {
std::thread([parent, flashPandaButton, this]() {
parent->keepScreenOn = true;
flashPandaButton->setEnabled(false);
flashPandaButton->setValue(tr("Flashing..."));
params_memory.putBool("FlashPanda", true);
while (params_memory.getBool("FlashPanda")) {
util::sleep_for(UI_FREQ);
}
flashPandaButton->setValue(tr("Flashed!"));
util::sleep_for(2500);
flashPandaButton->setValue(tr("Rebooting..."));
util::sleep_for(2500);
Hardware::reboot();
}).detach();
}
});
if (forceOpenDescriptions) {
flashPandaButton->showDescription();
}
addItem(flashPandaButton);
FrogPilotButtonsControl *forceStartedButton = new FrogPilotButtonsControl(tr("Force Drive State"), tr("<b>Force openpilot to be offroad or onroad.</b>"), "", {tr("OFFROAD"), tr("ONROAD"), tr("OFF")}, true);
QObject::connect(forceStartedButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) {
if (id == 0) {
params.putBool("ForceOffroad", true);
params.putBool("ForceOnroad", false);
updateFrogPilotToggles();
} else if (id == 1) {
params.put("CarParams", params.get("CarParamsPersistent"));
params.put("FrogPilotCarParams", params.get("FrogPilotCarParamsPersistent"));
params.putBool("ForceOffroad", false);
params.putBool("ForceOnroad", true);
updateFrogPilotToggles();
} else if (id == 2) {
params.putBool("ForceOffroad", false);
params.putBool("ForceOnroad", false);
updateFrogPilotToggles();
}
});
forceStartedButton->setCheckedButton(2);
if (forceOpenDescriptions) {
forceStartedButton->showDescription();
}
addItem(forceStartedButton);
bool paired = params.getBool("PondPaired");
pondButton = new ButtonControl(
tr("Pair to \"The Pond\""),
paired ? tr("UNPAIR") : tr("PAIR"),
tr("<b>Pair this device with your frogpilot.com account</b> to remotely manage settings from anywhere.")
);
QObject::connect(pondButton, &ButtonControl::clicked, [this]() {
if (!frogpilotUIState()->frogpilot_scene.online) {
ConfirmationDialog::alert(tr("Please connect to the internet first!"), this);
return;
}
bool isPaired = params.getBool("PondPaired");
if (isPaired && !ConfirmationDialog::confirm(tr("Are you sure you want to unpair from \"The Pond\"?"), tr("Unpair"), this)) {
return;
}
pondButton->setEnabled(false);
pondButton->setValue(isPaired ? tr("Unpairing...") : tr("Requesting code..."));
QJsonObject payload;
payload["api_token"] = QString::fromStdString(params.get("FrogPilotApiToken"));
payload["device"] = QString::fromStdString(Hardware::get_name()).trimmed().remove(QChar('\0'));
payload["frogpilot_dongle_id"] = QString::fromStdString(params.get("FrogPilotDongleId"));
QString buildMetadataStr = QString::fromStdString(params.get("BuildMetadata"));
if (!buildMetadataStr.isEmpty()) {
QJsonDocument bmDoc = QJsonDocument::fromJson(buildMetadataStr.toUtf8());
if (!bmDoc.isNull()) {
payload["build_metadata"] = bmDoc.object();
}
}
QNetworkRequest request(QUrl(QString("https://www.frogpilot.com/api/pond/pair/") + (isPaired ? "unpair" : "request")));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("User-Agent", "frogpilot-api/1.0");
QByteArray postData = QJsonDocument(payload).toJson(QJsonDocument::Compact);
QNetworkReply *reply = networkManager->post(request, postData);
QObject::connect(reply, &QNetworkReply::finished, [this, reply, isPaired, payload]() {
QByteArray responseBody = reply->readAll();
reply->deleteLater();
pondButton->setEnabled(true);
pondButton->setValue("");
if (reply->error() != QNetworkReply::NoError) {
QString errorDetail;
QString serverError = QJsonDocument::fromJson(responseBody).object().value("error").toString();
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode == 401) {
errorDetail = tr("Authentication failed. Please restart your device.");
} else if (statusCode == 403) {
errorDetail = serverError.contains("build", Qt::CaseInsensitive)
? tr("Unofficial or modified build detected.")
: tr("Access denied: %1").arg(serverError);
} else if (statusCode == 429) {
errorDetail = tr("Too many attempts. Please wait and try again.");
} else if (statusCode == 503) {
errorDetail = tr("Server is temporarily unavailable. Please try again later.");
} else if (statusCode > 0) {
errorDetail = tr("Server error (%1): %2").arg(statusCode).arg(serverError.isEmpty() ? tr("Unknown error") : serverError);
} else {
errorDetail = tr("Network error: %1").arg(reply->errorString());
}
if (isPaired) {
pondButton->setValue(tr("Failed to unpair"));
QTimer::singleShot(2500, [this]() {
pondButton->setValue("");
});
} else {
ConfirmationDialog::alert(tr("Failed to get pairing code.\n\n%1").arg(errorDetail), this);
}
return;
}
if (isPaired) {
params.putBool("PondPaired", false);
pondButton->setText(tr("PAIR"));
pondButton->setValue(tr("Unpaired!"));
QTimer::singleShot(2500, [this]() {
pondButton->setValue("");
});
return;
}
QString code = QJsonDocument::fromJson(responseBody).object().value("code").toString();
if (code.isEmpty()) {
ConfirmationDialog::alert(tr("Failed to get pairing code. Please try again."), this);
return;
}
pondButton->setValue(tr("Code: %1").arg(code));
ConfirmationDialog::alert(tr("Go to \"frogpilot.com/the_pond\" and enter this code: %1").arg(code), this);
QString dongleId = payload["frogpilot_dongle_id"].toString();
QString apiToken = payload["api_token"].toString();
pairingPollTimer->disconnect();
int pollCount = 0;
QObject::connect(pairingPollTimer, &QTimer::timeout, [this, code, dongleId, apiToken, pollCount]() mutable {
if (++pollCount > 200) {
pairingPollTimer->stop();
pondButton->setValue(tr("Code expired"));
QTimer::singleShot(2500, [this]() {
pondButton->setValue("");
});
return;
}
QNetworkRequest statusRequest{QUrl(QString("https://www.frogpilot.com/api/pond/pair/status?code=%1&dongle_id=%2&api_token=%3").arg(code, dongleId, apiToken))};
statusRequest.setRawHeader("User-Agent", "frogpilot-api/1.0");
QNetworkReply *statusReply = networkManager->get(statusRequest);
QObject::connect(statusReply, &QNetworkReply::finished, [this, statusReply]() {
statusReply->deleteLater();
if (statusReply->error() != QNetworkReply::NoError) {
return;
}
QString status = QJsonDocument::fromJson(statusReply->readAll()).object().value("status").toString();
if (status == "paired") {
pairingPollTimer->stop();
params.putBool("PondPaired", true);
pondButton->setText(tr("UNPAIR"));
pondButton->setValue(tr("Paired!"));
ConfirmationDialog::alert(tr("Device successfully paired to \"The Pond\"!"), this);
QTimer::singleShot(2500, [this]() {
pondButton->setValue("");
});
} else if (status == "expired") {
pairingPollTimer->stop();
pondButton->setValue(tr("Code expired"));
QTimer::singleShot(2500, [this]() {
pondButton->setValue("");
});
}
});
});
pairingPollTimer->start(3000);
});
});
if (forceOpenDescriptions) {
pondButton->showDescription();
}
addItem(pondButton);
pondButton->setVisible(true);
ButtonControl *reportIssueButton = new ButtonControl(tr("Report a Bug or an Issue"), tr("REPORT"), tr("<b>Send a bug report</b> so we can help fix the problem!"));
QObject::connect(reportIssueButton, &ButtonControl::clicked, [this]() {
if (!frogpilotUIState()->frogpilot_scene.online) {
ConfirmationDialog::alert(tr("Please connect to the internet before sending a report!"), this);
return;
}
QStringList report_messages = {
tr("Acceleration feels harsh or jerky"),
tr("An alert was unclear and I'm not sure what it meant"),
tr("Braking is too sudden or uncomfortable"),
tr("I'm not sure if this is normal or a bug:"),
tr("My steering wheel buttons aren't working"),
tr("openpilot disengages when I don't expect it"),
tr("openpilot feels sluggish or slow to respond"),
tr("Something else (please describe)")
};
if (QFile::exists("/data/error_logs/error.txt")) {
report_messages.prepend(tr("I saw an alert that said \"openpilot crashed\""));
}
QString selected_issue = MultiOptionDialog::getSelection(tr("What's going on?"), report_messages, "", this);
if (selected_issue.isEmpty()) {
return;
}
if (selected_issue.contains("crashed") || selected_issue.contains("not sure") || selected_issue.contains("Something else")) {
QString extra_input = InputDialog::getText(tr("Please describe what's happening"), this, tr("Send Report"), false, 10, "", 300).trimmed();
if (extra_input.isEmpty()) {
return;
}
selected_issue += "" + extra_input;
}
QString discord_user = InputDialog::getText(tr("What's your Discord username?"), this, tr("Send Report"), false, -1, QString::fromStdString(params.get("DiscordUsername"))).trimmed();
QJsonObject reportData;
reportData["DiscordUser"] = discord_user;
reportData["Issue"] = selected_issue;
params.putNonBlocking("DiscordUsername", discord_user.toStdString());
params_memory.put("IssueReported", QJsonDocument(reportData).toJson(QJsonDocument::Compact).toStdString());
ConfirmationDialog::alert(tr("Report Sent! Thanks for letting us know!"), this);
});
if (forceOpenDescriptions) {
reportIssueButton->showDescription();
}
addItem(reportIssueButton);
reportIssueButton->setVisible(true);
ButtonControl *resetTogglesButton = new ButtonControl(tr("Reset Toggles to Default"), tr("RESET"), tr("<b>Reset all toggles to their default values.</b>"));
QObject::connect(resetTogglesButton, &ButtonControl::clicked, [parent, resetTogglesButton, this]() {
if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all toggles to their default values?"), tr("Reset"), this)) {
std::thread([parent, resetTogglesButton, this]() {
parent->keepScreenOn = true;
resetTogglesButton->setEnabled(false);
resetTogglesButton->setValue(tr("Resetting..."));
std::vector<std::string> all_keys = params.allKeys();
for (const std::string &key : all_keys) {
if (excluded_keys.count(key)) {
continue;
}
std::optional<std::string> default_value = params.getKeyDefaultValue(key);
if (default_value.has_value()) {
params.put(key, default_value.value());
}
}
updateFrogPilotToggles();
resetTogglesButton->setValue(tr("Reset!"));
util::sleep_for(2500);
resetTogglesButton->setValue("");
}).detach();
}
});
if (forceOpenDescriptions) {
resetTogglesButton->showDescription();
}
addItem(resetTogglesButton);
ButtonControl *resetTogglesButtonStock = new ButtonControl(tr("Reset Toggles to Stock openpilot"), tr("RESET"), tr("<b>Reset all toggles to match stock openpilot.</b>"));
QObject::connect(resetTogglesButtonStock, &ButtonControl::clicked, [parent, resetTogglesButtonStock, this]() {
if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all toggles to match stock openpilot?"), tr("Reset"), this)) {
std::thread([parent, resetTogglesButtonStock, this]() {
parent->keepScreenOn = true;
resetTogglesButtonStock->setEnabled(false);
resetTogglesButtonStock->setValue(tr("Resetting..."));
std::vector<std::string> all_keys = params.allKeys();
for (const std::string &key : all_keys) {
if (excluded_keys.count(key)) {
continue;
}
std::optional<std::string> stock_value = params.getStockValue(key);
if (stock_value.has_value()) {
params.put(key, stock_value.value());
}
}
updateFrogPilotToggles();
resetTogglesButtonStock->setValue(tr("Reset!"));
util::sleep_for(2500);
resetTogglesButtonStock->setValue("");
}).detach();
}
});
if (forceOpenDescriptions) {
resetTogglesButtonStock->showDescription();
}
addItem(resetTogglesButtonStock);
}
void FrogPilotUtilitiesPanel::showEvent(QShowEvent *event) {
FrogPilotListWidget::showEvent(event);
bool isPaired = params.getBool("PondPaired");
pondButton->setText(isPaired ? tr("UNPAIR") : tr("PAIR"));
}
-34
View File
@@ -1,34 +0,0 @@
#pragma once
#include "frogpilot/ui/qt/offroad/frogpilot_settings.h"
class FrogPilotUtilitiesPanel : public FrogPilotListWidget {
Q_OBJECT
public:
explicit FrogPilotUtilitiesPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false);
protected:
void showEvent(QShowEvent *event) override;
private:
bool forceOpenDescriptions;
ButtonControl *pondButton;
FrogPilotSettingsWindow *parent;
Params params;
Params params_memory{"", true};
QNetworkAccessManager *networkManager;
QTimer *pairingPollTimer;
std::set<std::string> excluded_keys = {
"AvailableModels", "AvailableModelNames", "FrogPilotStats",
"GithubSshKeys", "GithubUsername", "MapBoxRequests",
"ModelDrivesAndScores", "OverpassRequests", "SpeedLimits",
"SpeedLimitsFiltered", "UpdaterAvailableBranches",
};
};
+2 -2
View File
@@ -30,7 +30,7 @@ function agnos_init {
sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
# FrogPilot variables
# StarPilot variables
sudo chmod 0777 /cache
# Check if AGNOS update is required
@@ -85,7 +85,7 @@ function launch {
# handle pythonpath
ln -sfn $(pwd) /data/pythonpath
export BASEDIR="$DIR"
export PYTHONPATH="$DIR/frogpilot/third_party:$PWD"
export PYTHONPATH="$DIR/starpilot/third_party:$PWD"
# hardware specific init
if [ -f /AGNOS ]; then
+3 -3
View File
@@ -26,7 +26,7 @@ fi
export STAGING_ROOT="/data/safe_staging"
# FrogPilot variables (only available after StarPilot is installed to /data/openpilot)
if [ -x /data/openpilot/frogpilot/system/environment_variables ]; then
eval "$(/data/openpilot/frogpilot/system/environment_variables)"
# StarPilot variables (only available after StarPilot is installed to /data/openpilot)
if [ -x /data/openpilot/starpilot/system/environment_variables ]; then
eval "$(/data/openpilot/starpilot/system/environment_variables)"
fi
@@ -34,7 +34,7 @@ class CarController(CarControllerBase):
torque -= deadband
return torque
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
torque_l = 0
torque_r = 0
+3 -3
View File
@@ -6,7 +6,7 @@ from opendbc.car.body.values import DBC
class CarState(CarStateBase):
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.main]
ret = structs.CarState()
@@ -29,8 +29,8 @@ class CarState(CarStateBase):
ret.cruiseState.enabled = True
ret.cruiseState.available = True
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
+13 -13
View File
@@ -11,15 +11,15 @@ from opendbc.car.structs import CarParams, CarParamsT
from opendbc.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars
from opendbc.car.fw_versions import ObdCallback, get_fw_versions_ordered, get_present_ecus, match_fw_to_car
from opendbc.car.mock.values import CAR as MOCK
from opendbc.car.toyota.values import ToyotaFrogPilotFlags
from opendbc.car.toyota.values import ToyotaStarPilotFlags
from opendbc.car.values import BRANDS
from opendbc.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN
from openpilot.common.params import Params
FRAME_FINGERPRINT = 100 # 1s
# FrogPilot variables
FrogPilotCarParams = custom.FrogPilotCarParams
# StarPilot variables
StarPilotCarParams = custom.StarPilotCarParams
def load_interfaces(brand_names):
@@ -212,15 +212,15 @@ def fingerprint(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_mu
def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, alpha_long_allowed: bool,
is_release: bool, params: Params, num_pandas: int = 1, cached_params: CarParamsT | None = None, frogpilot_toggles: SimpleNamespace = None):
is_release: bool, params: Params, num_pandas: int = 1, cached_params: CarParamsT | None = None, starpilot_toggles: SimpleNamespace = None):
candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(can_recv, can_send, set_obd_multiplexing, num_pandas, cached_params)
candidate = _normalize_gm_bolt_candidate(candidate, fingerprints)
candidate = _normalize_forced_candidate(candidate)
fingerprinted_candidate = candidate
if candidate is None or frogpilot_toggles.force_fingerprint:
if frogpilot_toggles.force_fingerprint:
forced_candidate = _normalize_forced_candidate(frogpilot_toggles.car_model)
if candidate is None or starpilot_toggles.force_fingerprint:
if starpilot_toggles.force_fingerprint:
forced_candidate = _normalize_forced_candidate(starpilot_toggles.car_model)
candidate = forced_candidate
if candidate not in interfaces and fingerprinted_candidate in interfaces:
carlog.error({
@@ -236,7 +236,7 @@ def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multip
params.put_nonblocking("CarMake", candidate.split('_')[0].title())
params.put_nonblocking("CarModel", str(candidate))
if frogpilot_toggles.block_user:
if starpilot_toggles.block_user:
candidate = "MOCK"
# Legacy branch migration guard: normalize stale platform names from any source
@@ -251,20 +251,20 @@ def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multip
candidate = fingerprinted_candidate
CarInterface = interfaces[candidate]
CP: CarParams = CarInterface.get_params(candidate, fingerprints, car_fw, alpha_long_allowed, is_release, docs=False, frogpilot_toggles=frogpilot_toggles)
CP: CarParams = CarInterface.get_params(candidate, fingerprints, car_fw, alpha_long_allowed, is_release, docs=False, starpilot_toggles=starpilot_toggles)
CP.carVin = vin
CP.carFw = car_fw
CP.fingerprintSource = source
CP.fuzzyFingerprint = not exact_match
# FrogPilot variables
FPCP: FrogPilotCarParams = CarInterface.get_frogpilot_params(candidate, fingerprints, car_fw, CP, frogpilot_toggles)
# StarPilot variables
FPCP: StarPilotCarParams = CarInterface.get_starpilot_params(candidate, fingerprints, car_fw, CP, starpilot_toggles)
if CP.brand == "toyota" and FPCP.flags & ToyotaFrogPilotFlags.SMART_DSU.value:
if CP.brand == "toyota" and FPCP.flags & ToyotaStarPilotFlags.SMART_DSU.value:
CP.minEnableSpeed = -1
CP.openpilotLongitudinalControl = True
if not CP.alphaLongitudinalAvailable and frogpilot_toggles.disable_openpilot_long:
if not CP.alphaLongitudinalAvailable and starpilot_toggles.disable_openpilot_long:
CP.openpilotLongitudinalControl = False
FPCP.openpilotLongitudinalControlDisabled = True
@@ -19,7 +19,7 @@ class CarController(CarControllerBase):
self.packer = CANPacker(dbc_names[Bus.pt])
self.params = CarControllerParams(CP)
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
can_sends = []
lkas_active = CC.latActive and self.lkas_control_bit_prev
@@ -1,7 +1,7 @@
from cereal import custom
from opendbc.can import CANDefine, CANParser
from opendbc.car import Bus, create_button_events, structs
from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS, ChryslerFrogPilotFlags
from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS, ChryslerStarPilotFlags
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.interfaces import CarStateBase
@@ -26,12 +26,12 @@ class CarState(CarStateBase):
self.distance_button = 0
# RealFast variables
self.button_message = "CRUISE_BUTTONS_ALT" if FPCP.flags & ChryslerFrogPilotFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS"
self.button_message = "CRUISE_BUTTONS_ALT" if FPCP.flags & ChryslerStarPilotFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS"
# FrogPilot variables
# StarPilot variables
self.lkas_button = 0
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
@@ -104,8 +104,8 @@ class CarState(CarStateBase):
buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
self.prev_lkas_button = self.lkas_button
if self.CP.carFingerprint in RAM_CARS:
+2 -2
View File
@@ -19,8 +19,8 @@ class ChryslerFlags(IntFlag):
HIGHER_MIN_STEERING_SPEED = 1
# FrogPilot variables
class ChryslerFrogPilotFlags(IntFlag):
# StarPilot variables
class ChryslerStarPilotFlags(IntFlag):
RAM_HD_ALT_BUTTONS = 1
@@ -75,7 +75,7 @@ class CarController(CarControllerBase):
self.lead_distance_bars_last = None
self.distance_bar_frame = 0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
can_sends = []
actuators = CC.actuators
+3 -3
View File
@@ -21,7 +21,7 @@ class CarState(CarStateBase):
self.distance_button = 0
self.lc_button = 0
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
@@ -114,8 +114,8 @@ class CarState(CarStateBase):
*create_button_events(self.lc_button, prev_lc_button, {1: ButtonType.lkas}),
]
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
+7 -7
View File
@@ -8,7 +8,7 @@ from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.gm.values import ASCM_INT, CAR, CC_ONLY_CAR, CC_REGEN_PADDLE_CAR, DBC, EV_CAR, SDGM_CAR, AccState, CanBus, CarControllerParams, CruiseButtons, GMFlags
from opendbc.car.interfaces import CarControllerBase
from openpilot.common.params import Params, UnknownKeyName
from openpilot.frogpilot.common.testing_grounds import testing_ground
from openpilot.starpilot.common.testing_grounds import testing_ground
VisualAlert = structs.CarControl.HUDControl.VisualAlert
NetworkLocation = structs.CarParams.NetworkLocation
@@ -213,7 +213,7 @@ class CarController(CarControllerBase):
self.malibu_cancel_phase = phase
self.malibu_button_phase = phase
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
self.aego = CS.out.aEgo
accel = actuators.accel
@@ -366,11 +366,11 @@ class CarController(CarControllerBase):
self.regen_min_on_frames = 0
self.regen_min_off_frames = 0
elif near_stop and stopping and not CC.cruiseControl.resume:
stop_accel = getattr(frogpilot_toggles, "stopAccel", self.CP.stopAccel)
stop_accel = getattr(starpilot_toggles, "stopAccel", self.CP.stopAccel)
self.apply_gas = self.params.INACTIVE_REGEN
self.apply_brake = int(min(-100 * stop_accel, self.params.MAX_BRAKE))
else:
long_pitch_enabled = bool(getattr(frogpilot_toggles, "long_pitch", True))
long_pitch_enabled = bool(getattr(starpilot_toggles, "long_pitch", True))
pedal_long_path = bool(self.CP.enableGasInterceptorDEPRECATED and (self.CP.flags & GMFlags.PEDAL_LONG.value))
long_pitch_for_powertrain = long_pitch_enabled and not pedal_long_path
@@ -453,7 +453,7 @@ class CarController(CarControllerBase):
if self.CP.flags & GMFlags.CC_LONG.value:
if CC.longActive and CS.out.cruiseState.enabled and CS.out.vEgo > self.CP.minEnableSpeed:
# Using extend instead of append since the message is only sent intermittently
can_sends.extend(gmcan.create_gm_cc_spam_command(self.packer_pt, self, CS, actuators, frogpilot_toggles))
can_sends.extend(gmcan.create_gm_cc_spam_command(self.packer_pt, self, CS, actuators, starpilot_toggles))
elif (CS.out.cruiseState.enabled and CC.enabled and self.frame % 52 == 0 and
CS.cruise_buttons == CruiseButtons.UNPRESS and CS.out.gasPressed and CS.out.cruiseState.speed < CS.out.vEgo < hud_v_cruise):
if self.CP.carFingerprint == CAR.CHEVROLET_MALIBU_HYBRID_CC:
@@ -479,8 +479,8 @@ class CarController(CarControllerBase):
resume = actuators.longControlState != LongCtrlState.starting or CC.cruiseControl.resume
at_full_stop = at_full_stop and not resume
# FrogPilot variables
if CC.cruiseControl.resume and CS.pcm_acc_status == AccState.STANDSTILL and frogpilot_toggles.volt_sng:
# StarPilot variables
if CC.cruiseControl.resume and CS.pcm_acc_status == AccState.STANDSTILL and starpilot_toggles.volt_sng:
acc_engaged = False
else:
acc_engaged = CC.enabled
+4 -4
View File
@@ -78,7 +78,7 @@ class CarState(CarStateBase):
return True
return False
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
pt_cp = can_parsers[Bus.pt]
cam_cp = can_parsers[Bus.cam]
loopback_cp = can_parsers[Bus.loopback]
@@ -133,7 +133,7 @@ class CarState(CarStateBase):
pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"],
pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"],
)
ret.vEgoCluster = ret.vEgo * getattr(frogpilot_toggles, "cluster_offset", 1.0)
ret.vEgoCluster = ret.vEgo * getattr(starpilot_toggles, "cluster_offset", 1.0)
# standstill=True if ECM allows engagement with brake.
ret.standstill = abs(pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"]) <= STANDSTILL_THRESHOLD and \
abs(pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"]) <= STANDSTILL_THRESHOLD
@@ -283,7 +283,7 @@ class CarState(CarStateBase):
remap_cancel_to_distance = bool(self.CP.alternativeExperience & ALTERNATIVE_EXPERIENCE.GM_REMAP_CANCEL_TO_DISTANCE)
if not remap_cancel_to_distance:
remap_cancel_to_distance = (
getattr(frogpilot_toggles, "remap_cancel_to_distance", False) and
getattr(starpilot_toggles, "remap_cancel_to_distance", False) and
self.CP.openpilotLongitudinalControl and
bool(self.CP.flags & GMFlags.PEDAL_LONG.value) and
self.CP.carFingerprint in (BOLT_GEN1_CANCEL_PERSONALITY_CARS | {CAR.CHEVROLET_MALIBU_HYBRID_CC})
@@ -342,7 +342,7 @@ class CarState(CarStateBase):
if ret.vEgo < self.CP.minSteerSpeed:
ret.lowSpeedAlert = True
fp_ret = custom.FrogPilotCarState.new_message()
fp_ret = custom.StarPilotCarState.new_message()
if bolt_cancel_personality and self.cruise_buttons == CruiseButtons.CANCEL:
# Feed long-press personality logic as if distance is held while CANCEL is held.
fp_ret.distancePressed = True
+1 -1
View File
@@ -191,7 +191,7 @@ FINGERPRINTS = {
{
190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 647: 3, 707: 8, 717: 5, 723: 2, 753: 5, 761: 7, 800: 6, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1919: 7, 1920: 7
}],
# FrogPilot variables
# StarPilot variables
CAR.CHEVROLET_TRAX: [
{
190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7
+2 -2
View File
@@ -273,12 +273,12 @@ def create_lka_icon_command(bus, active, critical, steer):
return CanData(0x104c006c, dat, bus)
def create_gm_cc_spam_command(packer, controller, CS, actuators, frogpilot_toggles):
def create_gm_cc_spam_command(packer, controller, CS, actuators, starpilot_toggles):
accel = actuators.accel
v_ego = CS.out.vEgo
cruise_btn = CruiseButtons.INIT
rate = 1 if abs(accel) <= 0.15 else 0.2
ms_convert = CV.MS_TO_KPH if getattr(frogpilot_toggles, "is_metric", False) else CV.MS_TO_MPH
ms_convert = CV.MS_TO_KPH if getattr(starpilot_toggles, "is_metric", False) else CV.MS_TO_MPH
speed_setpoint = int(round(CS.out.cruiseState.speed * ms_convert))
desired_setpoint = int(round((v_ego * 1.01 + 3 * accel) * ms_convert))
+1 -1
View File
@@ -627,7 +627,7 @@ class CarInterface(CarInterfaceBase):
if remap_cancel_to_distance or malibu_cancel_passthrough:
ret.alternativeExperience |= ALTERNATIVE_EXPERIENCE.GM_REMAP_CANCEL_TO_DISTANCE
# FrogPilot variables
# StarPilot variables
if candidate == CAR.CHEVROLET_TRAX:
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+1 -1
View File
@@ -567,5 +567,5 @@ STEER_THRESHOLD = 1.0
DBC = CAR.create_dbc_map()
# FrogPilot variables
# StarPilot variables
CAMERA_ACC_CAR.update({CAR.CHEVROLET_TRAX})
@@ -109,7 +109,7 @@ class CarController(CarControllerBase):
self.brake = 0.0
self.last_torque = 0.0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
hud_control = CC.hudControl
hud_v_cruise = hud_control.setSpeed / CS.v_cruise_factor if hud_control.speedVisible else 255
+3 -3
View File
@@ -50,7 +50,7 @@ class CarState(CarStateBase):
# However, on cars without a digital speedometer this is not always present (HRV, FIT, CRV 2016, ILX and RDX)
self.dash_speed_seen = False
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
if self.CP.enableBsm:
@@ -220,8 +220,8 @@ class CarState(CarStateBase):
*create_button_events(self.cruise_setting, prev_cruise_setting, SETTINGS_BUTTONS_DICT),
]
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
@@ -55,7 +55,7 @@ class CarController(CarControllerBase):
self.car_fingerprint = CP.carFingerprint
self.last_button_frame = 0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
hud_control = CC.hudControl
+5 -5
View File
@@ -70,7 +70,7 @@ class CarState(CarStateBase):
# Main button also can trigger an engagement on these cars
return any(btn in ENABLE_BUTTONS for btn in self.cruise_buttons) or any(self.main_buttons)
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
@@ -203,8 +203,8 @@ class CarState(CarStateBase):
self.low_speed_alert = False
ret.lowSpeedAlert = self.low_speed_alert
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
@@ -301,8 +301,8 @@ class CarState(CarStateBase):
ret.blockPcmEnable = not self.recent_button_interaction()
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
+2 -2
View File
@@ -68,8 +68,8 @@ class HyundaiSafetyFlags(IntFlag):
ALT_LIMITS_2 = 512
# FrogPilot variables
class HyundaiFrogPilotSafetyFlags(IntFlag):
# StarPilot variables
class HyundaiStarPilotSafetyFlags(IntFlag):
HAS_LDA_BUTTON = 1024
+25 -25
View File
@@ -13,16 +13,16 @@ from cereal import custom
from opendbc.car import DT_CTRL, apply_hysteresis, create_button_events, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG
from opendbc.car import structs
from opendbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable
from opendbc.car.chrysler.values import CAR as CHRYSLER, ChryslerFrogPilotFlags
from opendbc.car.chrysler.values import CAR as CHRYSLER, ChryslerStarPilotFlags
from opendbc.car.common.basedir import BASEDIR
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.common.simple_kalman import KF1D, get_kalman_gain
from opendbc.car.gm.values import CAR as GM
from opendbc.car.honda.values import CAR as HONDA, HONDA_BOSCH, HondaSafetyFlags
from opendbc.car.hyundai.hyundaicanfd import CanBus
from opendbc.car.hyundai.values import CAR as HYUNDAI, CANFD_CAR, HyundaiFlags, HyundaiFrogPilotSafetyFlags
from opendbc.car.hyundai.values import CAR as HYUNDAI, CANFD_CAR, HyundaiFlags, HyundaiStarPilotSafetyFlags
from opendbc.car.mock.values import CAR as MOCK
from opendbc.car.toyota.values import CAR as TOYOTA, NO_DSU_CAR, TSS2_CAR, UNSUPPORTED_DSU_CAR, ToyotaFrogPilotFlags, ToyotaSafetyFlags
from opendbc.car.toyota.values import CAR as TOYOTA, NO_DSU_CAR, TSS2_CAR, UNSUPPORTED_DSU_CAR, ToyotaStarPilotFlags, ToyotaSafetyFlags
from opendbc.car.values import PLATFORMS
from opendbc.can import CANParser
from openpilot.common.params import Params
@@ -30,7 +30,7 @@ from openpilot.common.params import Params
GearShifter = structs.CarState.GearShifter
ButtonType = structs.CarState.ButtonEvent.Type
# FrogPilot variables
# StarPilot variables
Ecu = structs.CarParams.Ecu
V_CRUISE_MAX = 145
@@ -121,7 +121,7 @@ class CarInterfaceBase(ABC):
CarController: 'CarControllerBase'
RadarInterface: 'RadarInterfaceBase' = RadarInterfaceBase
def __init__(self, CP: structs.CarParams, FPCP: custom.FrogPilotCarParams):
def __init__(self, CP: structs.CarParams, FPCP: custom.StarPilotCarParams):
self.CP = CP
self.frame = 0
@@ -133,17 +133,17 @@ class CarInterfaceBase(ABC):
dbc_names = {bus: cp.dbc_name for bus, cp in self.can_parsers.items()}
self.CC: CarControllerBase = self.CarController(dbc_names, CP)
# FrogPilot variables
# StarPilot variables
self.FPCP = FPCP
self.params_memory = Params(memory=True)
self.distance_button = 0
def apply(self, c: structs.CarControl, now_nanos: int | None = None, frogpilot_toggles: SimpleNamespace = None) -> tuple[structs.CarControl.Actuators, list[CanData]]:
def apply(self, c: structs.CarControl, now_nanos: int | None = None, starpilot_toggles: SimpleNamespace = None) -> tuple[structs.CarControl.Actuators, list[CanData]]:
if now_nanos is None:
now_nanos = int(time.monotonic() * 1e9)
return self.CC.update(c, self.CS, now_nanos, frogpilot_toggles)
return self.CC.update(c, self.CS, now_nanos, starpilot_toggles)
@staticmethod
def get_pid_accel_limits(CP, current_speed, cruise_speed):
@@ -158,7 +158,7 @@ class CarInterfaceBase(ABC):
@classmethod
def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw],
alpha_long: bool, is_release: bool, docs: bool, frogpilot_toggles: SimpleNamespace) -> structs.CarParams:
alpha_long: bool, is_release: bool, docs: bool, starpilot_toggles: SimpleNamespace) -> structs.CarParams:
ret = CarInterfaceBase.get_std_params(candidate)
platform = PLATFORMS[candidate]
@@ -181,28 +181,28 @@ class CarInterfaceBase(ABC):
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront, ret.tireStiffnessFactor)
# FrogPilot variables
# StarPilot variables
toggles_to_check = ("force_torque_controller", "nnff", "nnff_lite")
if ret.steerControlType != structs.CarParams.SteerControlType.angle and any(getattr(frogpilot_toggles, toggle, False) for toggle in toggles_to_check):
if ret.steerControlType != structs.CarParams.SteerControlType.angle and any(getattr(starpilot_toggles, toggle, False) for toggle in toggles_to_check):
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
return ret
# FrogPilot variables
# StarPilot variables
@classmethod
def get_frogpilot_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], CP: structs.CarParams, frogpilot_toggles: SimpleNamespace):
fp_ret = custom.FrogPilotCarParams.new_message()
def get_starpilot_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], CP: structs.CarParams, starpilot_toggles: SimpleNamespace):
fp_ret = custom.StarPilotCarParams.new_message()
platform = PLATFORMS[candidate]
fp_ret.flags |= int(platform.config.flags)
fp_ret.safetyConfigs = [custom.FrogPilotCarParams.SafetyConfig.new_message(safetyParam=config.safetyParam) for config in CP.safetyConfigs]
fp_ret.safetyConfigs = [custom.StarPilotCarParams.SafetyConfig.new_message(safetyParam=config.safetyParam) for config in CP.safetyConfigs]
if platform not in MOCK:
if platform in CHRYSLER:
if candidate == CHRYSLER.RAM_HD_5TH_GEN:
if 570 not in fingerprint[0]:
fp_ret.flags |= ChryslerFrogPilotFlags.RAM_HD_ALT_BUTTONS.value
fp_ret.flags |= ChryslerStarPilotFlags.RAM_HD_ALT_BUTTONS.value
elif platform in GM:
fp_ret.canUsePedal = True
@@ -217,7 +217,7 @@ class CarInterfaceBase(ABC):
fp_ret.isHDA2 = hda2
if CP.flags & HyundaiFlags.HAS_LDA_BUTTON:
fp_ret.safetyConfigs[-1].safetyParam |= HyundaiFrogPilotSafetyFlags.HAS_LDA_BUTTON.value
fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON.value
elif platform in TOYOTA:
fp_ret.canUsePedal = not CP.autoResumeSng
@@ -227,11 +227,11 @@ class CarInterfaceBase(ABC):
fp_ret.flags |= ToyotaFlags.RADAR_CAN_FILTER.value
if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR):
fp_ret.flags |= ToyotaFrogPilotFlags.SMART_DSU.value
fp_ret.flags |= ToyotaStarPilotFlags.SMART_DSU.value
if candidate == TOYOTA.TOYOTA_PRIUS:
if 0x23 in fingerprint[0]:
fp_ret.flags |= ToyotaFrogPilotFlags.ZSS.value
fp_ret.flags |= ToyotaStarPilotFlags.ZSS.value
return fp_ret
@@ -313,14 +313,14 @@ class CarInterfaceBase(ABC):
tune.torque.latAccelOffset = 0.0
tune.torque.steeringAngleDeadzoneDeg = steering_angle_deadzone_deg
def update(self, can_packets: list[tuple[int, list[CanData]]], frogpilot_toggles: SimpleNamespace) -> structs.CarState:
def update(self, can_packets: list[tuple[int, list[CanData]]], starpilot_toggles: SimpleNamespace) -> structs.CarState:
# parse can
for cp in self.can_parsers.values():
if cp is not None:
cp.update(can_packets)
# get CarState
ret, fp_ret = self.CS.update(self.can_parsers, frogpilot_toggles)
ret, fp_ret = self.CS.update(self.can_parsers, starpilot_toggles)
ret.canValid = all(cp.can_valid for cp in self.can_parsers.values())
ret.canTimeout = any(cp.bus_timeout for cp in self.can_parsers.values())
@@ -343,7 +343,7 @@ class CarInterfaceBase(ABC):
# save for next iteration
self.CS.out = ret
# FrogPilot variables
# StarPilot variables
prev_distance_button = self.distance_button
self.distance_button = self.params_memory.get_bool("OnroadDistanceButtonPressed")
if self.distance_button != prev_distance_button:
@@ -359,7 +359,7 @@ class CarInterfaceBase(ABC):
class CarStateBase(ABC):
def __init__(self, CP: structs.CarParams, FPCP: custom.FrogPilotCarParams):
def __init__(self, CP: structs.CarParams, FPCP: custom.StarPilotCarParams):
self.CP = CP
self.car_fingerprint = CP.carFingerprint
self.out = structs.CarState()
@@ -383,7 +383,7 @@ class CarStateBase(ABC):
K = get_kalman_gain(DT_CTRL, np.array(A), np.array(C), np.array(Q), R)
self.v_ego_kf = KF1D(x0=x0, A=A, C=C[0], K=K)
# FrogPilot variables
# StarPilot variables
self.FPCP = FPCP
self.CC: structs.CarControl = structs.CarControl.new_message()
@@ -391,7 +391,7 @@ class CarStateBase(ABC):
self.distance_button = False
@abstractmethod
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
pass
def parse_wheel_speeds(self, cs, fl, fr, rl, rr, unit=CV.KPH_TO_MS):
@@ -15,7 +15,7 @@ class CarController(CarControllerBase):
self.packer = CANPacker(dbc_names[Bus.pt])
self.brake_counter = 0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
can_sends = []
apply_torque = 0
+3 -3
View File
@@ -21,7 +21,7 @@ class CarState(CarStateBase):
self.distance_button = 0
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
@@ -116,8 +116,8 @@ class CarState(CarStateBase):
# TODO: add button types for inc and dec
ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
+1 -1
View File
@@ -29,7 +29,7 @@ class CarInterface(CarInterfaceBase):
ret.centerToFront = ret.wheelbase * 0.41
# FrogPilot variables
# StarPilot variables
ret.enableBsm = True
return ret
@@ -2,5 +2,5 @@ from opendbc.car.interfaces import CarControllerBase
class CarController(CarControllerBase):
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
return CC.actuators.as_builder(), []
+1 -1
View File
@@ -5,4 +5,4 @@ from opendbc.car.interfaces import CarStateBase
class CarState(CarStateBase):
def update(self, *_) -> structs.CarState:
return structs.CarState(), custom.FrogPilotCarState()
return structs.CarState(), custom.StarPilotCarState()
@@ -17,7 +17,7 @@ class CarController(CarControllerBase):
self.packer = CANPacker(dbc_names[Bus.pt])
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
hud_control = CC.hudControl
pcm_cancel_cmd = CC.cruiseControl.cancel
+4 -4
View File
@@ -25,10 +25,10 @@ class CarState(CarStateBase):
self.distance_button = 0
# FrogPilot variables
# StarPilot variables
self.lkas_button = 0
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
cp_adas = can_parsers[Bus.adas]
@@ -132,8 +132,8 @@ class CarState(CarStateBase):
buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
self.prev_lkas_button = self.lkas_button
self.lkas_button = ret.invalidLkasSetting
@@ -13,7 +13,7 @@ class CarController(CarControllerBase):
self.apply_angle_last = 0
self.status = 2
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
can_sends = []
actuators = CC.actuators
+3 -3
View File
@@ -10,7 +10,7 @@ TransmissionType = structs.CarParams.TransmissionType
class CarState(CarStateBase):
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.main]
cp_adas = can_parsers[Bus.adas]
cp_cam = can_parsers[Bus.cam]
@@ -64,8 +64,8 @@ class CarState(CarStateBase):
ret.doorOpen = any((cp_cam.vl['Dat_BSI']['DRIVER_DOOR'], cp_cam.vl['Dat_BSI']['PASSENGER_DOOR']))
ret.seatbeltUnlatched = cp_cam.vl['RESTRAINTS']['DRIVER_SEATBELT'] != 2
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
@@ -15,7 +15,7 @@ class CarController(CarControllerBase):
self.cancel_frames = 0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
can_sends = []
+3 -3
View File
@@ -18,7 +18,7 @@ class CarState(CarStateBase):
self.sccm_wheel_touch = None
self.vdm_adas_status = None
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
cp_adas = can_parsers[Bus.adas]
@@ -93,8 +93,8 @@ class CarState(CarStateBase):
self.sccm_wheel_touch = copy.copy(cp.vl["SCCM_WheelTouch"])
self.vdm_adas_status = copy.copy(cp.vl["VDM_AdasSts"])
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
@@ -11,7 +11,7 @@ from opendbc.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarController
MAX_STEER_RATE = 25 # deg/s
MAX_STEER_RATE_FRAMES = 7 # tx control frames needed before torque can be cut
# FrogPilot variables
# StarPilot variables
_SNG_ACC_MIN_DIST = 3
_SNG_ACC_MAX_DIST = 4.5
@@ -27,7 +27,7 @@ class CarController(CarControllerBase):
self.p = CarControllerParams(CP)
self.packer = CANPacker(DBC[CP.carFingerprint][Bus.pt])
# FrogPilot variables
# StarPilot variables
self.manual_hold = False
self.prev_standstill = False
self.sng_acc_resume = False
@@ -37,7 +37,7 @@ class CarController(CarControllerBase):
self.sng_acc_resume_cnt = 0
self.standstill_start = 0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
hud_control = CC.hudControl
pcm_cancel_cmd = CC.cruiseControl.cancel
@@ -71,9 +71,9 @@ class CarController(CarControllerBase):
self.apply_torque_last = apply_torque
# FrogPilot variables
# StarPilot variables
# *** stop and go ***
if frogpilot_toggles.subaru_sng:
if starpilot_toggles.subaru_sng:
throttle_cmd, speed_cmd = self.stop_and_go(CC, CS)
# *** longitudinal ***
@@ -112,8 +112,8 @@ class CarController(CarControllerBase):
can_sends.append(subarucan.create_preglobal_es_distance(self.packer, cruise_button, CS.es_distance_msg))
# FrogPilot variables
if frogpilot_toggles.subaru_sng:
# StarPilot variables
if starpilot_toggles.subaru_sng:
can_sends.append(subarucan.create_preglobal_throttle(self.packer, CS.throttle_msg["COUNTER"] + 1, CS.throttle_msg, throttle_cmd))
else:
if self.frame % 10 == 0:
@@ -127,8 +127,8 @@ class CarController(CarControllerBase):
if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT:
can_sends.append(subarucan.create_es_infotainment(self.packer, self.frame // 10, CS.es_infotainment_msg, hud_control.visualAlert))
# FrogPilot variables
if frogpilot_toggles.subaru_sng:
# StarPilot variables
if starpilot_toggles.subaru_sng:
can_sends.append(subarucan.create_throttle(self.packer, CS.throttle_msg["COUNTER"] + 1, CS.throttle_msg, throttle_cmd))
if self.frame % 2 == 0:
can_sends.append(subarucan.create_brake_pedal(self.packer, self.frame // 2, CS.brake_pedal_msg, speed_cmd, pcm_cancel_cmd))
@@ -171,7 +171,7 @@ class CarController(CarControllerBase):
self.frame += 1
return new_actuators, can_sends
# FrogPilot variables
# StarPilot variables
def stop_and_go(self, CC, CS, speed_cmd=False, throttle_cmd=False):
if self.CP.flags & SubaruFlags.PREGLOBAL:
trigger_resume = CC.enabled
+4 -4
View File
@@ -16,7 +16,7 @@ class CarState(CarStateBase):
self.angle_rate_calulator = CanSignalRateCalculator(50)
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
cp_alt = can_parsers[Bus.alt]
@@ -124,10 +124,10 @@ class CarState(CarStateBase):
if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT:
self.es_infotainment_msg = copy.copy(cp_cam.vl["ES_Infotainment"])
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
if frogpilot_toggles.subaru_sng:
if starpilot_toggles.subaru_sng:
self.brake_pedal_msg = copy.copy(cp.vl["Brake_Pedal"])
self.car_follow = cp_es_distance.vl["ES_Distance"]["Car_Follow"]
self.close_distance = cp_es_distance.vl["ES_Distance"]["Close_Distance"]
+1 -1
View File
@@ -336,7 +336,7 @@ def subaru_checksum(address: int, sig, d: bytearray) -> int:
return s & 0xFF
# FrogPilot variables
# StarPilot variables
def create_brake_pedal(packer, frame, brake_pedal_msg, speed_cmd, brake_cmd):
values = {s: brake_pedal_msg[s] for s in sorted([
"Brake_Lights",
+1 -1
View File
@@ -26,7 +26,7 @@ class CarControllerParams:
elif CP.carFingerprint == CAR.SUBARU_IMPREZA_2020:
self.STEER_DELTA_UP = 35
self.STEER_MAX = 1439
# FrogPilot variables
# StarPilot variables
elif CP.carFingerprint == CAR.SUBARU_IMPREZA:
self.STEER_MAX = 3071
else:
@@ -25,7 +25,7 @@ class CarController(CarControllerBase):
# Vehicle model used for lateral limiting
self.VM = VehicleModel(get_safety_CP())
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
can_sends = []
+3 -3
View File
@@ -31,7 +31,7 @@ class CarState(CarStateBase):
self.autopark_prev = autopark_now
self.cruise_enabled_prev = cruise_enabled
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp_party = can_parsers[Bus.party]
cp_ap_party = can_parsers[Bus.ap_party]
ret = structs.CarState()
@@ -118,8 +118,8 @@ class CarState(CarStateBase):
# Messages needed by carcontroller
self.das_control = copy.copy(cp_ap_party.vl["DAS_control"])
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
@@ -81,4 +81,4 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"VOLKSWAGEN_PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647]
"VOLKSWAGEN_TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916]
# FrogPilot variables
# StarPilot variables
@@ -103,5 +103,5 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"GMC_YUKON_CC" = "CHEVROLET_SILVERADO"
"CHEVROLET_TRAILBLAZER_CC" = "CHEVROLET_TRAILBLAZER"
# FrogPilot variables
# StarPilot variables
"CHEVROLET_TRAX" = "CHEVROLET_VOLT"
@@ -35,7 +35,7 @@ MAX_STEER_RATE_FRAMES = 18 # tx control frames needed before torque can be cut
# EPS allows user torque above threshold for 50 frames before permanently faulting
MAX_USER_TORQUE = 500
# FrogPilot variables
# StarPilot variables
PARK = structs.CarState.GearShifter.park
# Lock / unlock door commands - Credit goes to AlexandreSato!
@@ -86,10 +86,10 @@ class CarController(CarControllerBase):
self.secoc_acc_message_counter = 0
self.secoc_prev_reset_counter = 0
# FrogPilot variables
# StarPilot variables
self.doors_locked = False
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
stopping = actuators.longControlState == LongCtrlState.stopping
hud_control = CC.hudControl
@@ -183,7 +183,7 @@ class CarController(CarControllerBase):
# on entering standstill, send standstill request for older TSS-P cars that aren't designed to stay engaged at a stop
if self.CP.carFingerprint not in NO_STOP_TIMER_CAR:
if CS.out.standstill and not self.last_standstill and not frogpilot_toggles.sng_hack:
if CS.out.standstill and not self.last_standstill and not starpilot_toggles.sng_hack:
self.standstill_req = True
if CS.pcm_acc_status != 8:
# pcm entered standstill or it's disabled
@@ -194,7 +194,7 @@ class CarController(CarControllerBase):
# brakes can take a while to ramp up causing a lurch forward. prevent resume press until planner wants to move.
# don't use CC.cruiseControl.resume since it is gated on CS.cruiseState.standstill which goes false for 3s after resume press
# TODO: hybrids do not have this issue and can stay stopped after resume press, whitelist them
should_resume = actuators.accel > 0 or frogpilot_toggles.sng_hack
should_resume = actuators.accel > 0 or starpilot_toggles.sng_hack
if should_resume:
self.standstill_req = False
@@ -241,7 +241,7 @@ class CarController(CarControllerBase):
self.aego.update(a_ego_blended)
j_ego = (self.aego.x - prev_aego) / (DT_CTRL * 3)
if frogpilot_toggles.frogsgomoo_tweak:
if starpilot_toggles.frogsgomoo_tweak:
future_t = float(np.interp(CS.out.vEgo, [2., 5.], [0.35, 1.0]))
else:
future_t = float(np.interp(CS.out.vEgo, [2., 5.], [0.25, 0.5]))
@@ -279,7 +279,7 @@ class CarController(CarControllerBase):
main_accel_cmd = 0. if self.CP.flags & ToyotaFlags.SECOC.value else pcm_accel_cmd
can_sends.append(toyotacan.create_accel_command(self.packer, main_accel_cmd, pcm_cancel_cmd, self.permit_braking, self.standstill_req, lead,
CS.acc_type, fcw_alert, self.distance_button, frogpilot_toggles.reverse_cruise_increase))
CS.acc_type, fcw_alert, self.distance_button, starpilot_toggles.reverse_cruise_increase))
if self.CP.flags & ToyotaFlags.SECOC.value:
acc_cmd_2 = toyotacan.create_accel_command_2(self.packer, pcm_accel_cmd)
acc_cmd_2 = add_mac(self.secoc_key,
@@ -298,7 +298,7 @@ class CarController(CarControllerBase):
if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
can_sends.append(toyotacan.create_acc_cancel_command(self.packer))
else:
can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, True, False, lead, CS.acc_type, False, self.distance_button, frogpilot_toggles.reverse_cruise_increase))
can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, True, False, lead, CS.acc_type, False, self.distance_button, starpilot_toggles.reverse_cruise_increase))
# *** hud ui ***
if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V:
@@ -334,13 +334,13 @@ class CarController(CarControllerBase):
self.frame += 1
# FrogPilot variables
# StarPilot variables
if not self.doors_locked and CS.out.gearShifter != PARK:
if frogpilot_toggles.lock_doors:
if starpilot_toggles.lock_doors:
can_sends.append(CanData(0x750, LOCK_CMD, 0))
self.doors_locked = True
elif self.doors_locked and CS.out.gearShifter == PARK:
if frogpilot_toggles.unlock_doors:
if starpilot_toggles.unlock_doors:
can_sends.append(CanData(0x750, UNLOCK_CMD, 0))
self.doors_locked = False
+9 -9
View File
@@ -6,7 +6,7 @@ from opendbc.car import Bus, DT_CTRL, create_button_events, structs
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.common.filter_simple import FirstOrderFilter
from opendbc.car.interfaces import CarStateBase
from opendbc.car.toyota.values import ToyotaFlags, ToyotaFrogPilotFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \
from opendbc.car.toyota.values import ToyotaFlags, ToyotaStarPilotFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \
TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR, \
SECOC_CAR
@@ -67,17 +67,17 @@ class CarState(CarStateBase):
self.gvc = 0.0
self.secoc_synchronization = None
# FrogPilot variables
# StarPilot variables
self.latActive_previous = False
self.needs_angle_offset_zss = False
self.angle_offset_zss = 0
self.has_can_filter = self.FPCP.flags & ToyotaFrogPilotFlags.RADAR_CAN_FILTER.value
self.has_SDSU = self.FPCP.flags & ToyotaFrogPilotFlags.SMART_DSU.value
self.has_ZSS = self.FPCP.flags & ToyotaFrogPilotFlags.ZSS.value
self.has_can_filter = self.FPCP.flags & ToyotaStarPilotFlags.RADAR_CAN_FILTER.value
self.has_SDSU = self.FPCP.flags & ToyotaStarPilotFlags.SMART_DSU.value
self.has_ZSS = self.FPCP.flags & ToyotaStarPilotFlags.ZSS.value
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
@@ -111,7 +111,7 @@ class CarState(CarStateBase):
cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RL"],
cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RR"],
)
ret.vEgoCluster = ret.vEgo * frogpilot_toggles.cluster_offset
ret.vEgoCluster = ret.vEgo * starpilot_toggles.cluster_offset
ret.standstill = abs(ret.vEgoRaw) < 1e-3
@@ -222,8 +222,8 @@ class CarState(CarStateBase):
buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
if self.has_SDSU and not self.has_can_filter:
prev_distance_button = self.distance_button
+2 -2
View File
@@ -80,8 +80,8 @@ class ToyotaFlags(IntFlag):
SNG_WITHOUT_DSU_DEPRECATED = 512
# FrogPilot variables
class ToyotaFrogPilotFlags(IntFlag):
# StarPilot variables
class ToyotaStarPilotFlags(IntFlag):
RADAR_CAN_FILTER = 1
SMART_DSU = 2
ZSS = 4
@@ -32,7 +32,7 @@ class CarController(CarControllerBase):
self.hca_frame_timer_running = 0
self.hca_frame_same_torque = 0
def update(self, CC, CS, now_nanos, frogpilot_toggles):
def update(self, CC, CS, now_nanos, starpilot_toggles):
actuators = CC.actuators
hud_control = CC.hudControl
can_sends = []
@@ -88,7 +88,7 @@ class CarController(CarControllerBase):
acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.longActive)
accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if CC.longActive else 0)
stopping = actuators.longControlState == LongCtrlState.stopping
starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < frogpilot_toggles.vEgoStopping)
starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < starpilot_toggles.vEgoStopping)
can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, self.CAN.pt, CS.acc_type, CC.longActive, accel,
acc_control, stopping, starting, CS.esp_hold_confirmation))
@@ -43,7 +43,7 @@ class CarState(CarStateBase):
return button_events
def update(self, can_parsers, frogpilot_toggles) -> structs.CarState:
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
pt_cp = can_parsers[Bus.pt]
cam_cp = can_parsers[Bus.cam]
ext_cp = pt_cp if self.CP.networkLocation == NetworkLocation.fwdCamera else cam_cp
@@ -139,8 +139,8 @@ class CarState(CarStateBase):
self.frame += 1
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
@@ -234,8 +234,8 @@ class CarState(CarStateBase):
self.frame += 1
# FrogPilot variables
fp_ret = custom.FrogPilotCarState.new_message()
# StarPilot variables
fp_ret = custom.StarPilotCarState.new_message()
return ret, fp_ret
+1 -1
View File
@@ -9,6 +9,6 @@ class ALTERNATIVE_EXPERIENCE:
RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX = 8
ALLOW_AEB = 16
# FrogPilot variables
# StarPilot variables
ALWAYS_ON_LATERAL = 32
GM_REMAP_CANCEL_TO_DISTANCE = 64
+2 -2
View File
@@ -268,7 +268,7 @@ extern bool acc_main_on; // referred to as "ACC off" in ISO 15622:2018
extern int cruise_button_prev;
extern bool safety_rx_checks_invalid;
// FrogPilot variables
// StarPilot variables
extern bool aol_allowed;
extern bool lkas_button_prev;
extern bool lkas_on;
@@ -317,7 +317,7 @@ extern bool gm_remote_start_boots_comma;
// This flag allows AEB to be commanded from openpilot.
#define ALT_EXP_ALLOW_AEB 16
// FrogPilot variables
// StarPilot variables
#define ALT_EXP_ALWAYS_ON_LATERAL 32
#define ALT_EXP_GM_REMAP_CANCEL_TO_DISTANCE 64
+1 -1
View File
@@ -79,7 +79,7 @@ static void chrysler_rx_hook(const CANPacket_t *msg) {
bool cruise_engaged = GET_BIT(msg, 21U);
pcm_cruise_check(cruise_engaged);
// FrogPilot variables
// StarPilot variables
acc_main_on = GET_BIT(msg, 20U);
}
+1 -1
View File
@@ -159,7 +159,7 @@ static void ford_rx_hook(const CANPacket_t *msg) {
bool cruise_engaged = (cruise_state == 4U) || (cruise_state == 5U);
pcm_cruise_check(cruise_engaged);
// FrogPilot variables
// StarPilot variables
acc_main_on = (cruise_state == 3U) || cruise_engaged;
}
}
+1 -1
View File
@@ -350,7 +350,7 @@ static void gm_rx_hook(const CANPacket_t *msg) {
}
}
// FrogPilot variables
// StarPilot variables
if (msg->addr == 0xC9U) {
acc_main_on = GET_BIT(msg, 29U);
}
+5 -5
View File
@@ -52,7 +52,7 @@ const LongitudinalLimits HYUNDAI_LONG_LIMITS = {
#define HYUNDAI_FCEV_GAS_ADDR_CHECK \
{.msg = {{0x91, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
// FrogPilot variables
// StarPilot variables
#define HYUNDAI_LDA_BUTTON_ADDR_CHECK \
{.msg = {{0x391, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
@@ -178,7 +178,7 @@ static void hyundai_rx_hook(const CANPacket_t *msg) {
brake_pressed = ((msg->data[5] >> 5U) & 0x3U) == 0x2U;
}
// FrogPilot variables
// StarPilot variables
if (msg->addr == 0x391U) {
hyundai_lkas_button_check(GET_BIT(msg, 4U));
}
@@ -288,7 +288,7 @@ static safety_config hyundai_init(uint16_t param) {
HYUNDAI_FCEV_GAS_ADDR_CHECK
};
// FrogPilot variables
// StarPilot variables
static RxCheck hyundai_long_rx_checks_lda[] = {
HYUNDAI_COMMON_RX_CHECKS(false)
HYUNDAI_LDA_BUTTON_ADDR_CHECK
@@ -325,7 +325,7 @@ static safety_config hyundai_init(uint16_t param) {
HYUNDAI_SCC12_ADDR_CHECK(2)
};
// FrogPilot variables
// StarPilot variables
static RxCheck hyundai_cam_scc_rx_checks_lda[] = {
HYUNDAI_COMMON_RX_CHECKS(false)
HYUNDAI_SCC12_ADDR_CHECK(2)
@@ -349,7 +349,7 @@ static safety_config hyundai_init(uint16_t param) {
HYUNDAI_FCEV_GAS_ADDR_CHECK
};
// FrogPilot variables
// StarPilot variables
static RxCheck hyundai_rx_checks_lda[] = {
HYUNDAI_COMMON_RX_CHECKS(false)
HYUNDAI_SCC12_ADDR_CHECK(0)
@@ -89,13 +89,13 @@ static void hyundai_canfd_rx_hook(const CANPacket_t *msg) {
cruise_button = msg->data[2] & 0x7U;
main_button = GET_BIT(msg, 19U);
// FrogPilot variables
// StarPilot variables
hyundai_lkas_button_check(GET_BIT(msg, 23U));
} else {
cruise_button = (msg->data[4] >> 4) & 0x7U;
main_button = GET_BIT(msg, 34U);
// FrogPilot variables
// StarPilot variables
hyundai_lkas_button_check(GET_BIT(msg, 39U));
}
hyundai_common_cruise_buttons_check(cruise_button, main_button);
@@ -42,7 +42,7 @@ bool hyundai_fcev_gas_signal = false;
extern bool hyundai_alt_limits_2;
bool hyundai_alt_limits_2 = false;
// FrogPilot variables
// StarPilot variables
extern bool hyundai_has_lda_button;
bool hyundai_has_lda_button = false;
@@ -57,7 +57,7 @@ void hyundai_common_init(uint16_t param) {
const uint16_t HYUNDAI_PARAM_FCEV_GAS = 256;
const uint16_t HYUNDAI_PARAM_ALT_LIMITS_2 = 512;
// FrogPilot variables
// StarPilot variables
const int HYUNDAI_PARAM_HAS_LDA_BUTTON = 1024;
hyundai_ev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_EV_GAS);
@@ -68,7 +68,7 @@ void hyundai_common_init(uint16_t param) {
hyundai_fcev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_FCEV_GAS);
hyundai_alt_limits_2 = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS_2);
// FrogPilot variables
// StarPilot variables
hyundai_has_lda_button = GET_FLAG(param, HYUNDAI_PARAM_HAS_LDA_BUTTON);
hyundai_last_button_interaction = HYUNDAI_PREV_BUTTON_SAMPLES;
@@ -121,7 +121,7 @@ void hyundai_common_cruise_buttons_check(const int cruise_button, const bool mai
cruise_button_prev = cruise_button;
}
// FrogPilot variables
// StarPilot variables
if (main_button && !main_button_prev) {
acc_main_on = !acc_main_on;
}
@@ -155,7 +155,7 @@ uint32_t hyundai_common_canfd_compute_checksum(const CANPacket_t *msg) {
}
#endif
// FrogPilot variables
// StarPilot variables
void hyundai_lkas_button_check(const bool lkas_button) {
if (lkas_button && !lkas_button_prev) {
lkas_on = !lkas_on;
+1 -1
View File
@@ -35,7 +35,7 @@ static void mazda_rx_hook(const CANPacket_t *msg) {
bool cruise_engaged = msg->data[0] & 0x8U;
pcm_cruise_check(cruise_engaged);
// FrogPilot variables
// StarPilot variables
acc_main_on = GET_BIT(msg, 17U);
}
+1 -1
View File
@@ -51,7 +51,7 @@ static void nissan_rx_hook(const CANPacket_t *msg) {
pcm_cruise_check(cruise_engaged);
}
// FrogPilot variables
// StarPilot variables
if ((msg->addr == 0x1B6U) && (msg->bus == (nissan_alt_eps ? 2U : 1U))) {
acc_main_on = GET_BIT(msg, 36U);
}
+6 -6
View File
@@ -10,7 +10,7 @@
#define PSA_DAT_BSI 1042U // RX from BSI, brake
#define PSA_LANE_KEEP_ASSIST 1010U // TX from OP, EPS
// FrogPilot variables
// StarPilot variables
#define PSA_HS2_DYN1_MDD_ETAT_2B6 694U // RX from BSI, ACC status
// CAN bus
@@ -24,7 +24,7 @@ static uint8_t psa_get_counter(const CANPacket_t *msg) {
cnt = (msg->data[3] >> 4) & 0xFU;
} else if (msg->addr == PSA_HS2_DYN_ABR_38D) {
cnt = (msg->data[5] >> 4) & 0xFU;
// FrogPilot variables
// StarPilot variables
} else if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) {
cnt = (msg->data[7] >> 4) & 0xFU;
} else {
@@ -38,7 +38,7 @@ static uint32_t psa_get_checksum(const CANPacket_t *msg) {
chksum = msg->data[5] & 0xFU;
} else if (msg->addr == PSA_HS2_DYN_ABR_38D) {
chksum = msg->data[5] & 0xFU;
// FrogPilot variables
// StarPilot variables
} else if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) {
chksum = msg->data[7] & 0xFU;
} else {
@@ -68,7 +68,7 @@ static uint32_t psa_compute_checksum(const CANPacket_t *msg) {
chk = _psa_compute_checksum(msg, 0x4, 5);
} else if (msg->addr == PSA_HS2_DYN_ABR_38D) {
chk = _psa_compute_checksum(msg, 0x7, 5);
// FrogPilot variables
// StarPilot variables
} else if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) {
chk = _psa_compute_checksum(msg, 0x3, 7);
} else {
@@ -96,7 +96,7 @@ static void psa_rx_hook(const CANPacket_t *msg) {
if (msg->addr == PSA_HS2_DAT_MDD_CMD_452) {
pcm_cruise_check((msg->data[2U] >> 7U) & 1U); // RVV_ACC_ACTIVATION_REQ
}
// FrogPilot variables
// StarPilot variables
if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) {
acc_main_on = (msg->data[3] & 0x0FU) > 2;
}
@@ -153,7 +153,7 @@ static safety_config psa_init(uint16_t param) {
{.msg = {{PSA_DYN_CMM, PSA_MAIN_BUS, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // gas pedal
{.msg = {{PSA_DAT_BSI, PSA_CAM_BUS, 8, 20U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // brake
// FrogPilot variables
// StarPilot variables
{.msg = {{PSA_HS2_DYN1_MDD_ETAT_2B6, PSA_ADAS_BUS, 8, 20U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // ACC status
};
+1 -1
View File
@@ -98,7 +98,7 @@ static void rivian_rx_hook(const CANPacket_t *msg) {
const int feature_status = msg->data[2] >> 5U;
pcm_cruise_check(feature_status == 1);
// FrogPilot variables
// StarPilot variables
acc_main_on = (feature_status == 0) || (feature_status == 1);
}
}
+1 -1
View File
@@ -110,7 +110,7 @@ static void subaru_rx_hook(const CANPacket_t *msg) {
bool cruise_engaged = (msg->data[5] >> 1) & 1U;
pcm_cruise_check(cruise_engaged);
// FrogPilot variables
// StarPilot variables
acc_main_on = GET_BIT(msg, 40U);
}
@@ -34,7 +34,7 @@ static void subaru_preglobal_rx_hook(const CANPacket_t *msg) {
bool cruise_engaged = (msg->data[6] >> 1) & 1U;
pcm_cruise_check(cruise_engaged);
// FrogPilot variables
// StarPilot variables
acc_main_on = GET_BIT(msg, 48U);
}
+1 -1
View File
@@ -160,7 +160,7 @@ static void tesla_rx_hook(const CANPacket_t *msg) {
pcm_cruise_check(cruise_engaged);
// FrogPilot variables
// StarPilot variables
acc_main_on = ((cruise_state == 1) || cruise_engaged) && !tesla_autopark;
}
+2 -2
View File
@@ -39,7 +39,7 @@
#define TOYOTA_COMMON_RX_CHECKS(lta) \
{.msg = {{ 0xaa, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
{.msg = {{0x260, 0, 8, 50U, .ignore_counter = true, .ignore_quality_flag=!(lta)}, { 0 }, { 0 }}}, \
/* FrogPilot Variables */ \
/* StarPilot Variables */ \
{.msg = {{0x1D3, 0, 8, 33U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
#define TOYOTA_RX_CHECKS(lta) \
@@ -162,7 +162,7 @@ static void toyota_rx_hook(const CANPacket_t *msg) {
UPDATE_VEHICLE_SPEED(speed / 4.0 * 0.01 * KPH_TO_MS);
}
// FrogPilot variables
// StarPilot variables
if (msg->addr == 0x1D3U) {
acc_main_on = GET_BIT(msg, 15U);
}
+3 -3
View File
@@ -60,7 +60,7 @@ bool acc_main_on = false; // referred to as "ACC off" in ISO 15622:2018
int cruise_button_prev = 0;
bool safety_rx_checks_invalid = false;
// FrogPilot variables
// StarPilot variables
bool aol_allowed = false;
bool lkas_button_prev = false;
bool lkas_on = false;
@@ -375,7 +375,7 @@ static void generic_rx_checks(void) {
}
steering_disengage_prev = steering_disengage;
// FrogPilot variables
// StarPilot variables
aol_allowed = (acc_main_on || lkas_on) && (alternative_experience & ALT_EXP_ALWAYS_ON_LATERAL);
}
@@ -501,7 +501,7 @@ int set_safety_hooks(uint16_t mode, uint16_t param) {
enable_gas_interceptor = false;
gas_interceptor_prev = 0;
// FrogPilot variables
// StarPilot variables
aol_allowed = false;
lkas_button_prev = false;
lkas_on = false;
+2 -2
View File
@@ -310,7 +310,7 @@ class TorqueSteeringSafetyTestBase(SafetyTestBase, abc.ABC):
for _ in range(10):
self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 1)))
# FrogPilot variables
# StarPilot variables
def _toggle_aol(self, toggle_on):
"""Toggles "Always On Lateral" On/Off"""
pass
@@ -851,7 +851,7 @@ class AngleSteeringSafetyTest(VehicleSpeedSafetyTest):
for _ in range(5):
self.assertTrue(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
# FrogPilot variables
# StarPilot variables
def _toggle_aol(self, toggle_on):
"""Toggles "Always On Lateral" on/off"""
pass
@@ -71,7 +71,7 @@ class HyundaiButtonBase:
self.assertEqual(controls_allowed, self.safety.get_controls_allowed())
self._rx(self._button_msg(Buttons.NONE))
# FrogPilot variables
# StarPilot variables
def _toggle_aol(self, toggle_on):
"""
Simulates toggling the main cruise button. The safety model requires a
@@ -71,7 +71,7 @@ class TestChryslerSafety(common.CarSafetyTest, common.MotorTorqueSteeringSafetyT
self.assertFalse(self._tx(self._button_msg(cancel=True, resume=True)))
self.assertFalse(self._tx(self._button_msg(cancel=False, resume=False)))
# FrogPilot variables
# StarPilot variables
def _toggle_aol(self, toggle_on):
# DAS_3, bit 20 is ACC_AVAILABLE
values = {"ACC_AVAILABLE": 1 if toggle_on else 0}
@@ -378,7 +378,7 @@ class TestFordSafetyBase(common.CarSafetyTest):
for bus in (0, 2):
self.assertEqual(enabled, self._tx(self._acc_button_msg(Buttons.CANCEL, bus)))
# FrogPilot variables
# StarPilot variables
def _toggle_aol(self, toggle_on):
# EngBrakeData, CcStat_D_Actl is the cruise state
# 3 is standby (main on), 5 is active (engaged)

Some files were not shown because too many files have changed in this diff Show More