remove tici-specific code (#36078)

* remove tici-specific code

* lil more

* update those
pypanda
Adeeb Shihadeh 2 weeks ago committed by GitHub
parent 63961dec45
commit 3e2549f2b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      README.md
  2. 1
      common/params_keys.h
  3. 2
      docs/CONTRIBUTING.md
  4. 8
      docs/how-to/connect-to-comma.md
  5. 2
      docs/how-to/replay-a-drive.md
  6. 2
      docs/how-to/turn-the-speed-blue.md
  7. 2
      mkdocs.yml
  8. 5
      selfdrive/pandad/pandad.py
  9. BIN
      selfdrive/pandad/tests/bootstub.panda.bin
  10. 6
      selfdrive/pandad/tests/test_pandad.py
  11. 3
      selfdrive/pandad/tests/test_pandad_spi.py
  12. 4
      selfdrive/selfdrived/alerts_offroad.json
  13. 10
      selfdrive/selfdrived/selfdrived.py
  14. 2
      selfdrive/ui/tests/test_ui/run.py
  15. 3
      selfdrive/ui/ui.cc
  16. 5
      selfdrive/ui/ui_state.py
  17. 2
      system/camerad/cameras/hw.h
  18. 7
      system/hardware/hardwared.py
  19. 12
      system/hardware/tici/amplifier.py
  20. 15
      system/hardware/tici/hardware.py
  21. 5
      system/hardware/tici/pins.py
  22. 5
      system/ui/reset.py
  23. 6
      system/updated/updated.py

@ -42,10 +42,10 @@ Using openpilot in a car
------ ------
To use openpilot in a car, you need four things: To use openpilot in a car, you need four things:
1. **Supported Device:** a comma 3/3X, available at [comma.ai/shop](https://comma.ai/shop/comma-3x). 1. **Supported Device:** a comma 3X, available at [comma.ai/shop](https://comma.ai/shop/comma-3x).
2. **Software:** The setup procedure for the comma 3/3X allows users to enter a URL for custom software. Use the URL `openpilot.comma.ai` to install the release version. 2. **Software:** The setup procedure for the comma 3X allows users to enter a URL for custom software. Use the URL `openpilot.comma.ai` to install the release version.
3. **Supported Car:** Ensure that you have one of [the 275+ supported cars](docs/CARS.md). 3. **Supported Car:** Ensure that you have one of [the 275+ supported cars](docs/CARS.md).
4. **Car Harness:** You will also need a [car harness](https://comma.ai/shop/car-harness) to connect your comma 3/3X to your car. 4. **Car Harness:** You will also need a [car harness](https://comma.ai/shop/car-harness) to connect your comma 3X to your car.
We have detailed instructions for [how to install the harness and device in a car](https://comma.ai/setup). Note that it's possible to run openpilot on [other hardware](https://blog.comma.ai/self-driving-car-for-free/), although it's not plug-and-play. We have detailed instructions for [how to install the harness and device in a car](https://comma.ai/setup). Note that it's possible to run openpilot on [other hardware](https://blog.comma.ai/self-driving-car-for-free/), although it's not plug-and-play.

@ -94,7 +94,6 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"Offroad_NeosUpdate", {CLEAR_ON_MANAGER_START, JSON}}, {"Offroad_NeosUpdate", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_NoFirmware", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}}, {"Offroad_NoFirmware", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}},
{"Offroad_Recalibration", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}}, {"Offroad_Recalibration", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}},
{"Offroad_StorageMissing", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_TemperatureTooHigh", {CLEAR_ON_MANAGER_START, JSON}}, {"Offroad_TemperatureTooHigh", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_UnregisteredHardware", {CLEAR_ON_MANAGER_START, JSON}}, {"Offroad_UnregisteredHardware", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_UpdateFailed", {CLEAR_ON_MANAGER_START, JSON}}, {"Offroad_UpdateFailed", {CLEAR_ON_MANAGER_START, JSON}},

@ -39,7 +39,7 @@ All of these are examples of good PRs:
### First contribution ### First contribution
[Projects / openpilot bounties](https://github.com/orgs/commaai/projects/26/views/1?pane=info) is the best place to get started and goes in-depth on what's expected when working on a bounty. [Projects / openpilot bounties](https://github.com/orgs/commaai/projects/26/views/1?pane=info) is the best place to get started and goes in-depth on what's expected when working on a bounty.
There's lot of bounties that don't require a comma 3/3X or a car. There's lot of bounties that don't require a comma 3X or a car.
## Pull Requests ## Pull Requests

@ -1,11 +1,11 @@
# connect to a comma 3/3X # connect to a comma 3X
A comma 3/3X is a normal [Linux](https://github.com/commaai/agnos-builder) computer that exposes [SSH](https://wiki.archlinux.org/title/Secure_Shell) and a [serial console](https://wiki.archlinux.org/title/Working_with_the_serial_console). A comma 3X is a normal [Linux](https://github.com/commaai/agnos-builder) computer that exposes [SSH](https://wiki.archlinux.org/title/Secure_Shell) and a [serial console](https://wiki.archlinux.org/title/Working_with_the_serial_console).
## Serial Console ## Serial Console
On both the comma three and 3X, the serial console is accessible from the main OBD-C port. On both the comma three and 3X, the serial console is accessible from the main OBD-C port.
Connect the comma 3/3X to your computer with a normal USB C cable, or use a [comma serial](https://comma.ai/shop/comma-serial) for steady 12V power. Connect the comma 3X to your computer with a normal USB C cable, or use a [comma serial](https://comma.ai/shop/comma-serial) for steady 12V power.
On the comma three, the serial console is exposed through a UART-to-USB chip, and `tools/scripts/serial.sh` can be used to connect. On the comma three, the serial console is exposed through a UART-to-USB chip, and `tools/scripts/serial.sh` can be used to connect.
@ -45,7 +45,7 @@ In order to use ADB on your device, you'll need to perform the following steps u
* Here's an example command for connecting to your device using its tethered connection: `adb connect 192.168.43.1:5555` * Here's an example command for connecting to your device using its tethered connection: `adb connect 192.168.43.1:5555`
> [!NOTE] > [!NOTE]
> The default port for ADB is 5555 on the comma 3/3X. > The default port for ADB is 5555 on the comma 3X.
For more info on ADB, see the [Android Debug Bridge (ADB) documentation](https://developer.android.com/tools/adb). For more info on ADB, see the [Android Debug Bridge (ADB) documentation](https://developer.android.com/tools/adb).

@ -8,7 +8,7 @@ Replaying is a critical tool for openpilot development and debugging.
Just run `tools/replay/replay --demo`. Just run `tools/replay/replay --demo`.
## Replaying CAN data ## Replaying CAN data
*Hardware required: jungle and comma 3/3X* *Hardware required: jungle and comma 3X*
1. Connect your PC to a jungle. 1. Connect your PC to a jungle.
2. 2.

@ -3,7 +3,7 @@
In 30 minutes, we'll get an openpilot development environment set up on your computer and make some changes to openpilot's UI. In 30 minutes, we'll get an openpilot development environment set up on your computer and make some changes to openpilot's UI.
And if you have a comma 3/3X, we'll deploy the change to your device for testing. And if you have a comma 3X, we'll deploy the change to your device for testing.
## 1. Set up your development environment ## 1. Set up your development environment

@ -21,7 +21,7 @@ nav:
- What is openpilot?: getting-started/what-is-openpilot.md - What is openpilot?: getting-started/what-is-openpilot.md
- How-to: - How-to:
- Turn the speed blue: how-to/turn-the-speed-blue.md - Turn the speed blue: how-to/turn-the-speed-blue.md
- Connect to a comma 3/3X: how-to/connect-to-comma.md - Connect to a comma 3X: how-to/connect-to-comma.md
# - Make your first pull request: how-to/make-first-pr.md # - Make your first pull request: how-to/make-first-pr.md
#- Replay a drive: how-to/replay-a-drive.md #- Replay a drive: how-to/replay-a-drive.md
- Concepts: - Concepts:

@ -85,11 +85,6 @@ def main() -> None:
cloudlog.event("pandad.flash_and_connect", count=count) cloudlog.event("pandad.flash_and_connect", count=count)
params.remove("PandaSignatures") params.remove("PandaSignatures")
# TODO: remove this in the next AGNOS
# wait until USB is up before counting
if time.monotonic() < 60.:
no_internal_panda_count = 0
# Handle missing internal panda # Handle missing internal panda
if no_internal_panda_count > 0: if no_internal_panda_count > 0:
if no_internal_panda_count == 3: if no_internal_panda_count == 3:

@ -22,8 +22,6 @@ class TestPandad:
if len(Panda.list()) == 0: if len(Panda.list()) == 0:
self._run_test(60) self._run_test(60)
self.spi = HARDWARE.get_device_type() != 'tici'
def teardown_method(self): def teardown_method(self):
managed_processes['pandad'].stop() managed_processes['pandad'].stop()
@ -106,11 +104,9 @@ class TestPandad:
# - 0.2s pandad -> pandad # - 0.2s pandad -> pandad
# - plus some buffer # - plus some buffer
print("startup times", ts, sum(ts) / len(ts)) print("startup times", ts, sum(ts) / len(ts))
assert 0.1 < (sum(ts)/len(ts)) < (0.7 if self.spi else 5.0) assert 0.1 < (sum(ts)/len(ts)) < 0.7
def test_protocol_version_check(self): def test_protocol_version_check(self):
if not self.spi:
pytest.skip("SPI test")
# flash old fw # flash old fw
fn = os.path.join(HERE, "bootstub.panda_h7_spiv0.bin") fn = os.path.join(HERE, "bootstub.panda_h7_spiv0.bin")
self._flash_bootstub_and_test(fn, expect_mismatch=True) self._flash_bootstub_and_test(fn, expect_mismatch=True)

@ -6,7 +6,6 @@ import random
import cereal.messaging as messaging import cereal.messaging as messaging
from cereal.services import SERVICE_LIST from cereal.services import SERVICE_LIST
from openpilot.system.hardware import HARDWARE
from openpilot.selfdrive.test.helpers import with_processes from openpilot.selfdrive.test.helpers import with_processes
from openpilot.selfdrive.pandad.tests.test_pandad_loopback import setup_pandad, send_random_can_messages from openpilot.selfdrive.pandad.tests.test_pandad_loopback import setup_pandad, send_random_can_messages
@ -16,8 +15,6 @@ JUNGLE_SPAM = "JUNGLE_SPAM" in os.environ
class TestBoarddSpi: class TestBoarddSpi:
@classmethod @classmethod
def setup_class(cls): def setup_class(cls):
if HARDWARE.get_device_type() == 'tici':
pytest.skip("only for spi pandas")
os.environ['STARTED'] = '1' os.environ['STARTED'] = '1'
os.environ['SPI_ERR_PROB'] = '0.001' os.environ['SPI_ERR_PROB'] = '0.001'
if not JUNGLE_SPAM: if not JUNGLE_SPAM:

@ -29,10 +29,6 @@
"text": "Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.", "text": "Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.",
"severity": 1 "severity": 1
}, },
"Offroad_StorageMissing": {
"text": "NVMe drive not mounted.",
"severity": 1
},
"Offroad_CarUnrecognized": { "Offroad_CarUnrecognized": {
"text": "openpilot was unable to identify your car. Your car is either unsupported or its ECUs are not recognized. Please submit a pull request to add the firmware versions to the proper vehicle. Need help? Join discord.comma.ai.", "text": "openpilot was unable to identify your car. Your car is either unsupported or its ECUs are not recognized. Please submit a pull request to add the firmware versions to the proper vehicle. Need help? Join discord.comma.ai.",
"severity": 0 "severity": 0

@ -21,7 +21,6 @@ from openpilot.selfdrive.selfdrived.helpers import ExcessiveActuationCheck
from openpilot.selfdrive.selfdrived.state import StateMachine from openpilot.selfdrive.selfdrived.state import StateMachine
from openpilot.selfdrive.selfdrived.alertmanager import AlertManager, set_offroad_alert from openpilot.selfdrive.selfdrived.alertmanager import AlertManager, set_offroad_alert
from openpilot.system.hardware import HARDWARE
from openpilot.system.version import get_build_metadata from openpilot.system.version import get_build_metadata
REPLAY = "REPLAY" in os.environ REPLAY = "REPLAY" in os.environ
@ -122,13 +121,6 @@ class SelfdriveD:
self.state_machine = StateMachine() self.state_machine = StateMachine()
self.rk = Ratekeeper(100, print_delay_threshold=None) self.rk = Ratekeeper(100, print_delay_threshold=None)
# some comma three with NVMe experience NVMe dropouts mid-drive that
# cause loggerd to crash on write, so ignore it only on that platform
self.ignored_processes = set()
nvme_expected = os.path.exists('/dev/nvme0n1') or (not os.path.isfile("/persist/comma/living-in-the-moment"))
if HARDWARE.get_device_type() == 'tici' and nvme_expected:
self.ignored_processes = {'loggerd', }
# Determine startup event # Determine startup event
self.startup_event = EventName.startup if build_metadata.openpilot.comma_remote and build_metadata.tested_channel else EventName.startupMaster self.startup_event = EventName.startup if build_metadata.openpilot.comma_remote and build_metadata.tested_channel else EventName.startupMaster
if not car_recognized: if not car_recognized:
@ -299,7 +291,7 @@ class SelfdriveD:
if not_running != self.not_running_prev: if not_running != self.not_running_prev:
cloudlog.event("process_not_running", not_running=not_running, error=True) cloudlog.event("process_not_running", not_running=not_running, error=True)
self.not_running_prev = not_running self.not_running_prev = not_running
if self.sm.recv_frame['managerState'] and (not_running - self.ignored_processes): if self.sm.recv_frame['managerState'] and not_running:
self.events.add(EventName.processNotRunning) self.events.add(EventName.processNotRunning)
else: else:
if not SIMULATION and not self.rk.lagging: if not SIMULATION and not self.rk.lagging:

@ -29,7 +29,7 @@ UI_DELAY = 0.1 # may be slower on CI?
TEST_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19" TEST_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19"
STREAMS: list[tuple[VisionStreamType, CameraConfig, bytes]] = [] STREAMS: list[tuple[VisionStreamType, CameraConfig, bytes]] = []
OFFROAD_ALERTS = ['Offroad_StorageMissing', 'Offroad_IsTakingSnapshot'] OFFROAD_ALERTS = ['Offroad_IsTakingSnapshot', ]
DATA: dict[str, capnp.lib.capnp._DynamicStructBuilder] = dict.fromkeys( DATA: dict[str, capnp.lib.capnp._DynamicStructBuilder] = dict.fromkeys(
["carParams", "deviceState", "pandaStates", "controlsState", "selfdriveState", ["carParams", "deviceState", "pandaStates", "controlsState", "selfdriveState",
"liveCalibration", "modelV2", "radarState", "driverMonitoringState", "carState", "liveCalibration", "modelV2", "radarState", "driverMonitoringState", "carState",

@ -54,8 +54,7 @@ static void update_state(UIState *s) {
} }
if (sm.updated("wideRoadCameraState")) { if (sm.updated("wideRoadCameraState")) {
auto cam_state = sm["wideRoadCameraState"].getWideRoadCameraState(); auto cam_state = sm["wideRoadCameraState"].getWideRoadCameraState();
float scale = (cam_state.getSensor() == cereal::FrameData::ImageSensor::AR0231) ? 6.0f : 1.0f; scene.light_sensor = std::max(100.0f - cam_state.getExposureValPercent(), 0.0f);
scene.light_sensor = std::max(100.0f - scale * cam_state.getExposureValPercent(), 0.0f);
} else if (!sm.allAliveAndValid({"wideRoadCameraState"})) { } else if (!sm.allAliveAndValid({"wideRoadCameraState"})) {
scene.light_sensor = -1; scene.light_sensor = -1;
} }

@ -105,10 +105,7 @@ class UIState:
# Handle wide road camera state updates # Handle wide road camera state updates
if self.sm.updated["wideRoadCameraState"]: if self.sm.updated["wideRoadCameraState"]:
cam_state = self.sm["wideRoadCameraState"] cam_state = self.sm["wideRoadCameraState"]
self.light_sensor = max(100.0 - cam_state.exposureValPercent, 0.0)
# Scale factor based on sensor type
scale = 6.0 if cam_state.sensor == 'ar0231' else 1.0
self.light_sensor = max(100.0 - scale * cam_state.exposureValPercent, 0.0)
elif not self.sm.alive["wideRoadCameraState"] or not self.sm.valid["wideRoadCameraState"]: elif not self.sm.alive["wideRoadCameraState"] or not self.sm.valid["wideRoadCameraState"]:
self.light_sensor = -1 self.light_sensor = -1

@ -13,7 +13,7 @@ typedef enum {
ISP_BPS_PROCESSED, // fully processed image through the BPS ISP_BPS_PROCESSED, // fully processed image through the BPS
} SpectraOutputType; } SpectraOutputType;
// For the comma 3/3X three camera platform // For the comma 3X three camera platform
struct CameraConfig { struct CameraConfig {
int camera_num; int camera_num;

@ -6,7 +6,6 @@ import struct
import threading import threading
import time import time
from collections import OrderedDict, namedtuple from collections import OrderedDict, namedtuple
from pathlib import Path
import psutil import psutil
@ -334,12 +333,6 @@ def hardware_thread(end_event, hw_queue) -> None:
# to make a different decision in your software # to make a different decision in your software
startup_conditions["registered_device"] = PC or (params.get("DongleId") != UNREGISTERED_DONGLE_ID) startup_conditions["registered_device"] = PC or (params.get("DongleId") != UNREGISTERED_DONGLE_ID)
# TODO: this should move to TICI.initialize_hardware, but we currently can't import params there
if TICI and HARDWARE.get_device_type() == "tici":
if not os.path.isfile("/persist/comma/living-in-the-moment"):
if not Path("/data/media").is_mount():
set_offroad_alert_if_changed("Offroad_StorageMissing", True)
# Handle offroad/onroad transition # Handle offroad/onroad transition
should_start = all(onroad_conditions.values()) should_start = all(onroad_conditions.values())
if started_ts is None: if started_ts is None:

@ -61,18 +61,6 @@ BASE_CONFIG = [
] ]
CONFIGS = { CONFIGS = {
"tici": [
AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111),
AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100),
AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111),
AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010),
*configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)),
*configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)),
*configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)),
*configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)),
*configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)),
],
"tizi": [ "tizi": [
AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111),
AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111),

