mirror of https://github.com/FOME-Tech/fome-fw.git
no android
This commit is contained in:
parent
a32f5aa4c3
commit
2ae91c398e
|
@ -1,73 +0,0 @@
|
||||||
name: Android
|
|
||||||
|
|
||||||
on: [push,pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Checkout Submodules
|
|
||||||
run: |
|
|
||||||
git submodule update --init --depth=1 unit_tests/googletest
|
|
||||||
git submodule update --init --depth=1 firmware/libfirmware
|
|
||||||
git submodule update --init --depth=1 firmware/ext/lua
|
|
||||||
git submodule update --init --depth=1 firmware/controllers/lua/luaaa
|
|
||||||
git submodule update --init --depth=1 firmware/controllers/can/wideband_firmware
|
|
||||||
|
|
||||||
- uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
distribution: 'zulu'
|
|
||||||
java-version: '8'
|
|
||||||
|
|
||||||
- name: Install Tools
|
|
||||||
working-directory: ./.github/workflows/
|
|
||||||
run: |
|
|
||||||
sudo ./add-ubuntu-latest-apt-mirrors.sh
|
|
||||||
sudo apt-get install mtools
|
|
||||||
|
|
||||||
- name: Generate Configs, Enums & Live Documentation
|
|
||||||
working-directory: ./firmware/
|
|
||||||
run: ./gen_default_everything.sh
|
|
||||||
|
|
||||||
- name: Test Compiler
|
|
||||||
run: javac -version
|
|
||||||
|
|
||||||
- name: Print GCC version
|
|
||||||
working-directory: .
|
|
||||||
run: gcc -v
|
|
||||||
|
|
||||||
- name: Build Android
|
|
||||||
env:
|
|
||||||
RUSEFI_ANDROID_KEYPASS: ${{ secrets.RUSEFI_ANDROID_KEYPASS }}
|
|
||||||
working-directory: ./android
|
|
||||||
run: |
|
|
||||||
if [ "${{github.event_name}}" == "push" ]; then
|
|
||||||
bash ./gradlew build
|
|
||||||
else
|
|
||||||
bash ./gradlew bundleDebug test
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Upload APK - release
|
|
||||||
if: ${{ github.event_name == 'push' }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: rusEFI-release
|
|
||||||
path: ./android/app/build/outputs/apk/release/rusEFI-release.apk
|
|
||||||
|
|
||||||
- name: Upload APK - unsigned
|
|
||||||
if: ${{ github.event_name != 'push' }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: rusEFI-release-unsigned
|
|
||||||
path: ./android/app/build/outputs/bundle/debug/rusEFI-debug.aab
|
|
||||||
|
|
||||||
- name: Install Tools
|
|
||||||
run: sudo apt-get install sshpass
|
|
||||||
|
|
||||||
- name: Upload rusEFI Android application
|
|
||||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
|
|
||||||
working-directory: .
|
|
||||||
run: java_console/upload_file.sh ${{ secrets.RUSEFI_SSH_USER }} ${{ secrets.RUSEFI_SSH_PASS }} ${{ secrets.RUSEFI_SSH_SERVER }} build_server android/app/build/outputs/apk/release/rusEFI-release.apk
|
|
|
@ -1,14 +0,0 @@
|
||||||
*.iml
|
|
||||||
.gradle
|
|
||||||
/local.properties
|
|
||||||
/.idea/caches
|
|
||||||
/.idea/libraries
|
|
||||||
/.idea/modules.xml
|
|
||||||
/.idea/workspace.xml
|
|
||||||
/.idea/navEditor.xml
|
|
||||||
/.idea/assetWizardSettings.xml
|
|
||||||
.DS_Store
|
|
||||||
/build
|
|
||||||
/captures
|
|
||||||
.externalNativeBuild
|
|
||||||
.cxx
|
|
|
@ -1,116 +0,0 @@
|
||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<code_scheme name="Project" version="173">
|
|
||||||
<codeStyleSettings language="XML">
|
|
||||||
<indentOptions>
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
|
||||||
</indentOptions>
|
|
||||||
<arrangement>
|
|
||||||
<rules>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>xmlns:android</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>xmlns:.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>BY_NAME</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*:id</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*:name</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>name</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>style</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>BY_NAME</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>ANDROID_ATTRIBUTE_ORDER</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>BY_NAME</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
</rules>
|
|
||||||
</arrangement>
|
|
||||||
</codeStyleSettings>
|
|
||||||
</code_scheme>
|
|
||||||
</component>
|
|
|
@ -1,28 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
|
||||||
<component name="GradleSettings">
|
|
||||||
<option name="linkedExternalProjectsSettings">
|
|
||||||
<GradleProjectSettings>
|
|
||||||
<option name="testRunner" value="GRADLE" />
|
|
||||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
|
||||||
<option name="gradleJvm" value="1.8" />
|
|
||||||
<option name="modules">
|
|
||||||
<set>
|
|
||||||
<option value="$PROJECT_DIR$" />
|
|
||||||
<option value="$PROJECT_DIR$/app" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/core_ui" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/inifile" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/io" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/logging" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/logging-api" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/models" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/shared_io" />
|
|
||||||
<option value="$PROJECT_DIR$/../java_console/shared_ui" />
|
|
||||||
</set>
|
|
||||||
</option>
|
|
||||||
</GradleProjectSettings>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -1,30 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="RemoteRepositoriesConfiguration">
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="central" />
|
|
||||||
<option name="name" value="Maven Central repository" />
|
|
||||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="jboss.community" />
|
|
||||||
<option name="name" value="JBoss Community repository" />
|
|
||||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="BintrayJCenter" />
|
|
||||||
<option name="name" value="BintrayJCenter" />
|
|
||||||
<option name="url" value="https://jcenter.bintray.com/" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="Google" />
|
|
||||||
<option name="name" value="Google" />
|
|
||||||
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="maven" />
|
|
||||||
<option name="name" value="maven" />
|
|
||||||
<option name="url" value="https://jitpack.io" />
|
|
||||||
</remote-repository>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectType">
|
|
||||||
<option name="id" value="Android" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -1,12 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="RunConfigurationProducerService">
|
|
||||||
<option name="ignoredProducers">
|
|
||||||
<set>
|
|
||||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
|
||||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
|
||||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
|
||||||
</set>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -1,81 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
|
|
||||||
apply from: '../../android/dependencies.gradle'
|
|
||||||
|
|
||||||
android {
|
|
||||||
packagingOptions {
|
|
||||||
exclude 'META-INF/DEPENDENCIES'
|
|
||||||
}
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
compileSdkVersion 30
|
|
||||||
buildToolsVersion "30.0.2"
|
|
||||||
project.archivesBaseName = "rusEFI";
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
applicationId "com.rusefi.app"
|
|
||||||
// API level 19 = Android 4.4 () Samsung S4 is nicely rootable with KingRoot
|
|
||||||
// API level 21 = Android_5.0_Lollipop
|
|
||||||
minSdkVersion 19
|
|
||||||
targetSdkVersion 29
|
|
||||||
versionCode 1
|
|
||||||
versionName "1.0"
|
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
||||||
}
|
|
||||||
|
|
||||||
signingConfigs {
|
|
||||||
release {
|
|
||||||
storeFile file("../certs/rusEFI.jks")
|
|
||||||
storePassword System.getenv("RUSEFI_ANDROID_KEYPASS")
|
|
||||||
keyAlias "key0"
|
|
||||||
keyPassword System.getenv("RUSEFI_ANDROID_KEYPASS")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
debug {
|
|
||||||
minifyEnabled false
|
|
||||||
}
|
|
||||||
release {
|
|
||||||
minifyEnabled false
|
|
||||||
signingConfig signingConfigs.release
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation project(':ecu_io')
|
|
||||||
implementation project(':logging-api')
|
|
||||||
implementation project(':models')
|
|
||||||
implementation global_libs.annotations
|
|
||||||
|
|
||||||
def acraVersion = '5.7.0'
|
|
||||||
implementation "ch.acra:acra-http:$acraVersion"
|
|
||||||
implementation "ch.acra:acra-mail:$acraVersion"
|
|
||||||
implementation "ch.acra:acra-dialog:$acraVersion"
|
|
||||||
implementation "ch.acra:acra-toast:$acraVersion"
|
|
||||||
|
|
||||||
implementation files('lib/dfu_java.jar')
|
|
||||||
// implementation 'com.github.mik3y:usb-serial-for-android:v2.2.3'
|
|
||||||
implementation 'com.github.mik3y:usb-serial-for-android:v3.1.0'
|
|
||||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
|
||||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
|
||||||
implementation 'com.google.android.material:material:1.1.0'
|
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
|
||||||
implementation 'androidx.navigation:navigation-fragment:2.1.0'
|
|
||||||
implementation 'androidx.navigation:navigation-ui:2.1.0'
|
|
||||||
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
|
|
||||||
|
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
|
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
gradle.taskGraph.afterTask { task ->
|
|
||||||
project.logger.lifecycle("Password " + System.getenv('RUSEFI_ANDROID_KEYPASS'));
|
|
||||||
}
|
|
||||||
*/
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,40 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>com.github.mik3y</groupId>
|
|
||||||
<artifactId>usb-serial-for-android</artifactId>
|
|
||||||
<version>v2.2.3</version>
|
|
||||||
<packaging>aar</packaging>
|
|
||||||
<name>mik3y/usb-serial-for-android</name>
|
|
||||||
<description>Android USB host serial driver library for CDC, FTDI, Arduino and other devices.</description>
|
|
||||||
<url>https://github.com/mik3y/usb-serial-for-android</url>
|
|
||||||
<inceptionYear>2013</inceptionYear>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>GNU Lesser General Public License v2.1</name>
|
|
||||||
<url>https://api.github.com/licenses/lgpl-2.1</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<developers>
|
|
||||||
<developer>
|
|
||||||
<id>mik3y</id>
|
|
||||||
<name>mike w</name>
|
|
||||||
<email></email>
|
|
||||||
</developer>
|
|
||||||
</developers>
|
|
||||||
<scm>
|
|
||||||
<connection>scm:git://github.com/mik3y/usb-serial-for-android.git</connection>
|
|
||||||
<developerConnection>scm:git://github.com/mik3y/usb-serial-for-android.git</developerConnection>
|
|
||||||
<url>git://github.com/mik3y/usb-serial-for-android.git</url>
|
|
||||||
</scm>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>4.12</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
|
@ -1,26 +0,0 @@
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import androidx.test.platform.app.InstrumentationRegistry;
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instrumented test, which will execute on an Android device.
|
|
||||||
*
|
|
||||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
|
||||||
*/
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
public class ExampleInstrumentedTest {
|
|
||||||
@Test
|
|
||||||
public void useAppContext() {
|
|
||||||
// Context of the app under test.
|
|
||||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
|
||||||
assertEquals("com.rusefi.app", appContext.getPackageName());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.rusefi.app">
|
|
||||||
|
|
||||||
<application android:label="@string/app_name"
|
|
||||||
android:name="com.rusefi.app.RusefiApplication"
|
|
||||||
android:icon="@mipmap/ic_launcher"
|
|
||||||
android:theme="@style/AppTheme">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
The USB_DEVICE_ATTACHED intent is always sent to an activity.
|
|
||||||
Activity is launched singleTop to avoid creating multiple activities for each event.
|
|
||||||
-->
|
|
||||||
<activity
|
|
||||||
android:name=".rusEFI"
|
|
||||||
android:launchMode="singleTop">
|
|
||||||
|
|
||||||
<!-- Launch as default from Android Studio -->
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<!-- Launch when USB device attached -->
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data
|
|
||||||
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
|
|
||||||
android:resource="@xml/device_filter" />
|
|
||||||
</activity>
|
|
||||||
<service android:name=".SerialService" />
|
|
||||||
</application>
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
||||||
|
|
||||||
</manifest>
|
|
|
@ -1,92 +0,0 @@
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
import android.content.ContextWrapper;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.rusefi.Listener;
|
|
||||||
import com.rusefi.dfu.DfuImage;
|
|
||||||
import com.rusefi.core.net.ConnectionAndMeta;
|
|
||||||
import com.rusefi.core.FileUtil;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.security.KeyManagementException;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
|
|
||||||
public class DfuUpload {
|
|
||||||
private static final String BUNDLE_FILE = "rusefi_bundle_autoupdate.zip";
|
|
||||||
//public static final String FILE = "rusefi_bundle_mre_f4_autoupdate.zip";
|
|
||||||
//private static final String DFU_FILE_NAME = "rusefi_mre_f4.dfu";
|
|
||||||
private static final String DFU_FILE_NAME = "rusefi_.dfu";
|
|
||||||
|
|
||||||
public final String localDfuImageFileName;
|
|
||||||
public final String localFullFile;
|
|
||||||
public final File localFolder;
|
|
||||||
|
|
||||||
public DfuUpload(ContextWrapper context) {
|
|
||||||
localFolder = context.getExternalFilesDir(null);
|
|
||||||
localFullFile = localFolder + File.separator + BUNDLE_FILE;
|
|
||||||
localDfuImageFileName = localFolder + File.separator + DFU_FILE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
void downloadFileIfNotPresent(final TextView mResultView) {
|
|
||||||
if (new File(this.localFullFile).exists()) {
|
|
||||||
mResultView.append(BUNDLE_FILE + " found!\n");
|
|
||||||
uncompressFile(this.localFullFile, this.localFolder, this.localDfuImageFileName, mResultView);
|
|
||||||
} else {
|
|
||||||
mResultView.append(BUNDLE_FILE + " not found!\n");
|
|
||||||
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
ConnectionAndMeta c = new ConnectionAndMeta(BUNDLE_FILE).invoke(ConnectionAndMeta.BASE_URL_LATEST);
|
|
||||||
ConnectionAndMeta.downloadFile(localFullFile, c, new ConnectionAndMeta.DownloadProgressListener() {
|
|
||||||
@Override
|
|
||||||
public void onPercentage(final int currentPercentage) {
|
|
||||||
mResultView.post(() -> mResultView.append("Downloaded " + currentPercentage + "%\n"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mResultView.post(() -> mResultView.append("Downloaded! " + "\n"));
|
|
||||||
uncompressFile(localFullFile, localFolder, localDfuImageFileName, mResultView);
|
|
||||||
|
|
||||||
} catch (IOException e) {
|
|
||||||
mResultView.post(() -> mResultView.append("Error downloading " + e + "\n"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void uncompressFile(final String localFullFile, final File localFolder, final String localDfuImageFileName, final TextView mResultView) {
|
|
||||||
final Listener<Integer> onSuccess = new Listener<Integer>() {
|
|
||||||
@Override
|
|
||||||
public void onResult(final Integer size) {
|
|
||||||
mResultView.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
mResultView.append(localDfuImageFileName + " File size: " + size + "\n");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
DfuImage dfuImage = new DfuImage();
|
|
||||||
try {
|
|
||||||
dfuImage.read(localDfuImageFileName);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
mResultView.post(() -> mResultView.append("Error reading " + e));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
try {
|
|
||||||
FileUtil.unzip(localFullFile, localFolder);
|
|
||||||
final int size = (int) new File(localDfuImageFileName).length();
|
|
||||||
onSuccess.onResult(size);
|
|
||||||
|
|
||||||
} catch (final IOException e) {
|
|
||||||
mResultView.post(() -> mResultView.append("Error uncompressing " + e + "\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
public enum PermissionGrantedAction {
|
|
||||||
DFU,
|
|
||||||
DASHBOARD,
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
|
|
||||||
import org.acra.ACRA;
|
|
||||||
import org.acra.config.CoreConfigurationBuilder;
|
|
||||||
import org.acra.config.MailSenderConfigurationBuilder;
|
|
||||||
import org.acra.config.ToastConfigurationBuilder;
|
|
||||||
|
|
||||||
public class RusefiApplication extends Application {
|
|
||||||
static {
|
|
||||||
/**
|
|
||||||
* We better not touch real classes in order not to trigger class loading
|
|
||||||
*
|
|
||||||
* Logging#LOG_CLASS_NAME
|
|
||||||
* @see ConsoleLogger
|
|
||||||
*/
|
|
||||||
System.setProperty("log.className", "com.devexperts.logging.ConsoleLogger");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
|
|
||||||
CoreConfigurationBuilder builder = new CoreConfigurationBuilder(this);
|
|
||||||
builder.getPluginConfigurationBuilder(MailSenderConfigurationBuilder.class)
|
|
||||||
.setMailTo("rusefillc@gmail.com")
|
|
||||||
.setSubject("Android Crash")
|
|
||||||
.setEnabled(true);
|
|
||||||
|
|
||||||
builder.getPluginConfigurationBuilder(ToastConfigurationBuilder.class);
|
|
||||||
ACRA.init(this, builder);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Binder;
|
|
||||||
import android.os.IBinder;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
public class SerialService extends Service {
|
|
||||||
class SerialBinder extends Binder {
|
|
||||||
/*
|
|
||||||
SerialService getService() {
|
|
||||||
return SerialService.this;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
private final IBinder binder = new SerialBinder();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent) {
|
|
||||||
return binder;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.media.AudioFormat;
|
|
||||||
import android.media.AudioRecord;
|
|
||||||
import android.media.MediaRecorder;
|
|
||||||
import android.media.audiofx.AcousticEchoCanceler;
|
|
||||||
import android.media.audiofx.NoiseSuppressor;
|
|
||||||
|
|
||||||
import androidx.core.app.ActivityCompat;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
public class SoundBroadcast {
|
|
||||||
private static final int sampleRate = 16000; // 44100 for music
|
|
||||||
private static final int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
|
|
||||||
private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
|
|
||||||
private static final int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) + 2048;
|
|
||||||
private byte[] buffer = new byte[minBufSize];
|
|
||||||
|
|
||||||
static void checkOrRequestPermission(Activity context) {
|
|
||||||
if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO)
|
|
||||||
!= PackageManager.PERMISSION_GRANTED) {
|
|
||||||
ActivityCompat.requestPermissions(context,
|
|
||||||
new String[]{Manifest.permission.RECORD_AUDIO},
|
|
||||||
1234);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start() {
|
|
||||||
Thread streamThread = new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
/*
|
|
||||||
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, minBufSize * 10);
|
|
||||||
if (NoiseSuppressor.isAvailable()) {
|
|
||||||
NoiseSuppressor.create(recorder.getAudioSessionId()).setEnabled(true);
|
|
||||||
}
|
|
||||||
if (AcousticEchoCanceler.isAvailable()) {
|
|
||||||
AcousticEchoCanceler.create(recorder.getAudioSessionId()).setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
recorder.startRecording();
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
|
|
||||||
int bytes = recorder.read(buffer, 0, buffer.length);
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
});
|
|
||||||
streamThread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,350 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017, The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.rusefi.app;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.hardware.usb.UsbDevice;
|
|
||||||
import android.hardware.usb.UsbManager;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.text.Editable;
|
|
||||||
import android.text.TextWatcher;
|
|
||||||
import android.text.util.Linkify;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.EditText;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.devexperts.logging.Logging;
|
|
||||||
import com.google.android.material.snackbar.BaseTransientBottomBar;
|
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
|
||||||
import com.rusefi.Callable;
|
|
||||||
import com.rusefi.Timeouts;
|
|
||||||
import com.rusefi.app.serial.AndroidSerial;
|
|
||||||
import com.rusefi.app.util.AndroidUtil;
|
|
||||||
import com.rusefi.auth.AuthTokenUtil;
|
|
||||||
import com.rusefi.binaryprotocol.BinaryProtocol;
|
|
||||||
import com.rusefi.dfu.DfuConnection;
|
|
||||||
import com.rusefi.dfu.DfuImage;
|
|
||||||
import com.rusefi.dfu.DfuLogic;
|
|
||||||
import com.rusefi.dfu.android.AndroidDfuConnection;
|
|
||||||
import com.rusefi.dfu.android.DfuDeviceLocator;
|
|
||||||
import com.rusefi.io.ConnectionStateListener;
|
|
||||||
import com.rusefi.io.DfuHelper;
|
|
||||||
import com.rusefi.io.IoStream;
|
|
||||||
import com.rusefi.io.LinkManager;
|
|
||||||
import com.rusefi.io.commands.ErrorInfoCommand;
|
|
||||||
import com.rusefi.io.serial.StreamConnector;
|
|
||||||
import com.rusefi.io.tcp.BinaryProtocolProxy;
|
|
||||||
import com.rusefi.proxy.NetworkConnector;
|
|
||||||
import com.rusefi.proxy.NetworkConnectorContext;
|
|
||||||
import com.rusefi.ui.StatusConsumer;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
public class rusEFI extends Activity {
|
|
||||||
private final static Logging log = Logging.getLogging(rusEFI.class);
|
|
||||||
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
|
|
||||||
|
|
||||||
// private static final byte REQUEST_TYPE_CLASS = 32;
|
|
||||||
// private static final byte RECIPIENT_INTERFACE = 0x01;
|
|
||||||
//
|
|
||||||
// protected static final int DFU_DETACH_TIMEOUT = 1000;
|
|
||||||
|
|
||||||
private static final String VERSION = "rusEFI app v0.20220524\n";
|
|
||||||
|
|
||||||
private static final int LOCAL_PORT = 29001;
|
|
||||||
|
|
||||||
/* UI elements */
|
|
||||||
private TextView mStatusView;
|
|
||||||
private TextView mResultView; // global dump of all messages
|
|
||||||
private TextView broadcastStatus;
|
|
||||||
private TextView authStatusMessage;
|
|
||||||
private TextView authStatusClickableUrl;
|
|
||||||
|
|
||||||
private UsbManager usbManager;
|
|
||||||
private DfuUpload dfuUpload;
|
|
||||||
private SoundBroadcast soundBroadcast = new SoundBroadcast();
|
|
||||||
private PermissionGrantedAction onPermissionGrantedAction;
|
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
log.info("onCreate");
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_usb);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We need to make sure that WiFi is available for us, this might be related to screen on?
|
|
||||||
*/
|
|
||||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
|
||||||
|
|
||||||
findViewById(R.id.buttonSound).setVisibility(View.GONE);
|
|
||||||
findViewById(R.id.buttonDfu).setVisibility(View.GONE);
|
|
||||||
|
|
||||||
Button view = findViewById(R.id.localBroadcast);
|
|
||||||
view.setText("Local broadcast on " + LOCAL_PORT);
|
|
||||||
|
|
||||||
broadcastStatus = findViewById(R.id.broadcastStatus);
|
|
||||||
broadcastStatus.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
|
|
||||||
|
|
||||||
// turn on screen while ADB debugging idle phone
|
|
||||||
AndroidUtil.turnScreenOn(this);
|
|
||||||
|
|
||||||
mStatusView = findViewById(R.id.text_status);
|
|
||||||
mResultView = findViewById(R.id.text_result);
|
|
||||||
|
|
||||||
authStatusMessage = findViewById(R.id.authStatus1);
|
|
||||||
authStatusClickableUrl = findViewById(R.id.authStatus2);
|
|
||||||
authStatusClickableUrl.setText(AuthTokenUtil.TOKEN_PROFILE_URL);
|
|
||||||
Linkify.addLinks(authStatusClickableUrl, Linkify.WEB_URLS);
|
|
||||||
|
|
||||||
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
|
|
||||||
registerReceiver(mUsbReceiver, filter);
|
|
||||||
|
|
||||||
visibleLogAppend(VERSION);
|
|
||||||
|
|
||||||
dfuUpload = new DfuUpload(this);
|
|
||||||
|
|
||||||
//dfuUpload.downloadFileIfNotPresent(mResultView);
|
|
||||||
|
|
||||||
String authToken = "";
|
|
||||||
int visibility = AuthTokenUtil.isToken(authToken) ? View.GONE : View.VISIBLE;
|
|
||||||
authStatusMessage.setVisibility(visibility);
|
|
||||||
authStatusClickableUrl.setVisibility(visibility);
|
|
||||||
|
|
||||||
// switchOrProgramDfu();
|
|
||||||
|
|
||||||
// SoundBroadcast.checkOrRequestPermission(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
unregisterReceiver(mUsbReceiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
String action = intent.getAction();
|
|
||||||
if (ACTION_USB_PERMISSION.equals(action)) {
|
|
||||||
synchronized (this) {
|
|
||||||
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
|
|
||||||
if (onPermissionGrantedAction == PermissionGrantedAction.DFU) {
|
|
||||||
|
|
||||||
UsbDevice dfuDevice = DfuDeviceLocator.findDevice(usbManager);
|
|
||||||
doDfuUpdate(dfuDevice);
|
|
||||||
} else if (onPermissionGrantedAction == PermissionGrantedAction.DASHBOARD) {
|
|
||||||
connectDashboard();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private void switchOrProgramDfu() {
|
|
||||||
UsbDevice dfuDevice = DfuDeviceLocator.findDevice(usbManager);
|
|
||||||
if (dfuDevice == null) {
|
|
||||||
visibleLogAppend("No DFU device\n");
|
|
||||||
switchToDfu();
|
|
||||||
// once device is in DFU mode we expect what exactly to happen?
|
|
||||||
} else if (!usbManager.hasPermission(dfuDevice)) {
|
|
||||||
requestUsbPermission(dfuDevice, PermissionGrantedAction.DFU);
|
|
||||||
} else {
|
|
||||||
doDfuUpdate(dfuDevice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visibleLogAppend(String s) {
|
|
||||||
CharSequence current = mResultView.getText();
|
|
||||||
mResultView.setText(s + "\n" + current);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
private void switchToDfu() {
|
|
||||||
AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager);
|
|
||||||
if (serial == null) {
|
|
||||||
// error already reported to mStatusView
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
visibleLogAppend("Switching to DFU\n");
|
|
||||||
DfuHelper.sendDfuRebootCommand(serial, StatusConsumer.VOID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void requestUsbPermission(UsbDevice usbDevice, PermissionGrantedAction action) {
|
|
||||||
// why do we not have similar 'request serial USB permission'?
|
|
||||||
onPermissionGrantedAction = action;
|
|
||||||
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
|
|
||||||
usbManager.requestPermission(usbDevice, mPermissionIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
private void doDfuUpdate(UsbDevice dfuDevice) {
|
|
||||||
mStatusView.setText("rusEFI: DFU detected");
|
|
||||||
DfuDeviceLocator.Result dfu = new DfuDeviceLocator().openDfu(usbManager, dfuDevice);
|
|
||||||
|
|
||||||
DfuImage dfuImage = new DfuImage();
|
|
||||||
dfuImage.read(dfuUpload.localDfuImageFileName);
|
|
||||||
visibleLogAppend("Image size " + dfuImage.getImageSize() + "\n");
|
|
||||||
|
|
||||||
DfuConnection connection = new AndroidDfuConnection(dfu.getConnection(), dfu.getInterfaceIndex(), dfu.getTransferSize(), dfu.getFlashRange());
|
|
||||||
|
|
||||||
DfuLogic.Logger logger = DfuLogic.Logger.CONSOLE;
|
|
||||||
try {
|
|
||||||
// DfuCommandGetStatus.State state = DfuCommandGetStatus.read(c);
|
|
||||||
// mResultView.append("State " + state + "\n");
|
|
||||||
|
|
||||||
DfuLogic.uploadImage(logger, connection, dfuImage, dfu.getFlashRange());
|
|
||||||
} catch (IllegalStateException e) {
|
|
||||||
visibleLogAppend("Error " + e + "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onConnectButton(View view) {
|
|
||||||
connectDashboard();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MRE + USB cable + Android + WiFi I get about 8Hz Runtime Data Rate :(
|
|
||||||
*/
|
|
||||||
public void onLocalBroadcast(View view) {
|
|
||||||
AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager);
|
|
||||||
if (serial == null) {
|
|
||||||
// error already reported to mStatusView
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
BinaryProtocolProxy.createProxy(serial, LOCAL_PORT, new BinaryProtocolProxy.ClientApplicationActivityListener() {
|
|
||||||
@Override
|
|
||||||
public void onActivity() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}, StatusConsumer.ANONYMOUS);
|
|
||||||
visibleLogAppend("Running TCP/IP proxy on " + LOCAL_PORT);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the user touches a button
|
|
||||||
*/
|
|
||||||
public void sendMessage(View view) {
|
|
||||||
if (view.getId() == R.id.buttonDfu) {
|
|
||||||
switchOrProgramDfu();
|
|
||||||
} else if (view.getId() == R.id.buttonSound) {
|
|
||||||
soundBroadcast.start();
|
|
||||||
} else if (view.getId() == R.id.buttonBroadcast) {
|
|
||||||
startService(new Intent(this, SerialService.class));
|
|
||||||
|
|
||||||
AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager);
|
|
||||||
if (serial == null) {
|
|
||||||
// error already reported to mStatusView
|
|
||||||
Snackbar mySnackbar = Snackbar.make(view, "No ECU detected", BaseTransientBottomBar.LENGTH_LONG);
|
|
||||||
mySnackbar.show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LinkManager linkManager = new LinkManager();
|
|
||||||
linkManager.setConnector(new StreamConnector(linkManager, new Callable<IoStream>() {
|
|
||||||
@Override
|
|
||||||
public IoStream call() {
|
|
||||||
return serial;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
linkManager.getConnector().connectAndReadConfiguration(new BinaryProtocol.Arguments(true),
|
|
||||||
new ConnectionStateListener() {
|
|
||||||
@Override
|
|
||||||
public void onConnectionEstablished() {
|
|
||||||
mResultView.post(() -> visibleLogAppend(new Date() + " On connection established\n"));
|
|
||||||
|
|
||||||
NetworkConnectorContext context = new NetworkConnectorContext();
|
|
||||||
NetworkConnector.ActivityListener oncePerSecondStatistics = new NetworkConnector.ActivityListener() {
|
|
||||||
long previousTime;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivity(IoStream targetEcuSocket) {
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
if (now - previousTime < Timeouts.SECOND) {
|
|
||||||
// only update status once per second
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
previousTime = now;
|
|
||||||
broadcastStatus.post(() -> broadcastStatus.setText(targetEcuSocket.getBytesIn() + "/" + targetEcuSocket.getBytesOut()));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
NetworkConnector.NetworkConnectorResult result = new NetworkConnector().start(NetworkConnector.Implementation.Android,
|
|
||||||
readPersistedAuthToken(), context, new NetworkConnector.ReconnectListener() {
|
|
||||||
@Override
|
|
||||||
public void onReconnect() {
|
|
||||||
}
|
|
||||||
}, linkManager, oncePerSecondStatistics);
|
|
||||||
|
|
||||||
mResultView.post(() -> visibleLogAppend(new Date() + " Broadcast: " + result + "\n"));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConnectionFailed(String errorMessage) {
|
|
||||||
mResultView.post(() -> visibleLogAppend("Connection failed " + errorMessage + " \n"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Snackbar mySnackbar = Snackbar.make(view, "Broadcasting with " + readPersistedAuthToken(), BaseTransientBottomBar.LENGTH_LONG);
|
|
||||||
mySnackbar.show();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void connectDashboard() {
|
|
||||||
AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager);
|
|
||||||
if (serial == null) {
|
|
||||||
// error already reported to mStatusView
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
String signature = BinaryProtocol.getSignature(serial);
|
|
||||||
visibleLogAppend("Connected to " + signature);
|
|
||||||
ErrorInfoCommand.send(serial);
|
|
||||||
String configError = ErrorInfoCommand.getResponse(serial.getDataBuffer());
|
|
||||||
if (configError != null)
|
|
||||||
visibleLogAppend("[CRITICAL] " + configError);
|
|
||||||
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onNewIntent(Intent intent) {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,110 +0,0 @@
|
||||||
package com.rusefi.app.serial;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.hardware.usb.UsbDevice;
|
|
||||||
import android.hardware.usb.UsbDeviceConnection;
|
|
||||||
import android.hardware.usb.UsbManager;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.hoho.android.usbserial.driver.CdcAcmSerialDriver;
|
|
||||||
import com.hoho.android.usbserial.driver.ProbeTable;
|
|
||||||
import com.hoho.android.usbserial.driver.UsbSerialDriver;
|
|
||||||
import com.hoho.android.usbserial.driver.UsbSerialPort;
|
|
||||||
import com.hoho.android.usbserial.driver.UsbSerialProber;
|
|
||||||
import com.opensr5.io.DataListener;
|
|
||||||
import com.rusefi.app.PermissionGrantedAction;
|
|
||||||
import com.rusefi.app.rusEFI;
|
|
||||||
import com.rusefi.binaryprotocol.IncomingDataBuffer;
|
|
||||||
import com.rusefi.dfu.DfuLogic;
|
|
||||||
import com.rusefi.io.ByteReader;
|
|
||||||
import com.rusefi.io.serial.AbstractIoStream;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class AndroidSerial extends AbstractIoStream {
|
|
||||||
private static final int ST_CDC = 0x5740;
|
|
||||||
private final IncomingDataBuffer dataBuffer;
|
|
||||||
|
|
||||||
private UsbSerialPort usbSerialPort;
|
|
||||||
|
|
||||||
public static List<UsbSerialDriver> findUsbSerial(UsbManager usbManager) {
|
|
||||||
ProbeTable customTable = UsbSerialProber.getDefaultProbeTable();
|
|
||||||
customTable.addProduct(DfuLogic.ST_VENDOR, ST_CDC, CdcAcmSerialDriver.class);
|
|
||||||
UsbSerialProber prober = new UsbSerialProber(customTable);
|
|
||||||
|
|
||||||
return prober.findAllDrivers(usbManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidSerial(UsbSerialPort usbSerialPort) {
|
|
||||||
this.usbSerialPort = usbSerialPort;
|
|
||||||
dataBuffer = createDataBuffer("");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static UsbSerialDriver getSerialDriver(rusEFI rusEFI, TextView mStatusView, UsbManager usbManager, PermissionGrantedAction action) {
|
|
||||||
List<UsbSerialDriver> availableDrivers = findUsbSerial(usbManager);
|
|
||||||
if (availableDrivers.isEmpty()) {
|
|
||||||
mStatusView.setText("Serial not found");
|
|
||||||
rusEFI.visibleLogAppend("No serial devices " + new Date() + "\n");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
mStatusView.setText("rusEFI: " + availableDrivers.size() + " device(s)");
|
|
||||||
|
|
||||||
UsbSerialDriver driver = availableDrivers.get(0);
|
|
||||||
|
|
||||||
UsbDevice usbDevice = driver.getDevice();
|
|
||||||
if (!usbManager.hasPermission(usbDevice)) {
|
|
||||||
mStatusView.setText("Need permission");
|
|
||||||
rusEFI.requestUsbPermission(usbDevice, action);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return driver;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
@Nullable
|
|
||||||
public static AndroidSerial getAndroidSerial(rusEFI rusEFI, TextView mStatusView, UsbManager usbManager) {
|
|
||||||
// todo: should support separate actions not default to dashboard!
|
|
||||||
UsbSerialDriver driver = getSerialDriver(rusEFI, mStatusView, usbManager, PermissionGrantedAction.DASHBOARD);
|
|
||||||
if (driver == null) {
|
|
||||||
// error already reported to UI or permission request was fired
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
UsbDeviceConnection connection = usbManager.openDevice(driver.getDevice());
|
|
||||||
if (connection == null) {
|
|
||||||
// add UsbManager.requestPermission(driver.getDevice(), ..) handling here
|
|
||||||
mStatusView.setText("Unable to open serial");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
UsbSerialPort port = driver.getPorts().get(0); // Most devices have just one port (port 0)
|
|
||||||
try {
|
|
||||||
port.open(connection);
|
|
||||||
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
|
|
||||||
} catch (IOException e) {
|
|
||||||
mStatusView.append("Error opening " + e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new AndroidSerial(port);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IncomingDataBuffer getDataBuffer() {
|
|
||||||
return dataBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setInputListener(DataListener listener) {
|
|
||||||
ByteReader reader = buffer -> usbSerialPort.read(buffer, 5000);
|
|
||||||
ByteReader.runReaderLoop("", listener, reader, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(byte[] bytes) throws IOException {
|
|
||||||
usbSerialPort.write(bytes, 1000);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
package com.rusefi.app.util;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
|
|
||||||
public class AndroidUtil {
|
|
||||||
private AndroidUtil() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void turnScreenOn(Activity rusEFI) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
|
|
||||||
rusEFI.setTurnScreenOn(true);
|
|
||||||
} else {
|
|
||||||
Window window = rusEFI.getWindow();
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,100 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/myCoordinatorLayout"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="16dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/text_status"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textAppearance="?android:textAppearanceMedium" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/buttonDfu"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:onClick="sendMessage"
|
|
||||||
android:text="DFU" />
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/authToken"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:ems="10"
|
|
||||||
android:inputType="text"
|
|
||||||
android:text="Auth Token" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/authStatus1"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Please paste your auth token" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/authStatus2"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="TextView" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/buttonSound"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:onClick="sendMessage"
|
|
||||||
android:text="Sound" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/buttonConnect"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:onClick="onConnectButton"
|
|
||||||
android:text="Connect" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/localBroadcast"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:onClick="onLocalBroadcast"
|
|
||||||
android:text="local" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/buttonBroadcast"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:onClick="sendMessage"
|
|
||||||
android:text="Broadcast" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/broadcastStatus"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Hello rusEFI" />
|
|
||||||
|
|
||||||
<ScrollView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/text_result"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</ScrollView>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/button"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Button" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
Binary file not shown.
Before Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 10 KiB |
|
@ -1,8 +0,0 @@
|
||||||
<!--
|
|
||||||
https://stackoverflow.com/questions/47090526/caused-by-java-lang-unsupportedoperationexception-failed-to-resolve-attribute/47090603
|
|
||||||
https://stackoverflow.com/questions/27780713/do-i-need-to-use-a-theme-appcompat-theme-or-descendant-for-v21-styles-too
|
|
||||||
-->
|
|
||||||
<resources>
|
|
||||||
<style name="AppTheme" parent="AppBaseTheme">
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
|
@ -1,4 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">rusEFI</string>
|
|
||||||
</resources>
|
|
|
@ -1,4 +0,0 @@
|
||||||
<resources>
|
|
||||||
<style name="AppBaseTheme" parent="Theme.AppCompat"></style>
|
|
||||||
<style name="AppTheme" parent="AppBaseTheme"></style>
|
|
||||||
</resources>
|
|
|
@ -1,24 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<!-- 0x0403 FTDI -->
|
|
||||||
<usb-device vendor-id="1027" product-id="24577" /> <!-- 0x6001: FT232R -->
|
|
||||||
<usb-device vendor-id="1027" product-id="24592" /> <!-- 0x6010: FT2232H -->
|
|
||||||
<usb-device vendor-id="1027" product-id="24593" /> <!-- 0x6011: FT4232H -->
|
|
||||||
<usb-device vendor-id="1027" product-id="24596" /> <!-- 0x6014: FT232H -->
|
|
||||||
<usb-device vendor-id="1027" product-id="24597" /> <!-- 0x6015: FT231X -->
|
|
||||||
|
|
||||||
<!-- 0x10C4 / 0xEAxx: Silabs CP210x -->
|
|
||||||
<usb-device vendor-id="4292" product-id="60000" /> <!-- 0xea60: CP2102 -->
|
|
||||||
<usb-device vendor-id="4292" product-id="60016" /> <!-- 0xea70: CP2105 -->
|
|
||||||
<usb-device vendor-id="4292" product-id="60017" /> <!-- 0xea71: CP2108 -->
|
|
||||||
<usb-device vendor-id="4292" product-id="60032" /> <!-- 0xea80: CP2110 -->
|
|
||||||
|
|
||||||
<!-- 0x067B / 0x2303: Prolific PL2303 -->
|
|
||||||
<usb-device vendor-id="1659" product-id="8963" />
|
|
||||||
|
|
||||||
<!-- 0x1a86 / 0x7523: Qinheng CH340 -->
|
|
||||||
<usb-device vendor-id="6790" product-id="29987" />
|
|
||||||
|
|
||||||
<!-- 0x0483 / 0x5740: ST CDC -->
|
|
||||||
<usb-device vendor-id="1155" product-id="22336" />
|
|
||||||
</resources>
|
|
|
@ -1,36 +0,0 @@
|
||||||
buildscript {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
dependencies {
|
|
||||||
classpath 'com.android.tools.build:gradle:4.2.2'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: 'dependencies.gradle'
|
|
||||||
apply from: '../java_tools/dependencies.gradle'
|
|
||||||
|
|
||||||
allprojects {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
maven { url 'https://jitpack.io' }
|
|
||||||
}
|
|
||||||
|
|
||||||
plugins.withType(JavaPlugin) {
|
|
||||||
dependencies {
|
|
||||||
implementation global_libs.annotations
|
|
||||||
testImplementation global_libs.junit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task clean(type: Delete) {
|
|
||||||
delete rootProject.buildDir
|
|
||||||
}
|
|
||||||
|
|
||||||
// gradlew allDeps
|
|
||||||
subprojects {
|
|
||||||
task allDeps(type: DependencyReportTask) {}
|
|
||||||
}
|
|
Binary file not shown.
|
@ -1,4 +0,0 @@
|
||||||
ext {
|
|
||||||
libs = [
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
# android toolset is not ready for configuration cache :(
|
|
||||||
# org.gradle.unsafe.configuration-cache=true
|
|
||||||
|
|
||||||
android.useAndroidX=true
|
|
||||||
android.enableJetifier=true
|
|
Binary file not shown.
|
@ -1,5 +0,0 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
|
||||||
distributionPath=wrapper/dists
|
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
|
|
@ -1,183 +0,0 @@
|
||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Copyright 2015 the original author or authors.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
##
|
|
||||||
## Gradle start up script for UN*X
|
|
||||||
##
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# Attempt to set APP_HOME
|
|
||||||
# Resolve links: $0 may be a link
|
|
||||||
PRG="$0"
|
|
||||||
# Need this for relative symlinks.
|
|
||||||
while [ -h "$PRG" ] ; do
|
|
||||||
ls=`ls -ld "$PRG"`
|
|
||||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
|
||||||
if expr "$link" : '/.*' > /dev/null; then
|
|
||||||
PRG="$link"
|
|
||||||
else
|
|
||||||
PRG=`dirname "$PRG"`"/$link"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
SAVED="`pwd`"
|
|
||||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
|
||||||
APP_HOME="`pwd -P`"
|
|
||||||
cd "$SAVED" >/dev/null
|
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
|
||||||
APP_BASE_NAME=`basename "$0"`
|
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
|
||||||
MAX_FD="maximum"
|
|
||||||
|
|
||||||
warn () {
|
|
||||||
echo "$*"
|
|
||||||
}
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo
|
|
||||||
echo "$*"
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# OS specific support (must be 'true' or 'false').
|
|
||||||
cygwin=false
|
|
||||||
msys=false
|
|
||||||
darwin=false
|
|
||||||
nonstop=false
|
|
||||||
case "`uname`" in
|
|
||||||
CYGWIN* )
|
|
||||||
cygwin=true
|
|
||||||
;;
|
|
||||||
Darwin* )
|
|
||||||
darwin=true
|
|
||||||
;;
|
|
||||||
MINGW* )
|
|
||||||
msys=true
|
|
||||||
;;
|
|
||||||
NONSTOP* )
|
|
||||||
nonstop=true
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|
||||||
|
|
||||||
# Determine the Java command to use to start the JVM.
|
|
||||||
if [ -n "$JAVA_HOME" ] ; then
|
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
|
||||||
# IBM's JDK on AIX uses strange locations for the executables
|
|
||||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
|
||||||
else
|
|
||||||
JAVACMD="$JAVA_HOME/bin/java"
|
|
||||||
fi
|
|
||||||
if [ ! -x "$JAVACMD" ] ; then
|
|
||||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
location of your Java installation."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
JAVACMD="java"
|
|
||||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
location of your Java installation."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
|
||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
|
||||||
MAX_FD_LIMIT=`ulimit -H -n`
|
|
||||||
if [ $? -eq 0 ] ; then
|
|
||||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
|
||||||
MAX_FD="$MAX_FD_LIMIT"
|
|
||||||
fi
|
|
||||||
ulimit -n $MAX_FD
|
|
||||||
if [ $? -ne 0 ] ; then
|
|
||||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Darwin, add options to specify how the application appears in the dock
|
|
||||||
if $darwin; then
|
|
||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
|
||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
|
||||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
|
||||||
SEP=""
|
|
||||||
for dir in $ROOTDIRSRAW ; do
|
|
||||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
|
||||||
SEP="|"
|
|
||||||
done
|
|
||||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
|
||||||
# Add a user-defined pattern to the cygpath arguments
|
|
||||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
|
||||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
|
||||||
fi
|
|
||||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
|
||||||
i=0
|
|
||||||
for arg in "$@" ; do
|
|
||||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
|
||||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
|
||||||
|
|
||||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
|
||||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
|
||||||
else
|
|
||||||
eval `echo args$i`="\"$arg\""
|
|
||||||
fi
|
|
||||||
i=`expr $i + 1`
|
|
||||||
done
|
|
||||||
case $i in
|
|
||||||
0) set -- ;;
|
|
||||||
1) set -- "$args0" ;;
|
|
||||||
2) set -- "$args0" "$args1" ;;
|
|
||||||
3) set -- "$args0" "$args1" "$args2" ;;
|
|
||||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
|
||||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
|
||||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
|
||||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
|
||||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
|
||||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Escape application args
|
|
||||||
save () {
|
|
||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
|
||||||
echo " "
|
|
||||||
}
|
|
||||||
APP_ARGS=`save "$@"`
|
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
|
|
@ -1,100 +0,0 @@
|
||||||
@rem
|
|
||||||
@rem Copyright 2015 the original author or authors.
|
|
||||||
@rem
|
|
||||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
@rem you may not use this file except in compliance with the License.
|
|
||||||
@rem You may obtain a copy of the License at
|
|
||||||
@rem
|
|
||||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
@rem
|
|
||||||
@rem Unless required by applicable law or agreed to in writing, software
|
|
||||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
@rem See the License for the specific language governing permissions and
|
|
||||||
@rem limitations under the License.
|
|
||||||
@rem
|
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
|
||||||
@rem ##########################################################################
|
|
||||||
@rem
|
|
||||||
@rem Gradle startup script for Windows
|
|
||||||
@rem
|
|
||||||
@rem ##########################################################################
|
|
||||||
|
|
||||||
@rem Set local scope for the variables with windows NT shell
|
|
||||||
if "%OS%"=="Windows_NT" setlocal
|
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
|
||||||
set APP_BASE_NAME=%~n0
|
|
||||||
set APP_HOME=%DIRNAME%
|
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
||||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
|
||||||
|
|
||||||
@rem Find java.exe
|
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
|
||||||
|
|
||||||
set JAVA_EXE=java.exe
|
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
|
||||||
if "%ERRORLEVEL%" == "0" goto init
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
|
||||||
echo.
|
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
echo location of your Java installation.
|
|
||||||
|
|
||||||
goto fail
|
|
||||||
|
|
||||||
:findJavaFromJavaHome
|
|
||||||
set JAVA_HOME=%JAVA_HOME:"=%
|
|
||||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
|
||||||
|
|
||||||
if exist "%JAVA_EXE%" goto init
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
|
||||||
echo.
|
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
echo location of your Java installation.
|
|
||||||
|
|
||||||
goto fail
|
|
||||||
|
|
||||||
:init
|
|
||||||
@rem Get command-line arguments, handling Windows variants
|
|
||||||
|
|
||||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
|
||||||
|
|
||||||
:win9xME_args
|
|
||||||
@rem Slurp the command line arguments.
|
|
||||||
set CMD_LINE_ARGS=
|
|
||||||
set _SKIP=2
|
|
||||||
|
|
||||||
:win9xME_args_slurp
|
|
||||||
if "x%~1" == "x" goto execute
|
|
||||||
|
|
||||||
set CMD_LINE_ARGS=%*
|
|
||||||
|
|
||||||
:execute
|
|
||||||
@rem Setup the command line
|
|
||||||
|
|
||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|
||||||
|
|
||||||
@rem Execute Gradle
|
|
||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
|
||||||
|
|
||||||
:end
|
|
||||||
@rem End local scope for the variables with windows NT shell
|
|
||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
|
||||||
|
|
||||||
:fail
|
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
|
||||||
rem the _cmd.exe /c_ return code!
|
|
||||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
|
||||||
exit /b 1
|
|
||||||
|
|
||||||
:mainEnd
|
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
|
||||||
|
|
||||||
:omega
|
|
|
@ -1,15 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
# Implementation Details
|
|
||||||
|
|
||||||
USB serial
|
|
||||||
https://github.com/mik3y/usb-serial-for-android
|
|
||||||
|
|
||||||
DFU implementation
|
|
||||||
https://github.com/rusefi/dfu_java
|
|
||||||
|
|
||||||
Error reporting uses
|
|
||||||
https://github.com/ACRA/acra
|
|
||||||
|
|
||||||
Hex reader based on
|
|
||||||
https://github.com/encedo/hex2dfu
|
|
|
@ -1,17 +0,0 @@
|
||||||
include ':app'
|
|
||||||
include ':core_io'
|
|
||||||
project(':core_io').projectDir = new File('../java_console/shared_io')
|
|
||||||
include ':core_ui'
|
|
||||||
project(':core_ui').projectDir = new File('../java_console/core_ui')
|
|
||||||
include ':shared_ui'
|
|
||||||
project(':shared_ui').projectDir = new File('../java_console/shared_ui')
|
|
||||||
include ':ecu_io'
|
|
||||||
project(':ecu_io').projectDir = new File('../java_console/io')
|
|
||||||
include ':logging'
|
|
||||||
project(':logging').projectDir = new File('../java_console/logging')
|
|
||||||
include ':logging-api'
|
|
||||||
project(':logging-api').projectDir = new File('../java_console/logging-api')
|
|
||||||
include ':inifile'
|
|
||||||
project(':inifile').projectDir = new File('../java_console/inifile')
|
|
||||||
include ':models'
|
|
||||||
project(':models').projectDir = new File('../java_console/models')
|
|
|
@ -3,7 +3,6 @@ plugins {
|
||||||
id 'java-test-fixtures'
|
id 'java-test-fixtures'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: '../../android/dependencies.gradle'
|
|
||||||
apply from: '../../java_tools/dependencies.gradle'
|
apply from: '../../java_tools/dependencies.gradle'
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
|
|
|
@ -2,8 +2,6 @@ plugins {
|
||||||
id 'java'
|
id 'java'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: '../../android/dependencies.gradle'
|
|
||||||
|
|
||||||
// TODO: rename folder to core_io
|
// TODO: rename folder to core_io
|
||||||
// this CORE module cannot depend on model/ini!
|
// this CORE module cannot depend on model/ini!
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ Here we have some tiny dev utilities - average rusEFI user would not need to use
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
cd android
|
cd java_tools
|
||||||
./gradlew :config_definition:shadowJar
|
./gradlew :config_definition:shadowJar
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue