Candash - A simple Android app that turns your phone into an instrument cluster for your Tesla Model 3 and Y

Overview

What is CANdash?

CANdash is an Android app that turns your Android device into an instrument cluster for your Tesla Model 3 or Y. It is designed to fit in with the Tesla user experience, and add capabilities that are not in your current instrumentation, like live blind spot monitoring. For more visit https://candash.app

Screenshot_20220117-111104(1) Screenshot_20220117-111906 Screenshot_20220117-215708 Screenshot_20220117-111104(1)

Compile

Clone the repo and make sure you open the project from the android subdirectory. It should then compile normally.

Setup

First, you must purchase and install a CANserver in your tesla, if you want blind spot monitoring you will need the dual bus Tesla version. http://www.jwardell.com/canserver/ Please update your CANserver to Version 2.1 of the firmware. Easiest way is to connect your canserver to your home wifi and using a desktop browser to "check for updates" in the CANserver webui. Two options for running this app, either connect to the hotspot on the CANserver (you will lose internet connectivity, even with mobile service) or create a hotspot on your phone and connect the CANserver to it via the network settings tab. Turning on hotspot functionality on your phone is preferred if you want to use cloud connected apps like music and nav simultaneously Sideload the app to your phone, it will appear as ‘CAN Dash’ Launch the CAN Dash and long press any blank area on the screen to bring up the info pane. Once you are sure you are connected to the CANserver, click ‘scan’ and if the phone and CANserver are on the same network, the IP address should auto populate and you should start seeing data appear on the right side of the screen. Once you see this, press the ‘DASH’ button to start the dashboard. If you do not plug in the phone it will follow your display preferences for sleep and time out. If the device has power then it will keep the display on with any auto-brightness you have enabled.

Dash View

This screen should work without any user interaction required. Tap the speed units (MPH or km/h) to toggle the performance gauges Power meter on the bottom has max regen on the left and max power on the right, tap either to reset, like an odometer. Tap the center to change units from kW to HP Long press center power display to hide/show max/min Tap the battery to change range from percent to distance Tap speed to force night mode on, otherwise it will copy what the car does Blind spot monitoring is based on the ultrasonic sensors in the rear bumper, as the car does not return any blind spot data from the cameras unless the turn signal is on. If you turn on your signal and the car sees a car in your blind spot, the background of the dashboard will turn red If the phone is plugged in the screen should never turn off- let me know if it does

Auto launch

If you want to use this on a device that is always in your car, consider installing Tasker. With Tasker you can have the phone automatically turn on the hotspot when plugged in or connected to vehicle bluetooth, and turn off the hotspot when the phone is unplugged (if you have it plugged into your car, this will happen when the car sleeps) To have the phone power on automatically when plugged in, use this fastboot command: fastboot oem off-mode-charge 0

Known issues

Speed will occasionally pause for a second or two (possible CANServer issue)

Contact me with feedback or questions: [email protected]

Discord for live feedback: https://discord.gg/hNnPHVZj

