mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-08-20 07:43:48 +08:00
Do not moo
This commit is contained in:
@@ -642,12 +642,6 @@ class StarPilotVariables:
|
||||
toggle.stoppingDecelRate = CP.stoppingDecelRate
|
||||
toggle.vEgoStarting = CP.vEgoStarting
|
||||
toggle.vEgoStopping = CP.vEgoStopping
|
||||
if toggle.openpilot_longitudinal and toggle.car_make == "toyota":
|
||||
# Preserve StarPilot's established Toyota stop-state behavior without
|
||||
# coupling it to the removed FrogsGoMoo controller experiment.
|
||||
toggle.stoppingDecelRate = 0.01
|
||||
toggle.vEgoStarting = 0.1
|
||||
toggle.vEgoStopping = 0.5
|
||||
|
||||
# Keep stock tuning params synchronized for all device UIs.
|
||||
self._migrate_steer_delay_mode(steerActuatorDelay)
|
||||
|
||||
@@ -117,6 +117,17 @@
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sentry-button-danger {
|
||||
border-color: var(--danger-bg);
|
||||
color: var(--danger-fg);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sentry-button-danger:hover:not(:disabled) {
|
||||
background: var(--danger-bg);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.sentry-action-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
@@ -14,6 +14,7 @@ const state = reactive({
|
||||
liveCapture: {},
|
||||
testBusy: false,
|
||||
liveBusy: false,
|
||||
deleteBusy: false,
|
||||
pushBusy: false,
|
||||
})
|
||||
|
||||
@@ -145,6 +146,30 @@ async function sendTestPush() {
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteEvent() {
|
||||
const eventId = String(state.event?.eventId || "")
|
||||
if (!eventId || state.deleteBusy) return
|
||||
if (!window.confirm("Delete this Sentry event and its camera images? This cannot be undone.")) return
|
||||
|
||||
state.deleteBusy = true
|
||||
try {
|
||||
const response = await fetch(galaxyPath(`/api/sentry/events/${encodeURIComponent(eventId)}`), {
|
||||
method: "DELETE",
|
||||
})
|
||||
const payload = await readJsonResponse(response)
|
||||
if (!response.ok) {
|
||||
showSnackbar(payload.error || "Sentry event deletion failed.")
|
||||
return
|
||||
}
|
||||
state.event = {}
|
||||
showSnackbar("Sentry event deleted.")
|
||||
} catch (error) {
|
||||
showSnackbar(error.message || "Network error — is the device reachable?")
|
||||
} finally {
|
||||
state.deleteBusy = false
|
||||
}
|
||||
}
|
||||
|
||||
function renderEvent() {
|
||||
const event = state.event || {}
|
||||
if (!event.eventId) return html`<p class="sentry-empty">No Sentry events recorded yet.</p>`
|
||||
@@ -271,11 +296,18 @@ export function SentryMode() {
|
||||
<h3>Latest Event</h3>
|
||||
<p class="sentry-muted">Events refresh automatically every five seconds.</p>
|
||||
</div>
|
||||
${remote ? "" : html`
|
||||
<button class="sentry-button sentry-button-secondary" @click="${sendTestEvent}" disabled="${() => state.testBusy}">
|
||||
${() => state.testBusy ? "Capturing…" : "Send test capture"}
|
||||
</button>
|
||||
`}
|
||||
<div class="sentry-action-row">
|
||||
${remote ? "" : html`
|
||||
<button class="sentry-button sentry-button-secondary" @click="${sendTestEvent}" disabled="${() => state.testBusy}">
|
||||
${() => state.testBusy ? "Capturing…" : "Send test capture"}
|
||||
</button>
|
||||
`}
|
||||
${() => state.event?.eventId ? html`
|
||||
<button class="sentry-button sentry-button-danger" @click="${deleteEvent}" disabled="${() => state.deleteBusy}">
|
||||
${() => state.deleteBusy ? "Deleting…" : "Delete event"}
|
||||
</button>
|
||||
` : ""}
|
||||
</div>
|
||||
</div>
|
||||
${() => renderEvent()}
|
||||
</section>
|
||||
|
||||
@@ -7031,6 +7031,36 @@ def setup(app):
|
||||
"lastEvent": _public_sentry_event(last_event) if isinstance(last_event, dict) else {},
|
||||
})
|
||||
|
||||
@app.route("/api/sentry/events/<event_id>", methods=["DELETE"])
|
||||
def delete_sentry_event(event_id):
|
||||
if not params.get_bool("IsOffroad"):
|
||||
return jsonify({"error": "Sentry events can only be deleted while parked."}), 409
|
||||
if not event_id or event_id in {".", ".."} or Path(event_id).name != event_id:
|
||||
return jsonify({"error": "Invalid Sentry event ID."}), 400
|
||||
|
||||
deleted_storage = False
|
||||
for root in _sentry_event_roots():
|
||||
directory = (root / event_id).resolve()
|
||||
if root not in directory.parents or not directory.is_dir():
|
||||
continue
|
||||
shutil.rmtree(directory)
|
||||
deleted_storage = True
|
||||
|
||||
raw_event = params.get("SentryModeLastEvent", encoding="utf-8") or "{}"
|
||||
try:
|
||||
current_event = raw_event if isinstance(raw_event, dict) else json.loads(raw_event)
|
||||
except (TypeError, ValueError, json.JSONDecodeError):
|
||||
current_event = {}
|
||||
|
||||
cleared_latest = isinstance(current_event, dict) and str(current_event.get("eventId") or "") == event_id
|
||||
if cleared_latest:
|
||||
params.remove("SentryModeLastEvent")
|
||||
|
||||
if not deleted_storage and not cleared_latest:
|
||||
return jsonify({"error": "Sentry event not found."}), 404
|
||||
|
||||
return jsonify({"deleted": True, "eventId": event_id})
|
||||
|
||||
@app.route("/api/sentry/images/<event_id>/<filename>", methods=["GET"])
|
||||
def sentry_image(event_id, filename):
|
||||
image_path = _sentry_image_path(event_id, filename)
|
||||
|
||||
Reference in New Issue
Block a user