From 3dd6560a754607863c073b3d08035ccf91eaa123 Mon Sep 17 00:00:00 2001 From: astatin3 Date: Wed, 26 Jun 2024 17:24:00 -0600 Subject: [PATCH] Generate transfer_values based off of fields, save field versions to a file. --- .../scoutingapp2025/BuiltByteParser.java | 50 ++++ .../astatin3/scoutingapp2025/ByteBuilder.java | 57 +++- .../ScoutingDataVersion/MatchScouting.java | 126 --------- .../ScoutingDataVersion/ScoutingVersion.java | 245 ++++++++++++++---- .../ScoutingDataVersion/fields.java | 123 +++++++++ .../ui/scouting/matchScoutingView.java | 12 + .../ui/scouting/scoutingFragment.java | 64 +++-- 7 files changed, 478 insertions(+), 199 deletions(-) delete mode 100644 app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/MatchScouting.java create mode 100644 app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/BuiltByteParser.java b/app/src/main/java/com/astatin3/scoutingapp2025/BuiltByteParser.java index 2b9492d..99734bb 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/BuiltByteParser.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/BuiltByteParser.java @@ -8,16 +8,23 @@ import java.util.ArrayList; public class BuiltByteParser { public static final Integer intType = 0; public static final Integer stringType = 1; + public static final Integer intArrayType = 2; + public static final Integer stringArrayType = 3; + public class byteParsingExeption extends Exception { public byteParsingExeption() {} public byteParsingExeption(String message) { super(message); } } + + public abstract class parsedObject { public abstract Integer getType(); public abstract Object get(); } + + public class intObject extends parsedObject{ int num; public Integer getType(){return intType;} @@ -28,6 +35,20 @@ public class BuiltByteParser { public Integer getType(){return stringType;} public Object get(){return str;} } + + + public class intArrayObject extends parsedObject{ + int[] arr; + public Integer getType(){return intArrayType;} + public Object get(){return arr;} + } + public class stringArrayObject extends parsedObject{ + String[] arr; + public Integer getType(){return stringArrayType;} + public Object get(){return arr;} + } + + public class rawObject extends parsedObject { private int type; public rawObject(int type){this.type = type;} @@ -73,6 +94,35 @@ public class BuiltByteParser { so.str = new String(block, StandardCharsets.UTF_8); objects.add(so); break; + case 2: + BuiltByteParser int_bbp = new BuiltByteParser(block); + ArrayList intArrayObjects = int_bbp.parse(); + + int[] intArr = new int[intArrayObjects.size()]; + + for(int i = 0; i < intArrayObjects.size(); i ++){ + intArr[i] = (int) intArrayObjects.get(i).get(); + } + + intArrayObject ia = new intArrayObject(); + ia.arr = intArr; + objects.add(ia); + break; + case 3: + + BuiltByteParser str_bbp = new BuiltByteParser(block); + ArrayList strArrayObjects = str_bbp.parse(); + + String[] StringArr = new String[strArrayObjects.size()]; + + for(int i = 0; i < strArrayObjects.size(); i ++){ + StringArr[i] = (String) strArrayObjects.get(i).get(); + } + + stringArrayObject sa = new stringArrayObject(); + sa.arr = StringArr; + objects.add(sa); + break; default: rawObject ro = new rawObject(type); ro.bytes = block; diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ByteBuilder.java b/app/src/main/java/com/astatin3/scoutingapp2025/ByteBuilder.java index 3e4dc17..78c1592 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ByteBuilder.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ByteBuilder.java @@ -8,6 +8,11 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; public class ByteBuilder { + public static final int int_id = 0; + public static final int string_id = 1; + public static final int int_arr_id = 2; + public static final int string_arr_id = 3; + ArrayList bytesToBuild = new ArrayList<>(); public class buildingException extends Exception { @@ -26,7 +31,7 @@ public class ByteBuilder { private class intType extends byteType { public int precision; public int num; - public byte getType(){return 0;} + public byte getType(){return int_id;} public int length(){return precision;} public byte[] build(){ return fileEditor.toBytes(num, precision); @@ -60,7 +65,7 @@ public class ByteBuilder { private class stringType extends byteType { public byte[] bytes; - public byte getType(){return 1;} + public byte getType(){return string_id;} public int length(){return bytes.length;} public byte[] build(){ return bytes; @@ -78,6 +83,54 @@ public class ByteBuilder { return this; } + private class intArrayType extends byteType { + public byte[] bytes; + public byte getType(){return int_arr_id;} + public int length(){return bytes.length;} + public byte[] build(){ + return bytes; +// return str.getBytes(charset); + } + } + public ByteBuilder addIntArray(int[] arr) throws buildingException { + intArrayType intArrayType = new intArrayType(); + + ByteBuilder bb = new ByteBuilder(); + + for(int i = 0; i < arr.length; i++){ + bb.addInt(arr[i]); + } + + intArrayType.bytes = bb.build(); + + bytesToBuild.add(intArrayType); + return this; + } + + private class stringArrayType extends byteType { + public byte[] bytes; + public byte getType(){return string_arr_id;} + public int length(){return bytes.length;} + public byte[] build(){ + return bytes; +// return str.getBytes(charset); + } + } + public ByteBuilder addStringArray(String[] arr) throws buildingException { + stringArrayType stringArrayType = new stringArrayType(); + + ByteBuilder bb = new ByteBuilder(); + + for(int i = 0; i < arr.length; i++){ + bb.addString(arr[i]); + } + + stringArrayType.bytes = bb.build(); + + bytesToBuild.add(stringArrayType); + return this; + } + private class rawType extends byteType { public int type; public byte[] bytes; diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/MatchScouting.java b/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/MatchScouting.java deleted file mode 100644 index 2896fdd..0000000 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/MatchScouting.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.astatin3.scoutingapp2025.ScoutingDataVersion; - -import android.renderscript.Element; - -import com.astatin3.scoutingapp2025.ScoutingDataVersion.ScoutingVersion.*; - -public class MatchScouting { - public static int latest_version_num = 4; - - public static ScoutingVersion msv = new ScoutingVersion(); - public static MatchScouting ms = new MatchScouting(); - - public static inputType[][] values = new inputType[][] { - { - msv.new usernameType("name", "Unset-Username"), - msv.new sliderType("How good is robot", 5, 0, 10) - }, { - msv.new usernameType("name", "Unset-Username"), - msv.new sliderType("How good is robot", 5, 0, 10), - msv.new notesType("notes", "No-Notes") - },{ - msv.new usernameType("name", "Unset-Username"), -// msv.new sliderType("How good is robot", 5, 0, 10), - msv.new notesType("notes", "No-Notes") - },{ - msv.new usernameType("name", "Unset-Username"), - msv.new sliderType("team_number", 4388, 0, 9999), - msv.new notesType("notes", "No-Notes") - } - }; - public static transferType[][] transfer_values = new transferType[][] { - { - msv.new directTransferType("name"), - msv.new directTransferType("How good is robot"), - msv.new createTransferType("notes") - },{ - msv.new directTransferType("name"), - msv.new renameTransferType("How good is robot", "robot_preformance"), - msv.new directTransferType("notes") - },{ - msv.new directTransferType("name"), - msv.new directTransferType("notes") - },{ - msv.new directTransferType("name"), - msv.new createTransferType("team_number"), - msv.new directTransferType("notes") - } - }; - - - public class MatchScoutingArray { - public int version; - public dataType[] array; - public MatchScoutingArray(int version, dataType[] array){ - this.version = version; - this.array = array; - } - - public void update(){ - while(version objects = bbp.parse(); + + name = (String) objects.get(0).get(); + default_value = objects.get(1).get(); + min = (int) objects.get(2).get(); + max = (int) objects.get(3).get(); + } } public class dropdownType extends inputType { public String[] text_options; -// public int defaultSelIndex; + public int get_byte_id() {return dropdownType;} public inputTypes getInputType(){return inputTypes.DROPDOWN;} public valueTypes getValueType(){return valueTypes.NUM;} + public dropdownType(){}; public dropdownType(String name, String[] text_options, int defaultSelIndex){ super(name); this.text_options = text_options; this.default_value = defaultSelIndex; } + public byte[] encode() throws ByteBuilder.buildingException { + ByteBuilder bb = new ByteBuilder(); + bb.addString(name); + bb.addInt((int)default_value); + bb.addStringArray(text_options); + return bb.build(); + } + public void decode(byte[] bytes) throws BuiltByteParser.byteParsingExeption { + BuiltByteParser bbp = new BuiltByteParser(bytes); + ArrayList objects = bbp.parse(); + + name = (String) objects.get(0).get(); + default_value = objects.get(1).get(); + text_options = (String[]) objects.get(2).get(); + } } public class notesType extends inputType { -// public String default_text; + public int get_byte_id() {return notesType;} public inputTypes getInputType(){return inputTypes.NOTES_INPUT;} public valueTypes getValueType(){return valueTypes.STRING;} + public notesType(){}; public notesType(String name, String default_text){ super(name); this.default_value = default_text; } + public byte[] encode() throws ByteBuilder.buildingException { + ByteBuilder bb = new ByteBuilder(); + bb.addString(name); + bb.addString((String) default_value); + return bb.build(); + } + public void decode(byte[] bytes) throws BuiltByteParser.byteParsingExeption { + BuiltByteParser bbp = new BuiltByteParser(bytes); + ArrayList objects = bbp.parse(); + + name = (String) objects.get(0).get(); + default_value = objects.get(1).get(); + } } + public abstract class dataType { public String name; public Object value; @@ -106,7 +169,7 @@ public class ScoutingVersion { public enum transferValue { DIRECT, - RENAME, +// RENAME, CREATE // DELETE // UP_TO_DATE @@ -127,14 +190,14 @@ public class ScoutingVersion { } } - public class renameTransferType extends transferType { - public String new_name; - public transferValue getType() {return transferValue.RENAME;} - public renameTransferType(String name, String new_name){ - super(name); - this.new_name = new_name; - } - } +// public class renameTransferType extends transferType { +// public String new_name; +// public transferValue getType() {return transferValue.RENAME;} +// public renameTransferType(String name, String new_name){ +// super(name); +// this.new_name = new_name; +// } +// } public class createTransferType extends transferType { @@ -161,35 +224,115 @@ public class ScoutingVersion { -// public boolean save(String filename){ -// ByteBuilder bb = new ByteBuilder(); -// try { -// bb.addInt(getVersion()); -// for(dataType data : getTypes()){ -// if(data.getType() == intType){ -// bb.addInt((int)data.get()); -// } else if (data.getType() == stringType) { -// bb.addString((String)data.get()); -// }else{ -// bb.addRaw(data.getType(), (byte[])data.get()); -// } -// } -// return fileEditor.writeFile(filename, bb.build()); -// } catch (ByteBuilder.buildingException e) { -// e.printStackTrace(); -// return false; + public class ScoutingArray { + public int version; + public dataType[] array; + public ScoutingVersion.inputType[][] values; + public int latest_version_num; + public transferType[][] transfer_values; + + public ScoutingArray(int version, dataType[] array, ScoutingVersion.inputType[][] values, transferType[][] transfer_values){ + this.version = version; + this.array = array; + this.values = values; + this.latest_version_num = values.length-1; + this.transfer_values = transfer_values; + } + + public ScoutingArray(int version, dataType[] array, ScoutingVersion.inputType[][] values){ + this(version, array, values, get_transfer_values(values)); + } + + public void update(){ + while(version parsedObjects = bbp.parse(); -// parse((int)parsedObjects.get(0).get(), parsedObjects); -// } catch (BuiltByteParser.byteParsingExeption e) { -// e.printStackTrace(); -//// throw new RuntimeException(e); -// } -// } + + private dataType create_transfer(createTransferType tv){ + inputType it = get_input_type_by_name(version+1, tv.name); +// System.out.println(tv.name); + switch (it.getValueType()){ + case NUM: + return new intType(it.name, (int) it.default_value); + case STRING: + return new stringType(it.name, (String) it.default_value); + } + System.out.println(2); + return null; + } + + } + + private inputType get_input_type_by_name(inputType[] values, String name){ + for(inputType it : values){ + if(it.name.equals(name)){ + return it; + } + } + return null; + } + + public transferType[][] get_transfer_values(inputType[][] values) { + transferType[][] output = new transferType[values.length][]; + for(int a = 1; a < values.length; a++){ + transferType[] v = new transferType[values[a].length]; + for(int b = 0; b < values[a].length; b++){ + String name = values[a][b].name; + if(get_input_type_by_name(values[a-1], name) != null){ + v[b] = new directTransferType(name); + }else{ + v[b] = new createTransferType(name); + } + } + output[a-1] = v; + } + return output; + } } diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java b/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java index ff0b63e..cbdd6f9 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java @@ -1,4 +1,127 @@ package com.astatin3.scoutingapp2025.ScoutingDataVersion; +import com.astatin3.scoutingapp2025.BuiltByteParser; +import com.astatin3.scoutingapp2025.ByteBuilder; +import com.astatin3.scoutingapp2025.fileEditor; + +import java.util.ArrayList; + public class fields { + private static ScoutingVersion sv = new ScoutingVersion(); + public static final String fieldsFilename = "data.fields"; + + public static ScoutingVersion.inputType[][] values = new ScoutingVersion.inputType[][]{}; + +// public static ScoutingVersion.inputType[][] values = new ScoutingVersion.inputType[][] { +// { +// sv.new notesType("name", "Unset-Username"), +// sv.new sliderType("How good is robot", 5, 0, 10) +// }, { +// sv.new notesType("name", "Unset-Username"), +// sv.new sliderType("How good is robot", 5, 0, 10), +// sv.new notesType("notes", "No-Notes") +// }, { +// sv.new notesType("name", "Unset-Username"), +// sv.new notesType("notes", "No-Notes") +// }, { +// sv.new notesType("name", "Unset-Username") +// }, { +// sv.new notesType("name", "Unset-Username"), +// sv.new sliderType("How good is robot", 5, 0, 10) +// } +// }; + + public static boolean save(){ + try { + ByteBuilder bb = new ByteBuilder(); + for (int i = 0; i < values.length; i++) { + bb.addRaw(127, save_version(values[i])); + } + fileEditor.writeFile(fieldsFilename, bb.build()); + return true; + }catch (ByteBuilder.buildingException e) { + e.printStackTrace(); + return false; +// throw new RuntimeException(e); + } + } + + private static byte[] save_version(ScoutingVersion.inputType[] values) throws ByteBuilder.buildingException { + ByteBuilder bb = new ByteBuilder(); + for(int i =0; i < values.length; i++){ + bb.addRaw(values[i].get_byte_id(), values[i].encode()); + } + return bb.build(); + } + + public static boolean load(){ + byte[] bytes = fileEditor.readFile(fieldsFilename); + + try { + BuiltByteParser bbp = new BuiltByteParser(bytes); + ArrayList objects = bbp.parse(); + values = new ScoutingVersion.inputType[objects.size()][]; + + for(int i = 0 ; i < objects.size(); i++){ + values[i] = load_version((byte[]) objects.get(i).get()); + } + + return true; + } catch (BuiltByteParser.byteParsingExeption e) { + e.printStackTrace(); + return false; + } + } + + private static ScoutingVersion.inputType[] load_version(byte[] bytes) throws BuiltByteParser.byteParsingExeption{ + BuiltByteParser bbp = new BuiltByteParser(bytes); + ArrayList objects = bbp.parse(); + ScoutingVersion.inputType[] output = new ScoutingVersion.inputType[objects.size()]; + + for(int i = 0 ; i < objects.size(); i++){ + BuiltByteParser.parsedObject obj = objects.get(i); + ScoutingVersion.inputType t = null; + switch (obj.getType()){ + case ScoutingVersion.slider_type_id: + t = sv.new sliderType(); + break; + case ScoutingVersion.dropdownType: + t = sv.new dropdownType(); + break; + case ScoutingVersion.notesType: + t = sv.new notesType(); + break; + } + + t.decode((byte[]) obj.get()); + output[i] = t + ; + } + + return output; + } + + public static void test(){ + ScoutingVersion.transferType[][] transferValues = sv.get_transfer_values(values); + + ScoutingVersion.ScoutingArray msa = sv.new ScoutingArray(0, new ScoutingVersion.dataType[]{ + sv.new stringType("name", "test-username"), + sv.new intType("How good is robot", 12) + }, values, transferValues); + + msa.update(); + + for(ScoutingVersion.dataType dt : msa.array){ + if(dt == null) continue; + switch (dt.getValueType()){ + case NUM: + System.out.println(dt.name + " " + (int) dt.get()); + break; + case STRING: + System.out.println(dt.name + " " + (String) dt.get()); + break; + } + + } + } } diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java new file mode 100644 index 0000000..3e851b8 --- /dev/null +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java @@ -0,0 +1,12 @@ +package com.astatin3.scoutingapp2025.ui.scouting; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; + +public class matchScoutingView extends ConstraintLayout { + public matchScoutingView(@NonNull Context context) { + super(context); + } +} diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java index b27d0ea..7815f12 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java @@ -10,8 +10,9 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import com.astatin3.scoutingapp2025.ScoutingDataVersion.MatchScouting; -import com.astatin3.scoutingapp2025.ScoutingDataVersion.ScoutingVersion; +import com.astatin3.scoutingapp2025.BuiltByteParser; +import com.astatin3.scoutingapp2025.ByteBuilder; +import com.astatin3.scoutingapp2025.ScoutingDataVersion.fields; import com.astatin3.scoutingapp2025.SettingsVersionStack.latestSettings; import com.astatin3.scoutingapp2025.databinding.FragmentScoutingBinding; @@ -33,27 +34,50 @@ public class scoutingFragment extends Fragment { } binding.matchScoutingButton.setOnClickListener(v -> { - MatchScouting.MatchScoutingArray msa = MatchScouting.ms.new MatchScoutingArray(0, new ScoutingVersion.dataType[]{ - MatchScouting.msv.new stringType("name", "test-username"), - MatchScouting.msv.new intType("How good is robot", 12) - }); -// System.out.println(Arrays.toString(msa.array)); +// byte[] bytes = fields.save(); +// System.out.println(bytes.length); +// System.out.println(fields.load(bytes)[0].length); - msa.update(); + System.out.println(fields.load()); - for(ScoutingVersion.dataType dt : msa.array){ - if(dt == null) continue; - switch (dt.getValueType()){ - case NUM: - System.out.println(dt.name + " " + (int) dt.get()); - break; - case STRING: - System.out.println(dt.name + " " + (String) dt.get()); - break; - } -// case ScoutingVersion.valueTypes.NUM: + fields.test(); + +// fields.test(); + +// ByteBuilder bb = new ByteBuilder(); +// try { +// bb.addInt(1243); +// bb.addStringArray(new String[]{"Test", "Test2", "Tljewhgr"}); +// bb.addIntArray(new int[]{4, 3, 8, 8}); +// byte[] bytes = bb.build(); +// +// BuiltByteParser bbp = new BuiltByteParser(bytes); +// BuiltByteParser.parsedObject[] objects = bbp.parse().toArray(new BuiltByteParser.parsedObject[0]); +// +// for(BuiltByteParser.parsedObject object : objects){ +// switch (object.getType()){ +// case 0: +// System.out.println((int) object.get()); +// break; +// case 1: +// System.out.println((String) object.get()); +// break; +// case 2: +// System.out.println(Arrays.toString((int[]) object.get())); +// break; +// case 3: +// System.out.println(Arrays.toString((String[]) object.get())); +// break; +// } +// } +// +// +// } catch (ByteBuilder.buildingException e) { +// throw new RuntimeException(e); +// } catch (BuiltByteParser.byteParsingExeption e) { +// throw new RuntimeException(e); +// } - } }); // // binding.pitScoutingButton.setOnClickListener(v -> {