Comments
  • Clear views when a signal goes missing (or disconnected from canserver)

    Clear views when a signal goes missing (or disconnected from canserver)

    This makes a few key changes:

    • if a particular signal hasn't been received in at least 5 seconds, remove that signal from carState (and update flow)
    • if we disconnect from a canserver (or mock server stopped), completely clear carState (and update flow)
    • add logic to every individual view that if the signal it relies on is null, to hide the view (or set it to "")
      • typically this uses the elvis operator whenever we .let a value from carState to run logic only when the value is null
        • note the importance of avoiding viewModel.getValue() since that uses carState history which is not cleared
      • ...but every view is a bit different, sometimes instead of changing visibility, it was necessary to set the text to empty as other logic would just change the visibility back.

    Test plan

    • testing disconnection of panda server
      • using a panda server, abruptly disconnected the server during several different scenarios:
        • driving with telltales on, blindspot arcs on, etc
        • charging
        • doors open
      • ensured that each time, all elements were cleared out and returned to default view (not stuck in charging view for example)
    • testing disconnection of mock server
      • from each cycle of the mock server, would stop the server and quickly launch dash
      • after the 2 second mock wait expired the signals would be cleared
      • ensured that all views cleared at this point
    • testing the loss of individual signals
      • connected to vehicle and vehicle "on" (after pressing brake pedal)
      • all expected views visible: speedo, temps, torque, etc
      • turned "off" car by opening charge port door
      • all views which are not expected disappeared after a short wait: speedo, motor temps, brake temps, torque, PRND
    opened by carleeno 6
  • Change chargeStatus from PCS_hvChargeStatus to BMS_chargeRequest

    Change chargeStatus from PCS_hvChargeStatus to BMS_chargeRequest

    Original signal used to switch to the charging view is PCS_hvChargeStatus which doesn't seem to switch away from 0 on non-SUC DC chargers (at least ones i tested). This PR changes that to BMS_chargeRequest, which seems to reliably go from 0 to 1 (with no intermediate or alternate values) when any kind of charging is initiated.

    Alternative to this might be CP_chargeCablePresent if switching to charging view as soon as the connector is plugged in is more desireable. This might actually not be a bad idea, as seeing the green gauge on the screen will remind you the car is still plugged in when getting ready to leave.

    This fixes issue #12

    opened by orcinus 6
  • Add historical efficiency calculations

    Add historical efficiency calculations

    Allows for tapping the efficiency view to change between Last 5, 15, 30 miles, or 0 (instant). For KM the options are 10, 25, 50, and 0 km.

    The instant efficiency is formatted to kWh with 2 decimal places as that value changes extremely rapidly and gets quite large. For historical efficiency it uses whole number Wh units to match the ICE.

    The calculation is fairly close to the ICE, it updates faster so it never perfectly matches. The calculation discards any parked consumption/charging, and the history is retained even across app restarts or updates to newer versions.

    Here's a video showing the 5 mile range, pending 15 and 30 mile ranges, and instant efficiency (including negative and infinity). Note there is flickering of the 5 mile range that is only an artifact of how I am playing back logged can data, and does not appear in-car. https://photos.app.goo.gl/qJzE7wvxaVwTkSWJA

    To make room for the efficiency value to remain on-screen while stopped, the brake hold telltale was moved to replace the speedo when active, to match the behavior of US market cars. For simplicity other markets will share this same behavior in Candash.

    Video of the updated brake hold: https://photos.app.goo.gl/29PefauszsgUs3WC9

    Tested in-car with both miles and km units, instant efficiency, and each historical option for each unit. Ensured that history wasn't lost while restarting.

    opened by carleeno 5
  • Shift speed display over when >= 100 so it doesn't overlap gauges

    Shift speed display over when >= 100 so it doesn't overlap gauges

    When the speed is 100 or greater (happens a bunch for us KM/h drivers) the speed overlaps the gauges on the right. This code will shift the speed label over.

    opened by pyjamasam 5
  • Resolve by hostname

    Resolve by hostname

    CANServer supports mdns in version 2.1.0. When using your phone as a wifi hotspot you do not know the IP address that CANServer will be assigned but will be able to access the data via http://canserver.local

    opened by mfbloom 4
  • canSignal SNA handling

    canSignal SNA handling

    This addresses a couple of known issues, and makes our signals more robust to SNA values in general:

    • max power will sometimes reflect ~1200kw (due to battAmps SNA)
    • odometer will very briefly show over 4 million

    it also allowed us to clean up some existing SNA code that was done specifically for gearSelector and fusedSpeedLimit.

    If a decoded signal matches the sna value it will return null just as if the signal didn't exist, which will in turn blank out the relevant views for that signal.

    Tested with mock server and real vehicle, unfortunately I can't reproduce the 1000+kw power bug on my system so will need to just hope and see if it fixes that bug for other users.

    opened by carleeno 3
  • Option to blackout display synced with center display

    Option to blackout display synced with center display

    This provides an alternative to tapping into the trailer power wire for phone power to keep screen on while vehicle is on. It instead allows the screen to stay on as long as it's either charging or battery is above 20%. Then it blanks out the screen when the center display is off.

    This only is useful on OLED devices, as you'd still see the screen backlight on LCD devices.

    The option is disabled by default, can be enabled in the new settings page.

    Tested using real can data from getting out of the vehicle and closing the door: https://photos.app.goo.gl/wULEzMUycnGvEmWPA In the video you'll see the following:

    • driver gets out of vehicle and closes door, display blacks out with hint toast
    • long pressed left side of display to open settings
    • disabled the blackout option and returned to dash fragment, showing the screen is still on despite no driver presence
    • re-enabled the blackout option and returned to dash to show the toast still pops up when returning to a dash that's already blacked out
    opened by carleeno 3
  • Rework some constraints; More room for the speedo; Realign some labels

    Rework some constraints; More room for the speedo; Realign some labels

    Contains the following changes:

    • constraints for the gauges have been a bit tidied up - the middle gauges now align to center of screen, and all the others align to those, gauge labels are top- and bottom- aligned to gauges, textview widths for the readouts now match the gauge widths etc.
    • gauge labels have been changed so right side matches left (does not specify measured quantity, but the subsystem, e.g. brakes, motors, oil)
    • this makes more room for the speedo so there's no more overlap at speeds >100 and esp. >200 km/h, which should also fix issue #10
    • some of the labels have been realigned to grid a bit better, margins of some elements on the left now match the margins of elements on the right, turn signals are now aligned with the rest of the elements etc.
    opened by orcinus 3
  • Telltales, odometers, indicators, fixes, and other things

    Telltales, odometers, indicators, fixes, and other things

    A ton of things, sort of hard to list them all (i probably should've split this up into multiple PRs, but it is what it is).

    • general layout and constraint improvements, alignment nitpicks
    • fix for speedo overlapping the readouts
    • battery gauge improvements to mirror the main display and app better
    • battery preheating indicator
    • telltales for: lights, seatbelts status, brake hold, parking brake, TPMS
    • odometer
    • rudimentary battAmps filtering to avoid bizarre max discharge values
    • fixed MockCANService race causing mistimed frames
    • fixed MAX_FILTERS to correct value (43) in CANSignalHelper
    • fixed formatting bug in Hex.java getString
    • telltale colors abstracted into colors.xml for easier maintenance

    I think that's more or less it. If anything's questionable or does not make sense let me know.

    opened by orcinus 2
  • EU speedlimit tweaks; PIN-to-drive toast

    EU speedlimit tweaks; PIN-to-drive toast

    • changed proportions of the EU (round) speed limit sign - outline width, text size - to hopefully more closely match the main display icon
    • experimentally resized and moved the round speed limit indicator centrally above the speedo
    • added sign for no speed limit (Germany) if fused speed limit is reported as 155 km/h
    • added PIN-to-drive prompt toast

    Speed limit changes need testing, please don't merge yet.

    opened by orcinus 1
  • Fix panda service exception when app is in background

    Fix panda service exception when app is in background

    This fixes the socket closed exception that occurs whenever switching between apps (candash in background) by not trying to send bye when already disconnected.

    It also reduces the chance of the gauges flickering when coming across transient socket timeouts due to a weak signal or laggy canserver. It does this by shortening the timeout duration, but allowing for multiple timeouts (3) before it clears the carstate data.

    Note that while the panda service will stay connected to the canserver for a short time while the app is in the background, the canserver would eventually disconnect candash because it won't see heartbeats while candash is in the background. If you rejoin candash after this, it reconnects very quickly without clearing data.

    Test plan

    • while candash is open, stop canserver abruptly, ensure the car data clears after 3 seconds (3 timeouts at 1 second each)
    • while canserver is running, switch between candash and other apps, ensuring that the gauges don't blank out when resuming candash
      • tested within a single heartbeat duration, canserver stays connected
      • tested longer than a single heartbeat duration, canserver disconnects, but quickly reconnects once switching back to candash
    • switched between panda service and mock service multiple times, ensuring no odd behavior.
    opened by carleeno 1
  • BIG refactor/cleanup, and performance optimization

    BIG refactor/cleanup, and performance optimization

    Improvements:

    • Simplified data transfer from CAN services to view model by removing intermediate live flow and collector.
    • There is now a LiveData for each signal, and they are only updated when the signal value changes, resulting in far less data being sent
    • DashViewModel provides helpers for observing changes for a single signal, some signals, or all signals
    • Augmented CAN signals automatically calculate and add their values into the carState with real CAN signals, making things like power and smoothAmps accessible anywhere
    • New unit converter class that automatically detects the preferred unit when converting signals
    • Signal names and values split out from Constants to help identify what's what
    • Code refactor, saving about 600 lines in DashFragment moving repeated code into functions and other structure improvements
    • Code cleanup, removed long-unused code and comments (if we really need to get something back we have git)
    • Linted code from hundreds of warnings to just dozens of warnings
    • Bug fixes:
      • RWD/AWD detection fixed
      • Front torque gauge min not updating
      • Minor edge cases around changing to/from splitscreen while in different states such as doors open, charging, etc
      • Fixed light telltales for USDM vehicles, removed broken logic for EU market

    This shouldn't functionally or visually change anything, if something is different or unexpected, let me know.

    This does include some future code for a TACC icon, but is disabled in this PR, and will be enabled in a future PR once we have an icon to use for it.

    Testing

    This still needs more soak-testing in car, and by multiple people if possible. Leaving PR in draft until I'm more confident about it being stable.

    Comparison

    Before (dark theme) and after (light theme): https://photos.app.goo.gl/w3aGsRLAmYkPY7HS9

    You can see that before frame times often went above the optimum time (green line), and many more renders were performed than necessary. After, the renders mostly stay below the optimum frame time, and less renders are performed (which is why the graph looks stuttery, that's a good thing)

    opened by carleeno 1
  • Does not reliably switch to charging view

    Does not reliably switch to charging view

    It worked when AC charging:

    AC charging

    But doesn't when DC charging:

    DC charging

    Not sure which signal it uses to flip between the two, i'll dig around this weekend. Also not sure if it works when supercharging, nor whether this is maybe because i don't have chassis bus.

    opened by orcinus 1
  • Current speed overlaps gauges on the right when 100+

    Current speed overlaps gauges on the right when 100+

    Running in Canada and using KM/h I see speeds 100+ fairly regularly.

    The speed display ends up overlapping the gauges on the right in some circumstances (depending on the trailing digit).

    I am going to work on a PR to deal with this.

    opened by pyjamasam 0
  • Front Torque circular gauge always reads 0

    Front Torque circular gauge always reads 0

    This is a new bug. The most recent version has this issue. In addition, the font size in the same circular gauge is too large. I'm surprised that nobody previously reported this, so it could be an issue with my tablet.

    Also would you consider adding a lateral acceleration gauge like some of the Tesla track mode models have? You could reuse the horsepower gauge code and display it above that gauge. It probably makes sense to convert the raw data to g units.

    Thanks.

    opened by jabloomf1230 1
  • Keep screen on

    Keep screen on

    I'm using a custom mount with no power cord to try rthis out.

    I would suggest to use android:keepScreenOn="true" on the https://github.com/osunick/candash/blob/main/android/app/src/main/res/layout/activity_fullscreen.xml

    Since most people would not want their screen to turn off if the app is open.

    Alternatively if you feel someone would not want this feature it could be a new pref in the settings allowing the end-user to eventually decide if they want or not the flag toggled.

    opened by vekexasia 3
  • Steering wheel icon and FSD

    Steering wheel icon and FSD

    2020 Model Y LR with FSD beta 10.8.1. CanDash works as expected except the steering wheel icon does not either turn blue or respond in any way with FSD engaged.

    opened by jabloomf1230 12
Owner
Nick Nguyen
homemaker, dad, car/android hobbyist
Nick Nguyen
Whatsapp based Phone number verification.Verify your phone number easily through whatsapp

Whatsapp Based Login Try this to implement fastest phone number verification system [ ⚡ ] Verify your phone number through whatsapp android LinkedIn B

MorningStar 10 Jun 21, 2022
Android app to show my clone of the Tesla website.

TeslaRoadster Android app to show my clone of the Tesla website. Shows ability to use HTML5 in Android Apps Shows how drawer is implemented Shows embe

Chris Athanas 1 Dec 27, 2021
Tesla App Clone built in Kotlin, using Compose. The project was initially designed by Clinton using Flutter.

Tesla Tesla App Clone built in Kotlin, using Compose. The project was initially designed by Clinton using Flutter. We are keeping this repo as a singl

Juma Allan 4 Oct 4, 2022
Clean Architecture Kotlin Multiplatform Mobile (KMM) with Android Instrument Test and Unit Test

The-Movies: Clean Architecture Kotlin Multiplatform Mobile What're inside? - Jetpack Compose - Hilt - Ktor - Android Instrument Test - Unit Test - SQL

null 17 Dec 5, 2022
UML model and code examples of design patterns for Kotlin/Native. The model is created with Astah.

Design Pattern Examples in Kotlin/Native Model and code examples of GoF Design Patterns for Kotlin/Native. This project is available for the following

Takaaki Teshima 3 Jun 27, 2022
⏺ A simple android app to browse your phone call recordings

⏺ Reky A simple android app to browse your phone call recordings [Under Construction] ✅ TODO Support more file name formats ?? Built-with MVVM with Si

theapache64 12 Feb 8, 2022
An Android app to watch anime on your phone without ads.

Anime X Stream An Android app to watch anime on your phone without ads. WARNING: THIS IS A BETA VERSION of application, THEREFORE YOU MAY ENCOUNTER BU

Mukul Banga 2.2k Jan 4, 2023
This document will walk you through the steps for creating your Android app that runs a deep learning image classification model trained in Pocket AutoML and exported in TensorFlow Lite format

Pocket AutoML: Tutorial for Creating an Android App for Image Classification with Deep Learning Translations English (this document) Русский Overview

Evgeniy Mamchenko 15 Nov 22, 2022
Secret Codes is an Open Source application that allows you to browse through hidden codes of your Android phone.

####Secret Codes is an Open Source application that allows you to browse through hidden codes of your Android phone. This application will scan throug

Simon Marquis 251 Jan 6, 2023
STxMobile is a proof of concept of an Android app for remotely controlling the Raymarine ST2000+ tiller pilot from an Android phone.

STxMobile STxMobile is a proof of concept of an Android app for remotely controlling the Raymarine ST2000+ tiller pilot from an Android phone. The app

Marco 8 Sep 1, 2022
Just a phone app.

Koler ** An update, im currently working on a massive code redesign from scratch, will probably take some time, but will be better A uniquely stylized

null 633 Jan 2, 2023
Initiate immediate phone call for React Native on iOS and Android.

react-native-immediate-call-library Initiate immediate phone call for React Native on iOS and Android. Getting started Using npm: npm install react-na

null 7 Sep 7, 2022
Sync DND state between Android phone and watch

DNDSync This App was developed to enable Do Not Disturb (DND) synchronization between my Pixel phone and the Galaxy Watch 4 since this option was only

rhaeus 57 Jan 5, 2023
A handy phone call manager with phonebook, number blocking and multi-SIM support

Simple Dialer A lightweight app for handling your calls, no matter where are you. Comes with a handy call log for easy call initiation. There is a qui

Simple Mobile Tools 443 Jan 6, 2023
Implement Dog vs Cat Prediction Model in Android app

This project aims to classify the input image as either a dog or a cat image. The image input which you give to the system will be analyzed and the predicted result will be given as output. Machine learning algorithm [Convolutional Neural Networks] is used to classify the image.

Aditya deshmukh 6 Oct 27, 2021
Detect-My-Mask: An android app which runs along with a TensorLite ML Model which detect whether a person is wearing mask or not.

Detect-My-Mask About : Detect My Mask is an Android Application which is powered by a TensorLite ML Model which is programmed and trained to detect wh

Siddharth Singh 5 Aug 8, 2022
Food101 android app - Fine tune the EfficientNet model with Food101 dataset

Food101 Android App Fine tune the EfficientNet model with Food101 dataset. Conve

Junwei 1 Feb 15, 2022
This app using Mlkit along with the TensorFlow Lite model for object detection,

I built this app using Mlkit along with the TensorFlow Lite model for object detection, Arcore is used to place anchors to the detected objects. It's a good blend of Machine learning and Augmented reality to visualise ML information in a much better way than regular bounding boxes

Kashif Mehmood 18 Nov 10, 2022
Application that shows a store's phone inventory

PhoneInventory Application that shows a store's phone inventory The Basics A basic inventory application that shows a store's inventory. Tech Kotlin 1

Ayana Bando 0 Nov 3, 2021