From 013dae2443a5344762535173874631ed89162691 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 8 May 2024 23:06:12 -0500 Subject: [PATCH] wip --- clearpilot_devqueue_amain.txt | 40 ++++++++ clearpilot_settings.txt | 95 ++++++++++++++---- selfdrive/car/hyundai/carstate.py | 2 + selfdrive/car/hyundai/hyundaicanfd.py | 3 +- .../theme/clearpilot/images/hot.png | Bin 0 -> 35548 bytes .../theme/clearpilot/images/hot.png~ | Bin 0 -> 24748 bytes selfdrive/frogpilot/frogpilot_process.py | 29 +----- selfdrive/manager/process_config.py | 2 +- selfdrive/monitoring/driver_monitor.py | 12 +-- selfdrive/ui/ui.h | 4 +- 10 files changed, 132 insertions(+), 55 deletions(-) create mode 100644 selfdrive/clearpilot/theme/clearpilot/images/hot.png create mode 100644 selfdrive/clearpilot/theme/clearpilot/images/hot.png~ diff --git a/clearpilot_devqueue_amain.txt b/clearpilot_devqueue_amain.txt index 342a7f2..408d082 100644 --- a/clearpilot_devqueue_amain.txt +++ b/clearpilot_devqueue_amain.txt @@ -1,5 +1,38 @@ + +- Test if activation fix works for op long, submit to frog maintain +- no lateral on turn signal - only enforce if model curvature > 10 degrees, hands on wheel, or wheel override (maybe curve not necessary?) + +- disable all turn signal output commands - they are causing issues + +- test "create_acc_cancel" on canfd on cc engaged on boot + +- work on /data/userspace/qtwaylandbuild/qt5 and see if we can get it to include webview +- try extract boot image, maybe we can replace the boot logo + - Test and fix activation on button + brakes +- Create clearpilot process. manages behaviors. + +- experiment with reduced jerk values + +- if thermal warning on dash, do ghost on a beach with sun image until cooled down + +- test toggle stop all canbus output + +- make functions +--- get_curvature +--- get_wheel_angle +--- get_distance_to_left_lane +--- get_distance_to_right_lane +--- distance traveled for lane change + +behaviors: +- lane change wrong way reenable lateral +- blinker signal wheel angle minor enable lateral +- wheel angle sharp only engage lateral if over lane edge unless hands not on wheel + +- debug mode activated bu lkas + - If possible, debug what happened to frogpilot process on may 4th - See where disk free is going with NCDU and add smarter log rotation - Maybe this has logs where it could show what happened to frogpilot process? @@ -14,6 +47,9 @@ - set up dash cam recordings - disable dash cam and record in real logger mode if debug mode is entered +- Integrate here maps api for traffic data + - maybe even speed limit data? and location data? + - write a debug function for python that cats data to a screen terminal and optionally a log file - if cruise already engaged when boot, just enable lateral - reengage lateral if changing lanes and changing the wrong way @@ -28,3 +64,7 @@ - change disk used on sidebar to disk free / percent used - show distance to lead on dash - warn if lead is going more than 30 under my speed or 20 if auto mode is off + +- mark os version different than release, forcing a os reinstall +- no prompt on os reinstall + diff --git a/clearpilot_settings.txt b/clearpilot_settings.txt index e16c3c2..551d099 100644 --- a/clearpilot_settings.txt +++ b/clearpilot_settings.txt @@ -12,31 +12,49 @@ Today: - Can I get a web ui running? Settings Design: -Main: +Main: Basic curated settings: +- Enable openpilot +- Enable dashcam +- Driving assist when cruise control not engaged +- Reduce speed on curves +- Hold speed for auto speed limit +- Speed limit offset +- Lane change assist on / off (off = pause on lane change) +- LKAS button behavior +- Reset all other settings to defaults +- Require steering wheel Always / At Night / Never Driving: - Openpilot - On (D), off (all stock) -- Lane Change Assist: None (D), Nudge, Nudgeless -- Always On Lat: OP, Stock, Off. OP: Pause below X mph +- Lane Change Assist: None, No lateral, Nudge, Nudgeless +- Op Long / Button Spam Long / Stock Long +- Always On Lat: OP, Stock, Off. OP: Pause below X mph, OP: Except when wheel not turning - Auto Stock Lat: Cruise Off + Wheel, Off - Reduce speed on curves: On (D) / Off - (V2) Hold speed on lane change: On / Off -- Resume from stop on cruise: On (D) / Off - Auto Speed Offsets - (make display green when speed matches mph) +- Resume from stop on cruise: On (D) / Off - Increase Speed with lead when Auto - Speed up / down - toggle match speed to limit -Controls: -- (V2) LKAS button: - - Standard behavior is tap for screen on / off. - - Options: - - Tap: for on / off, on / wireframe / off, on / weather / off, op lat, stock lat, no lat, match speed, toggle auto speed - - Hold: Same ^ -- Info buttons: - - (Depends on what i can input / output on info bus) +- LKAS button behavior tap / hold + - screen on / off + - cycle info screens + - extended info overlay on/off Display: - Display - On, On when engaged, Wireframe with passenger, Off with passenger, Off - Engagement indicator: Border, small label, icon - Parked: Weather, trip stats / map, static image, off -- Boot Icon: Comma, clearpilot, pacman, car make, custom, off +- Boot Icon: Comma, clearpilot, pacman, car make, custom, off' +- Info in overlay or large status bar +- Info screens (enable in transit, stopped): +- Colors for lines on display +--- Settings: Hold time (time to reset), default screen +--- Weather (hourly forecast, radar) +--- World map +--- Drive info (curvature, speed, speed to lead, etc) +--- System info (temp, space, system load, connectivity) +--- Debug info (data read from canbus, button states) +--- Generic logo +--- Screen off Safety & Alerts: - Attention Monitor: Strict, (D) Relaxed Daytime / No Lead / Low Traffic, Relaxed (Privledged), Off (Privledged) - ATN: Strict on unrecognized driver @@ -49,26 +67,67 @@ Safety & Alerts: - Lead Departure Warning - Over Speed Warning - Weather alerts +- Enable / Disable UI elements +--- MPH +--- Location +--- GPS, Wifi connectivity on +--- GPS, Wifi connectivity off +--- Experimental MPH +--- Distance to lead +--- Speed for lead +--- Current speed limit Car: - Auto set climate - Auto close sunroof / windows - Auto open sunroof shield night / close day - Auto set "SMART" - Auto set UI MPH +Recording: +- Record routes +- Record dashcam +- Show dashcam recording blinking +- Record passenger camera (requires blinking) +- Record passenger audio (requires mic, requires notice) +- Serve on wifi +- Upload on wifi System: - (V2) Enable OpenPilot - Always, on recognized driver, off - (V2) Register recognized driver (requires a bt dongle) - (V2) Settings lockout pin -- (V2) Dash Cam - Off, retention days, upload endpoint, record gps - (V2) Metered Wifi Network - (V2) High BW Wifi Network - (V2) Hotspot (select secondary wifi) +- Clearpilot base (set a url / access token for server control) +--- Provides: +--- Settings backup / restore +--- Settings lockout +--- File overrides (beat the monitor) +--- Current location / image +--- Dashcam recordings +--- Route history +--- SSH tunnel +--- Debugger console - Wifi Settings -- SSH Access +-- No bandwidth limit networks +-- Bandwidth limited networks +-- Hotspot device / network (requires external dongle) +- Bluetooth setting (requires external dongle) +-- Pair a keypad +-- Emulate a device for tasker automations +- SSH Access (get rid of the github model) +- Device Shutdown Timer +- Override temp warnings +Tools: +- Reset calibration +- Update software +- Switch branches +- Reboot clearpilot +- Reset clearpilot +- Uninstall clearpilot - Canbus tools - Record Canbus - Show I/O State (overrides driving UI while engaged) - Test Output -- Reset calibration -- Reset device -- Device Shutdown Timer +- Test OP Canbus functionality (blinkers, disengage, etc) +Advanced: +- Selected frogpilot settings \ No newline at end of file diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 208b75c..9131e1b 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -285,6 +285,8 @@ class CarState(CarStateBase): # test if this blocks trying to engage while pressin brakes if self.main_buttons[-1] != 0 and ret.brakePressed and self.main_enabled == False: self.main_buttons[-1] = 0 + # Suprisingly this works. Test with op long and submit. + # But enable always on lateral if self.main_enabled = false # I think this may require an override variable? # It looks like always on lat is only set when cruise control is enabled diff --git a/selfdrive/car/hyundai/hyundaicanfd.py b/selfdrive/car/hyundai/hyundaicanfd.py index 6c3bed0..5557988 100644 --- a/selfdrive/car/hyundai/hyundaicanfd.py +++ b/selfdrive/car/hyundai/hyundaicanfd.py @@ -169,9 +169,10 @@ def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_ov return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) - +# Disabled blinker messages def create_spas_messages(packer, CAN, frame, left_blink, right_blink): ret = [] + return ret values = { } diff --git a/selfdrive/clearpilot/theme/clearpilot/images/hot.png b/selfdrive/clearpilot/theme/clearpilot/images/hot.png new file mode 100644 index 0000000000000000000000000000000000000000..394db395e12591b6e6e8777c34b289c3ff1dfd29 GIT binary patch literal 35548 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 literal 0 HcmV?d00001 diff --git a/selfdrive/clearpilot/theme/clearpilot/images/hot.png~ b/selfdrive/clearpilot/theme/clearpilot/images/hot.png~ new file mode 100644 index 0000000000000000000000000000000000000000..0da094c655822f619f698f0c4b1c161fbbf3b5c6 GIT binary patch literal 24748 zcmeF2WmB77xVD44OK~l3!KJvB0>vGQyF+kyr?|Tn_X5S;gBN!%7ToRS*)#k5`vZ0+ z_hcqBNhWJucAw|5B9#=rq9GF@0{{TDZ!(f9007k3#}$bP|M3p85{T^M1r{X!O%3tm z;e%)z0RT_{zDbIyd1Rku=t_<|Jj@9v?5BJ*R(Z{KDDZ=zfR9L=cY{;(-|2 zFQ^efaf(UMN86`wLNbC(f;|4N^)_y#3oXSb4qq@VOX;X3%~#iHh*@W|6l!Ln?dE1^ z?*6;hbHlscLF6PQ4&?Vnt*Bw9ZeecbuDJ=Rd487sd)AiHJtmmqdi*kZp1lc!2`l!0 z&;MJ2|L+ypo(ao{%uq+;9|Wtp+HSO_YqM1deS+gWX?TuLVt7S`Xl>Jj)jrcXE6ugJRWvAyPOsa?b zCtL{j(q9 z{N`n(k-7iItNZY{Fgf6%#*XElz7J;F<=(mal#{9xLyXp7Cb!{aZ=bc;0V&9Fu-qmA z+~{|l?LcV$%FR-)voIwX{m!Ag;aa_(SxE#sKkBg2Kk%kO3{o0DlEQ@DZUF6DT=kWN zv9&=3Q6O4KnLqb=ct%Aa;}LT*Q8n0;595!vnw*kFMaYk~3R1~(cv3ac*-c6Hf~`Mk zEyH31umGH^L%bQQ!tnz803T8Uu;0*{=P6k}ZvYlnC?^MOek zZfv?#vdAk6We@ra5({hxqk#OVH^vv)J z7ji#r7X$e0e@X1Hlydvmi2>DackoloYf%xwPz=Js_LG-ko;ReKgSK7_b8BAn{v}O+ z1;u$WT2tfY;m5g7%euV;S~z8u+57&~`QxjlPp60Le50c9a?`rK-1_EOV?&Ieh_XWm zdwMogpFS>i+ckJA@_qZT*~-MkKk$A4AzqDvw6x>qRI-P3{JuKui>C4>ay;WVn0ztG z{zMQrREXoQ&S)#^k4C(Qf;JR&d!096{6 zf(Jeo3MdA3(IhSkTX<7yo`Iz!ZJa|ngj$UlsBtlGO81!yzrMZ>3@8!#+cSr_=E+fw zMTnC12ZSYN6?D$V`GSxM2O*eMh_q_f4Ja z=XOQ+w+ozqKx)b$+MeCfOhe*fUbE58)Cn2x**|Ex2~dDvkv`F?bL}#$64bG+{N|Ib zNv77kfc}lvx!AjVau|vz6-E8v$)jHFUUv2^Yxu$hcMcCpHiCjwUj4li{D|D%PTkUy<719<_h+8p| zY&3JySQ#Z{Sv)C}PVJs?Kh`)k>f^yj7Bk$eTc7866nXH&a-)6}O{69}ZoJqZEkH7G z37AvbVqp)hF1>Dw^eFhp%olha!fm#gOrUS1{PC^G<<8G}{BGcO?yo`EY3~^zDLRMk zeoBYfH8~NC0JZN7=C}-1<@aoDLZ!*|I!yB63Ctw-LZ8Cy|LiW;GiJy?LX{)f5I%OP zTe54A;)EnoAR&Z+f+H9u5Nfc&^5%AS*2bRdr+Cm?CH5_H*WT{Fl^kKJnD~RUFOIO= zg3FI9i}u|9$ECUBTr?B)pV@GT0{nM}%pKhCGotOIDfFa1mb$5YZ2kDBSxH>Q7`3P8 z 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 I|7Q{Qe>y>3KL7v# literal 0 HcmV?d00001 diff --git a/selfdrive/frogpilot/frogpilot_process.py b/selfdrive/frogpilot/frogpilot_process.py index c3018bf..c6b4dfb 100644 --- a/selfdrive/frogpilot/frogpilot_process.py +++ b/selfdrive/frogpilot/frogpilot_process.py @@ -65,9 +65,6 @@ def frogpilot_thread(): CP = None - automatic_updates = params.get_bool("AutomaticUpdates") - first_run = True - model_list_empty = params.get("AvailableModelsNames", encoding='utf-8') is None time_validated = system_time_valid() pm = messaging.PubMaster(['frogpilotPlan']) @@ -93,37 +90,15 @@ def frogpilot_thread(): sm['liveLocationKalman'], sm['modelV2'], sm['radarState']) frogpilot_planner.publish(sm, pm) - if params_memory.get("ModelToDownload", encoding='utf-8') is not None and github_pinged(): - download_model() - - if params_memory.get_bool("FrogPilotTogglesUpdated"): - automatic_updates = params.get_bool("AutomaticUpdates") - - if not params.get_bool("ModelSelector"): - params.put("Model", DEFAULT_MODEL) - params.put("ModelName", DEFAULT_MODEL_NAME) - - if started: - frogpilot_planner.update_frogpilot_params() - else: - frogpilot_functions.backup_toggles() - if not time_validated: time_validated = system_time_valid() if not time_validated: continue - if datetime.datetime.now().second == 0 or first_run or model_list_empty or params_memory.get_bool("ManualUpdateInitiated"): - if not started or model_list_empty: - time_checks(automatic_updates, deviceState, params) - model_list_empty = params.get("AvailableModelsNames", encoding='utf-8') is None - - theme_manager.update_holiday() - - first_run = False - time.sleep(DT_MDL) + + def main(): frogpilot_thread() diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index 37e92a2..c050ca2 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -100,7 +100,7 @@ procs = [ # FrogPilot processes PythonProcess("fleet_manager", "selfdrive.frogpilot.fleetmanager.fleet_manager", always_run), - # PythonProcess("frogpilot_process", "selfdrive.frogpilot.frogpilot_process", always_run), + PythonProcess("frogpilot_process", "selfdrive.frogpilot.frogpilot_process", always_run), PythonProcess("mapd", "selfdrive.frogpilot.navigation.mapd", always_run), ] diff --git a/selfdrive/monitoring/driver_monitor.py b/selfdrive/monitoring/driver_monitor.py index 44edafa..bf8e974 100644 --- a/selfdrive/monitoring/driver_monitor.py +++ b/selfdrive/monitoring/driver_monitor.py @@ -30,12 +30,12 @@ class DRIVER_MONITOR_SETTINGS(): # Goals: # - Temp only if daytime and privledged # - Continuously lower speed if in crit state - self._AWARENESS_TIME = 50. # passive wheeltouch total timeout - self._AWARENESS_PRE_TIME_TILL_TERMINAL = 30. - self._AWARENESS_PROMPT_TIME_TILL_TERMINAL = 10. - self._DISTRACTED_TIME = 50. # active monitoring total timeout - self._DISTRACTED_PRE_TIME_TILL_TERMINAL = 30. - self._DISTRACTED_PROMPT_TIME_TILL_TERMINAL = 10. + self._AWARENESS_TIME = 30. # passive wheeltouch total timeout + self._AWARENESS_PRE_TIME_TILL_TERMINAL = 20. + self._AWARENESS_PROMPT_TIME_TILL_TERMINAL = 14. + self._DISTRACTED_TIME = 30. # active monitoring total timeout + self._DISTRACTED_PRE_TIME_TILL_TERMINAL = 24. + self._DISTRACTED_PROMPT_TIME_TILL_TERMINAL = 14. self._FACE_THRESHOLD = 0.7 self._EYE_THRESHOLD = 0.65 diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 2ddb448..97564e5 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -36,7 +36,7 @@ typedef enum UIStatus { const float CENTER_LANE_ALPHA = 0.75; const float OTHER_LANE_ALPHA = 0.75; -const int CENTER_LANE_WIDTH = 75; +const int CENTER_LANE_WIDTH = 70; const int OTHER_LANE_WIDTH = 16; // Clearpilot custom colors @@ -44,7 +44,7 @@ const QColor bg_colors [] = { [STATUS_DISENGAGED] = QColor(0x17, 0x33, 0x49, 0xc8), [STATUS_OVERRIDE] = QColor(94, 112, 255, 0xd1), // When you nudge the steering wheel while engaged [STATUS_ENGAGED] = QColor(94, 112, 255, 0xd1), // Bright Blue - [STATUS_ALWAYS_ON_LATERAL_ACTIVE] = QColor(143, 204, 235, 0xd1), // Lighter Blue + [STATUS_ALWAYS_ON_LATERAL_ACTIVE] = QColor(0, 0, 255, 0xd1), // True Blue [STATUS_TRAFFIC_MODE_ACTIVE] = QColor(0xc9, 0x22, 0x31, 0xd1), // ? unused? [STATUS_EXPERIMENTAL_ACTIVE] = QColor(201, 41, 204, 0xd1), // Magenta [CENTER_LANE_COLOR] = QColor(150, 150, 150, 0xd1), // Gray