Updated app package name to replace old one (lost the publishing keys)

Added apk file
This commit is contained in:
Furrtek
2023-08-06 20:31:53 +02:00
parent c583ea40f8
commit d2ec4deae4
53 changed files with 67 additions and 15909 deletions

10
.gitignore vendored
View File

@@ -4,3 +4,13 @@
tools_python/frames.txt
*.prefs
*.exe
*.pyc
tools_python/prod_test.py
tools_python/debug.py
gui/
*.bmp
*.o
*.elf
*.map
*.d
*.psd

BIN
PriceHax/PriceHax_20.apk Normal file

Binary file not shown.

View File

@@ -3,17 +3,16 @@ plugins {
}
android {
namespace 'org.furrtek.pricehax'
namespace 'org.furrtek.pricehax2'
compileSdk 32
defaultConfig {
applicationId "org.furrtek.pricehax"
applicationId "org.furrtek.pricehax2"
minSdk 24
targetSdk 32
versionCode 2
versionName "2.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86_64'
}
buildTypes {

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<manifest package="org.furrtek.pricehax2"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.CAMERA"/>

View File

@@ -1,253 +0,0 @@
package org.furrtek.pricehax;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Build;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.content.Intent;
import android.content.Context;
import android.app.PendingIntent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.snackbar.Snackbar;
import org.furrtek.pricehax.databinding.FragmentFirstBinding;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.util.SerialInputOutputManager;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class FirstFragment extends Fragment {
private enum UsbPermission { Unknown, Requested, Granted, Denied }
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
private FragmentFirstBinding binding;
private int deviceId, portNum, baudRate;
private UsbSerialPort usbSerialPort;
private UsbPermission usbPermission = UsbPermission.Unknown;
private SerialInputOutputManager usbIoManager;
private boolean connected = false;
private static final int SELECT_IMAGE = 100;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
ImageView imgbmp;
Bitmap scaledimage;
if (requestCode == SELECT_IMAGE) {
if (resultCode == Activity.RESULT_OK) {
if (imageReturnedIntent.getData() != null) {
try {
Uri selectedImage = imageReturnedIntent.getData();
Object imageStream = getContentResolver().openInputStream(selectedImage);
imgbmp = (ImageView) findViewById(R.id.imageview_dm);
Bitmap image = BitmapFactory.decodeStream(imageStream);
scaledimage = Bitmap.createScaledBitmap(image, wi, hi, true);
imgbmp.setImageBitmap(scaledimage);
} catch (Exception e) {
Log.d("PHX", e.getLocalizedMessage());
}
}
}
}
}
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentFirstBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public byte[] Transmit(List<Byte> list) {
byte[] data = new byte[list.size() + 5 + 1];
data[0] = 76;
data[1] = (byte)list.size();
data[2] = 30;
data[3] = 100;
data[4] = 0;
for(int i = 0; i < list.size(); i++) {
data[i + 5] = list.get(i).byteValue();
}
data[data.length - 1] = 84;
// Debug
String hex_str = "";
for (byte b : data) {
hex_str += String.format("%02X ", b);
}
Log.d("TX", hex_str);
return data;
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testconnect(view);
}
});
binding.buttonTxA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//byte data[] = {76, 13, 30, 100, 0, (byte)0x85, 0x00, 0x00, 0x00, 0x00, 0x06, (byte)0xF1, 0x00, 0x00, 0x00, 0x0A, 0x5D, 0x14, 84};
IRFrame frame = new IRFrame();
frame.PLID = 0;
frame.protocol = (byte)0x85;
Byte[] pl = {0x06, (byte)0x03, 0x00, 0x00};
EditText text = (EditText)getView().findViewById(R.id.customValue);
byte b = (byte)Integer.parseInt(text.getText().toString(), 16);
pl[1] = b;
frame.payload = Arrays.asList(pl);
byte[] data = FirstFragment.this.Transmit(frame.getRawData(false));
try {
if (connected)
usbSerialPort.write(data, 1000);
}
catch(IOException e) {
e.printStackTrace();
}
}
});
binding.buttonTxB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
byte data[] = {76, 13, 30, 100, 0, (byte)0x85, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x00, 0x01, 0x08, 0x6F, 84};
try {
if (connected)
usbSerialPort.write(data, 1000);
}
catch(IOException e) {
e.printStackTrace();
}
}
});
binding.buttonLoadImg.setOnLongClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
photoPickerIntent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(photoPickerIntent, SELECT_IMAGE);
}
});
}
public void status(View view, String msg) {
Snackbar.make(view, msg, Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
public void testconnect(View view) {
/*NavHostFragment.findNavController(FirstFragment.this)
.navigate(R.id.action_FirstFragment_to_SecondFragment);*/
UsbDevice device = null;
UsbManager usbManager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE);
/*for(UsbDevice v : usbManager.getDeviceList().values())
if(v.getDeviceId() == deviceId)
device = v;*/
Collection<UsbDevice> devices = usbManager.getDeviceList().values();
if (devices.size() == 0)
return;
device = devices.iterator().next();
if(device == null) {
status(view,"connection failed: device not found");
return;
}
UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device);
if(driver == null) {
//status(view,"connection failed: no driver for device");
//status(view, String.valueOf(device.getVendorId())); // 1155 = 0x483 ok
status(view, String.valueOf(device.getProductId()));
return;
}
if(driver.getPorts().size() < portNum) {
status(view,"connection failed: not enough ports at device");
return;
}
usbSerialPort = driver.getPorts().get(portNum);
UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice());
if(usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) {
usbPermission = UsbPermission.Requested;
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0;
PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(getActivity(), 0, new Intent(INTENT_ACTION_GRANT_USB), flags);
usbManager.requestPermission(driver.getDevice(), usbPermissionIntent);
return;
}
if(usbConnection == null) {
if (!usbManager.hasPermission(driver.getDevice()))
status(view,"connection failed: permission denied");
else
status(view,"connection failed: open failed");
return;
}
try {
usbSerialPort.open(usbConnection);
usbSerialPort.setParameters(57600, 8, 1, UsbSerialPort.PARITY_NONE);
//if(withIoManager) {
// usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
// usbIoManager.start();
//}
status(view,"connected");
connected = true;
} catch (Exception e) {
status(view,"connection failed: " + e.getMessage());
disconnect();
}
}
private void disconnect() {
connected = false;
if(usbIoManager != null) {
usbIoManager.setListener(null);
usbIoManager.stop();
}
usbIoManager = null;
try {
usbSerialPort.close();
} catch (IOException ignored) {}
usbSerialPort = null;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@@ -1,212 +0,0 @@
package org.furrtek.pricehax;
import android.os.Bundle;
import android.os.Build;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.content.Intent;
import android.content.Context;
import android.app.PendingIntent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.snackbar.Snackbar;
import org.furrtek.pricehax.databinding.FragmentFirstBinding;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.util.SerialInputOutputManager;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class FirstFragment extends Fragment {
private enum UsbPermission { Unknown, Requested, Granted, Denied }
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
private FragmentFirstBinding binding;
private int deviceId, portNum, baudRate;
private UsbSerialPort usbSerialPort;
private UsbPermission usbPermission = UsbPermission.Unknown;
private SerialInputOutputManager usbIoManager;
private boolean connected = false;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentFirstBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public byte[] Transmit(List<Byte> list) {
byte[] data = new byte[list.size() + 5 + 1];
data[0] = 76;
data[1] = (byte)list.size();
data[2] = 30;
data[3] = 100;
data[4] = 0;
for(int i = 0; i < list.size(); i++) {
data[i + 5] = list.get(i).byteValue();
}
data[data.length - 1] = 84;
// Debug
String hex_str = "";
for (byte b : data) {
hex_str += String.format("%02X ", b);
}
Log.d("TX", hex_str);
return data;
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testconnect(view);
}
});
binding.buttonTxA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//byte data[] = {76, 13, 30, 100, 0, (byte)0x85, 0x00, 0x00, 0x00, 0x00, 0x06, (byte)0xF1, 0x00, 0x00, 0x00, 0x0A, 0x5D, 0x14, 84};
IRFrame frame = new IRFrame();
frame.PLID = 0;
frame.protocol = (byte)0x85;
Byte[] pl = {0x06, (byte)0x03, 0x00, 0x00};
EditText text = (EditText)getView().findViewById(R.id.customValue);
byte b = (byte)Integer.parseInt(text.getText().toString(), 16);
pl[1] = b;
frame.payload = Arrays.asList(pl);
byte[] data = FirstFragment.this.Transmit(frame.getRawData(false));
try {
if (connected)
usbSerialPort.write(data, 1000);
}
catch(IOException e) {
e.printStackTrace();
}
}
});
binding.buttonTxB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
byte data[] = {76, 13, 30, 100, 0, (byte)0x85, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x00, 0x01, 0x08, 0x6F, 84};
try {
if (connected)
usbSerialPort.write(data, 1000);
}
catch(IOException e) {
e.printStackTrace();
}
}
});
}
public void status(View view, String msg) {
Snackbar.make(view, msg, Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
public void testconnect(View view) {
/*NavHostFragment.findNavController(FirstFragment.this)
.navigate(R.id.action_FirstFragment_to_SecondFragment);*/
UsbDevice device = null;
UsbManager usbManager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE);
/*for(UsbDevice v : usbManager.getDeviceList().values())
if(v.getDeviceId() == deviceId)
device = v;*/
Collection<UsbDevice> devices = usbManager.getDeviceList().values();
if (devices.size() == 0)
return;
device = devices.iterator().next();
if(device == null) {
status(view,"connection failed: device not found");
return;
}
UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device);
if(driver == null) {
//status(view,"connection failed: no driver for device");
//status(view, String.valueOf(device.getVendorId())); // 1155 = 0x483 ok
status(view, String.valueOf(device.getProductId()));
return;
}
if(driver.getPorts().size() < portNum) {
status(view,"connection failed: not enough ports at device");
return;
}
usbSerialPort = driver.getPorts().get(portNum);
UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice());
if(usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) {
usbPermission = UsbPermission.Requested;
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0;
PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(getActivity(), 0, new Intent(INTENT_ACTION_GRANT_USB), flags);
usbManager.requestPermission(driver.getDevice(), usbPermissionIntent);
return;
}
if(usbConnection == null) {
if (!usbManager.hasPermission(driver.getDevice()))
status(view,"connection failed: permission denied");
else
status(view,"connection failed: open failed");
return;
}
try {
usbSerialPort.open(usbConnection);
usbSerialPort.setParameters(57600, 8, 1, UsbSerialPort.PARITY_NONE);
//if(withIoManager) {
// usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
// usbIoManager.start();
//}
status(view,"connected");
connected = true;
} catch (Exception e) {
status(view,"connection failed: " + e.getMessage());
disconnect();
}
}
private void disconnect() {
connected = false;
if(usbIoManager != null) {
usbIoManager.setListener(null);
usbIoManager.stop();
}
usbIoManager = null;
try {
usbSerialPort.close();
} catch (IOException ignored) {}
usbSerialPort = null;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@@ -1,46 +0,0 @@
package org.furrtek.pricehax;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;
import org.furrtek.pricehax.databinding.FragmentSecondBinding;
public class SecondFragment extends Fragment {
private FragmentSecondBinding binding;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentSecondBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.buttonSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(SecondFragment.this)
.navigate(R.id.action_SecondFragment_to_FirstFragment);
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
public interface AsyncResponse {
//Add requestCode to identify request.

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
public interface AsyncResponseTX {
//Add requestCode to identify request.

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.app.Activity;
import android.content.Context;

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.graphics.Bitmap;
import android.os.AsyncTask;
@@ -11,7 +11,7 @@ import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import static org.furrtek.pricehax.DitherBitmap.floydSteinbergDithering;
import static org.furrtek.pricehax2.DitherBitmap.floydSteinbergDithering;
public class DMConvert extends AsyncTask<Bitmap, Integer, DMImage> {
private ImageView mImageView;
@@ -117,6 +117,7 @@ public class DMConvert extends AsyncTask<Bitmap, Integer, DMImage> {
byte[] bytes = bitstream.toByteArray();
for (byte b : bytes) {
int x = 0;
// Reverse bit order
for (int c = 0; c < 8; c++) {
x >>= 1;
if (b < 0)

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.graphics.Bitmap;
import android.os.AsyncTask;
@@ -12,7 +12,7 @@ import java.util.Arrays;
import java.util.BitSet;
import java.util.List;
import static org.furrtek.pricehax.DitherBitmap.floydSteinbergDithering;
import static org.furrtek.pricehax2.DitherBitmap.floydSteinbergDithering;
public class DMGen {
public static List<IRFrame> DMGenFrames(DMImage dmImage, boolean BWR, Long PLID, int dispPage) {
@@ -22,6 +22,7 @@ public class DMGen {
Byte[] payload = {(byte) 0x17, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
frames.add(new IRFrame(PLID, (byte)0x85, Arrays.asList(payload), 30, 200)); // TODO: Check delay and repeats
// Start frame
int datalen = dmImage.byteStreamBW.size(); // TODO: Pass selected BW or BWR bytestream instead of dmImage
int width = dmImage.bitmapBW.getWidth();
int height = dmImage.bitmapBW.getHeight();
@@ -45,42 +46,13 @@ public class DMGen {
};
frames.add(new IRFrame(PLID, (byte)0x85, Arrays.asList(payload_start), 30, 1)); // TODO: Check delay and repeats
/*ymax = datalen / 40; // WAS 20
for (y = 0; y < datalen / 40; y++) { // WAS 20
startcode[0] = (byte) 0x85;
startcode[1] = (byte) (plID & 255);
startcode[2] = (byte) (plID >> 8);
startcode[3] = (byte) (plID >> 16);
startcode[4] = (byte) (plID >> 24);
startcode[5] = (byte) 0x34;
startcode[6] = (byte) 0x00;
startcode[7] = (byte) 0x00;
startcode[8] = (byte) 0x00;
startcode[9] = (byte) 0x20;
startcode[10] = (byte) (y >> 16);
startcode[11] = (byte) (y & 255);
for (int cp = 0; cp < 40; cp++) { // WAS 20
startcode[12 + cp] = hexlist.get(cp + (y * 40)); // WAS 20
}
FrameCRC = CRCCalc.GetCRC(startcode, 52); // WAS 32
startcode[52] = FrameCRC[0]; // WAS 32
startcode[53] = FrameCRC[1]; // WAS 33
// Send !
PP4C.sendPP4C(at.getApplicationContext(), startcode, 54, donglever, 1, audioTrack); // WAS 34
}*/
// Data frames
Log.d("PHX", String.format("Datalen %d", datalen));
int ymax = (int) Math.ceil((double)datalen / 20);
Log.d("PHX", String.format("ymax %d", ymax));
for (y = 0; y < ymax; y++) {
Byte[] payload_data = new Byte[27];
Log.d("PHX", String.format("Gen data frame %d", y));
/* (byte) 0x34, 0, 0, 0, 0x20, (byte) (y >> 8), (byte) (y & 255)*/
payload_data[0] = (byte) 0x34;
payload_data[1] = (byte) 0;
payload_data[2] = (byte) 0;
@@ -94,37 +66,7 @@ public class DMGen {
frames.add(new IRFrame(PLID, (byte)0x85, Arrays.asList(payload_data), 30, 1)); // TODO: Check delay and repeats
}
/*
byte[] vercode = {(byte) 0x85, 0, 0, 0, 0, 0x34, 00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00};
vercode[1] = (byte) (plID & 255);
vercode[2] = (byte) (plID >> 8);
vercode[3] = (byte) (plID >> 16);
vercode[4] = (byte) (plID >> 24);
FrameCRC = CRCCalc.GetCRC(vercode, 28);
vercode[28] = FrameCRC[0];
vercode[29] = FrameCRC[1];
runOnUiThread(new Runnable() {
@Override
public void run() {
txtworkh.setText("Verify frame...");
}
});
// Send !
PP4C.sendPP4C(at.getApplicationContext(), vercode, 30, donglever, 10, audioTrack);
SystemClock.sleep(2000);
runOnUiThread(new Runnable() {
@Override
public void run() {
txtworkh.setText("Done ! ;-)");
}
});*/
// Refresh frame
Byte[] payloadc = {(byte) 0x34, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
frames.add(new IRFrame(PLID, (byte)0x85, Arrays.asList(payloadc), 30, 1)); // TODO: Check delay and repeats

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.graphics.Bitmap;

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.graphics.Bitmap;
import android.graphics.Color;

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.graphics.Bitmap;
import android.os.AsyncTask;
@@ -95,6 +95,7 @@ public class ESLBlaster extends AsyncTask<List<IRFrame>, TXProgress, Boolean> {
};
}
if (w == 10) {
Log.d("PHX", "Comm timeout");
endTX(); // Timed out
return false;
}

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.util.Log;

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
import android.Manifest;
import android.app.Activity;
@@ -15,7 +15,6 @@ import android.hardware.Camera;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.os.AsyncTask;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
@@ -46,7 +45,7 @@ import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import org.furrtek.pricehax.databinding.ActivityMainBinding;
import org.furrtek.pricehax2.databinding.ActivityMainBinding;
import java.nio.charset.StandardCharsets;
import java.util.*;
@@ -59,25 +58,23 @@ public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private Handler autoFocusHandler;
private CameraPreview mPreview;
private long lastPLID = 0;
CoordinatorLayout mainlayout;
private enum UsbPermission { Unknown, Requested, Granted, Denied }
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
private UsbSerialPort usbSerialPort;
private UsbPermission usbPermission = UsbPermission.Unknown;
private SerialInputOutputManager usbIoManager;
FrameLayout preview;
ImageScanner scanner;
private long lastPLID = 0;
String lastBarcodeString = "";
int imageScale = 100;
DMImage dmImage = null;
boolean inBWR = false;
private enum UsbPermission { Unknown, Requested, Granted, Denied }
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
private int deviceId, portNum, baudRate;
private UsbSerialPort usbSerialPort;
private UsbPermission usbPermission = UsbPermission.Unknown;
private SerialInputOutputManager usbIoManager;
private boolean blasterConnected = false;
char blasterHWVersion;
int blasterFWVersion;
CoordinatorLayout mainlayout;
Uri selectedImageUri = null;
int dispDurationIdx, dispPage;
//AsyncResponseTX asyncTaskTX = null;
@@ -165,7 +162,7 @@ public class MainActivity extends AppCompatActivity {
binding.main.buttonTXPageDM.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 0x85, 0x00, 0x00, 0x00, 0x00, 0x06, 0xF1, 0x00, 0x00, 0x00, 0x0A, 0x5D, 0x14
// 0x85, 0x00, 0x00, 0x00, 0x00, 0x06, 0xF1, 0x00, 0x00, 0x00, 0x00
List<IRFrame> frames = new ArrayList<IRFrame>();
Byte[] payload = {0x06, 0x00, 0x00, 0x00, 0x00, 0x00};
payload[1] = (byte)(((dispPage & 7) << 3) | 1);
@@ -296,7 +293,7 @@ public class MainActivity extends AppCompatActivity {
registerReceiver(USBReceiver, filter);
// Load default image
selectedImageUri = Uri.parse("android.resource://org.furrtek.pricehax/" + R.drawable.dm_128x64);
selectedImageUri = Uri.parse("android.resource://org.furrtek.pricehax2/" + R.drawable.dm_128x64);
convertImage();
}
@@ -409,12 +406,6 @@ public class MainActivity extends AppCompatActivity {
binding.main.textLastScanned.setText("Last scanned:\n" + barcodeString + "\n (" + strSupplement + ")");
}
lastBarcodeString = barcodeString;
/*MainActivity.this.previewing = false;
camera.setPreviewCallback(null);
camera.stopPreview();
MainActivity.this.scanButton.setText("Scan another ESL barcode?");*/
//}
}
}
};
@@ -428,8 +419,6 @@ public class MainActivity extends AppCompatActivity {
Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
// postDelayed() will call doAutoFocus() and onAutoFocus() will be called again from mCamera.autoFocus().
// This will create a timer that will readjust the focus every second.
MainActivity.this.autoFocusHandler.postDelayed(MainActivity.this.doAutoFocus, 1000);
}
};
@@ -438,7 +427,6 @@ public class MainActivity extends AppCompatActivity {
// Init Camera preview
this.autoFocusHandler = new Handler();
this.mPreview = new CameraPreview(this, this.previewCb, this.autoFocusCB);
//this.preview = (FrameLayout) findViewById(R.id.cameraPreview);
this.preview = binding.main.cameraPreview;
this.preview.addView(this.mPreview);
@@ -482,16 +470,14 @@ public class MainActivity extends AppCompatActivity {
}
UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device);
if (driver == null) {
//status(view,"connection failed: no driver for device");
//status(view, String.valueOf(device.getVendorId())); // 1155 = 0x483 ok
status(String.valueOf(device.getProductId()));
status("ESL Blaster connection failed: no driver found");
return;
}
if (driver.getPorts().size() < portNum) {
if (driver.getPorts().size() < 0) {
status("ESL Blaster connection failed: not enough ports at device");
return;
}
usbSerialPort = driver.getPorts().get(portNum);
usbSerialPort = driver.getPorts().get(0);
UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice());
if (usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) {
usbPermission = UsbPermission.Requested;
@@ -569,12 +555,8 @@ public class MainActivity extends AppCompatActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_about) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("App and ESL Blaster by furrtek\nhttps://github.com/furrtek/PrecIR/\n\nThanks to: Aoi, david4599, Deadbird, Dr.Windaube, Sigmounte, BiduleOhm, Virtualabs, LightSnivy")
@@ -593,13 +575,4 @@ public class MainActivity extends AppCompatActivity {
return super.onOptionsItemSelected(item);
}
/*@Override
protected void onNewIntent(Intent intent) {
if("android.hardware.usb.action.USB_DEVICE_ATTACHED".equals(intent.getAction())) {
//Log.i("PriceHax", "Device detected !");
//MainActivity.this.scaneibarcode.setText("USB_DEVICE_ATTACHED !");
}
super.onNewIntent(intent);
}*/
}

View File

@@ -1,4 +1,4 @@
package org.furrtek.pricehax;
package org.furrtek.pricehax2;
public class TXProgress {
public int percent;

View File

@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#DD7F7F">
<group android:scaleX="0.4524"
android:scaleY="0.4524"
android:translateX="6.5712"
android:translateY="6.5712">
<path
android:fillColor="@android:color/white"
android:pathData="M12,5c-3.87,0 -7,3.13 -7,7h2c0,-2.76 2.24,-5 5,-5s5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM13,14.29c0.88,-0.39 1.5,-1.26 1.5,-2.29 0,-1.38 -1.12,-2.5 -2.5,-2.5S9.5,10.62 9.5,12c0,1.02 0.62,1.9 1.5,2.29v3.3L7.59,21 9,22.41l3,-3 3,3L16.41,21 13,17.59v-3.3zM12,1C5.93,1 1,5.93 1,12h2c0,-4.97 4.03,-9 9,-9s9,4.03 9,9h2c0,-6.07 -4.93,-11 -11,-11z"/>
</group>
</vector>

View File

@@ -1,7 +1,7 @@
<menu 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"
tools:context="org.furrtek.pricehax.MainActivity">
tools:context="org.furrtek.pricehax2.MainActivity">
<item android:id="@+id/action_help"
android:title="Help"
android:orderInCategory="100"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#8B1624</color>
</resources>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +0,0 @@
..\dfu-util-0.9-win64\dfu-util --device 0483:df11 -a 0 -s 0x08000000:leave --upload readback.bin
pause

View File

@@ -1,26 +0,0 @@
dfu-util 0.9
These binaries are for Microsoft Windows 64-bit
They were built using MinGW-64 from MSYS2 with gcc 5.3.0,
for build instructions please see:
http://dfu-util.sourceforge.net/build.html
Source code:
https://sourceforge.net/p/dfu-util/dfu-util/ci/v0.9/tree/
dfu-util.exe requires libusb-1.0.dll. The shipped libusb-1.0.dll
is built from libusb 1.0.20 and can be replaced with another
version if desired.
dfu-util-static.exe has the libusb 1.0.20 code embedded and runs
without any libusb-1.0.dll.
Notes:
1. To work around a bug in gcc/mingw, a small patch was applied, see
https://sourceforge.net/p/dfu-util/tickets/13/
2. The dfu-util-static.exe includes libusb that has been patched
to work around a silicon bug in STM32F42X devices:
https://github.com/axoloti/axoloti/blob/master/platform_osx/src/libusb.stdfu.patch
2016-02-11 Tormod Volden

View File

@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1785665080" name="Debug">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1511937219142292811" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1144516242" name="Release">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1437776012717722251" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
</project>

View File

@@ -1,4 +0,0 @@
2F62501ED4689FB349E356AB974DBE57=48E8977AAC6E0610396AB14E14747A8F
8DF89ED150041C4CBC7CB9A9CAA90856=48E8977AAC6E0610396AB14E14747A8F
DC22A860405A8BF2F2C095E5B6529F12=8536A59145044C9EC233B979117E068C
eclipse.preferences.version=1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +0,0 @@
dfu-util 0.9
These binaries are for Microsoft Windows 64-bit
They were built using MinGW-64 from MSYS2 with gcc 5.3.0,
for build instructions please see:
http://dfu-util.sourceforge.net/build.html
Source code:
https://sourceforge.net/p/dfu-util/dfu-util/ci/v0.9/tree/
dfu-util.exe requires libusb-1.0.dll. The shipped libusb-1.0.dll
is built from libusb 1.0.20 and can be replaced with another
version if desired.
dfu-util-static.exe has the libusb 1.0.20 code embedded and runs
without any libusb-1.0.dll.
Notes:
1. To work around a bug in gcc/mingw, a small patch was applied, see
https://sourceforge.net/p/dfu-util/tickets/13/
2. The dfu-util-static.exe includes libusb that has been patched
to work around a silicon bug in STM32F42X devices:
https://github.com/axoloti/axoloti/blob/master/platform_osx/src/libusb.stdfu.patch
2016-02-11 Tormod Volden

View File

@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1785665080" name="Debug">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1223743873136957093" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1144516242" name="Release">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1297905079561527653" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
</project>