@ -425,9 +425,6 @@ class Tici(HardwareBase):
# pandad core # pandad core
affine_irq(3, "spi_geni") # SPI affine_irq(3, "spi_geni") # SPI
if "tici" in self.get_device_type():
affine_irq(3, "xhci-hcd:usb3") # aux panda USB (or potentially anything else on USB)
affine_irq(3, "xhci-hcd:usb1") # internal panda USB (also modem)
try: try:
pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip()
subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid])
@ -446,22 +443,20 @@ class Tici(HardwareBase):
cmds = [] cmds = []
if self.get_device_type() in ("tici", "tizi"): if self.get_device_type() in ("tizi", ):
# clear out old blue prime initial APN # clear out old blue prime initial APN
os.system('mmcli -m any --3gpp-set-initial-eps-bearer-settings="apn="') os.system('mmcli -m any --3gpp-set-initial-eps-bearer-settings="apn="')
cmds += [ cmds += [
# SIM hot swap
'AT+QSIMDET=1,0',
'AT+QSIMSTAT=1',
# configure modem as data-centric # configure modem as data-centric
'AT+QNVW=5280,0,"0102000000000000"', 'AT+QNVW=5280,0,"0102000000000000"',
'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00',
'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01',
] ]
if self.get_device_type() == "tizi":
# SIM hot swap, not routed on tici
cmds += [
'AT+QSIMDET=1,0',
'AT+QSIMSTAT=1',
]
elif manufacturer == 'Cavli Inc.': elif manufacturer == 'Cavli Inc.':
cmds += [ cmds += [
'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM

@ -1,5 +1,3 @@
# TODO: these are also defined in a header
# GPIO pin definitions # GPIO pin definitions
class GPIO: class GPIO:
# both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset
@ -26,7 +24,4 @@ class GPIO:
CAM2_RSTN = 12 CAM2_RSTN = 12
# Sensor interrupts # Sensor interrupts
BMX055_ACCEL_INT = 21
BMX055_GYRO_INT = 23
BMX055_MAGN_INT = 87
LSM_INT = 84 LSM_INT = 84

@ -13,7 +13,6 @@ from openpilot.system.ui.widgets import Widget
from openpilot.system.ui.widgets.button import Button, ButtonStyle from openpilot.system.ui.widgets.button import Button, ButtonStyle
from openpilot.system.ui.widgets.label import gui_label, gui_text_box from openpilot.system.ui.widgets.label import gui_label, gui_text_box
NVME = "/dev/nvme0n1"
USERDATA = "/dev/disk/by-partlabel/userdata" USERDATA = "/dev/disk/by-partlabel/userdata"
TIMEOUT = 3*60 TIMEOUT = 3*60
@ -49,10 +48,6 @@ class Reset(Widget):
if PC: if PC:
return return
# Best effort to wipe NVME
os.system(f"sudo umount {NVME}")
os.system(f"yes | sudo mkfs.ext4 {NVME}")
# Removing data and formatting # Removing data and formatting
rm = os.system("sudo rm -rf /data/*") rm = os.system("sudo rm -rf /data/*")
os.system(f"sudo umount {USERDATA}") os.system(f"sudo umount {USERDATA}")

@ -243,12 +243,6 @@ class Updater:
if b is None: if b is None:
b = self.get_branch(BASEDIR) b = self.get_branch(BASEDIR)
b = { b = {
("tici", "release3"): "release-tici",
("tici", "release3-staging"): "release-tici",
("tici", "master"): "master-tici",
("tici", "nightly"): "release-tici",
("tici", "nightly-dev"): "release-tici",
("tizi", "release3"): "release-tizi", ("tizi", "release3"): "release-tizi",
}.get((HARDWARE.get_device_type(), b), b) }.get((HARDWARE.get_device_type(), b), b)
return b return b

Loading…
Cancel
Save