Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ddc032be9 | |||
| e6073ded49 | |||
| 7503cefa09 | |||
| 3b4737e6bc | |||
| 76d28e46cd | |||
| 73308f2acc | |||
| c18a93cb1a |
@@ -11,10 +11,10 @@
|
|||||||
|
|
||||||
#### Here is an overview of the main features currently included in the app:
|
#### Here is an overview of the main features currently included in the app:
|
||||||
- This project is written for Android! No need for some kind of janky laptop charging setup.
|
- This project is written for Android! No need for some kind of janky laptop charging setup.
|
||||||
- Similar to ScoutingPASS, there are many diffrent types of fields that can be used to collect data.
|
- Similar to ScoutingPASS, many different types of fields can be used to collect data.
|
||||||
- The app is designed to handle updates to the fields on the fly, without loosing any data!
|
- The app is designed to handle updates to the fields on the fly, without losing any data!
|
||||||
- Unlike other scouting solutions, scouters can disable any field they did not measure, and disabled fields will not be included in any calculations.
|
- Unlike other scouting solutions, scouters can disable any field they did not measure, and disabled fields will not be included in any calculations.
|
||||||
- Dynamic displays based off of the diffrent fields.
|
- Dynamic displays based on the different fields.
|
||||||
- Data transfer including 2D codes, Bluetooth, and File Bundle.
|
- Data transfer including 2D codes, Bluetooth, and File Bundle.
|
||||||
- Exporting using CSV.
|
- Exporting using CSV.
|
||||||
- Deployment on F-Droid
|
- Deployment on F-Droid
|
||||||
@@ -22,10 +22,9 @@
|
|||||||
|
|
||||||
#### Things that are yet to be implemented:
|
#### Things that are yet to be implemented:
|
||||||
- A page that lets users cross-compare scouting data between teams. (Compare)
|
- A page that lets users cross-compare scouting data between teams. (Compare)
|
||||||
- A page that lets scouters more easily make reports to the drive team before a match starts (Report)
|
|
||||||
|
|
||||||
#### Things that may or may not be implemented:
|
#### Things that may or may not be implemented:
|
||||||
- Statbotics intgration
|
- Statbotics integration
|
||||||
- Scout error estimation using OPR-like calculation
|
- Scout error estimation using OPR-like calculation
|
||||||
- - Would most likely require Statbotics
|
- - Would most likely require Statbotics
|
||||||
https://www.thebluealliance.com/avatars
|
https://www.thebluealliance.com/avatars
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ android {
|
|||||||
dependenciesInfo {
|
dependenciesInfo {
|
||||||
// Disables dependency metadata when building APKs.
|
// Disables dependency metadata when building APKs.
|
||||||
includeInApk = false
|
includeInApk = false
|
||||||
// Disables dependency metadata when building Android App Bundles.
|
// Disables dependency metadata when building Android App Bundles.5
|
||||||
includeInBundle = false
|
includeInBundle = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,8 +25,8 @@ android {
|
|||||||
applicationId = "com.ridgebotics.ridgescout"
|
applicationId = "com.ridgebotics.ridgescout"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 34
|
targetSdk = 34
|
||||||
versionCode = 11 // **IMPORTANT** Increment this before releasing on github
|
versionCode = 12 // **IMPORTANT** Increment this before releasing on github
|
||||||
versionName = "1.4"// **IMPORTANT** Change this before releasing on github (<Year num since 2024>.<Update Version>)
|
versionName = "2.0"// **IMPORTANT** Change this before releasing on github (<Year num since 2024>.<Update Version>)
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public class DropdownType extends FieldType {
|
|||||||
.layout_match_wrap()
|
.layout_match_wrap()
|
||||||
.padding(20)
|
.padding(20)
|
||||||
.size(18)
|
.size(18)
|
||||||
.align_center()
|
.align_left()
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ public class NumberType extends FieldType {
|
|||||||
if(data.isNull()) return;
|
if(data.isNull()) return;
|
||||||
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
|
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
|
||||||
.layout_match_wrap()
|
.layout_match_wrap()
|
||||||
.align_center()
|
.align_left()
|
||||||
.size(24)
|
.size(24)
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ public class TallyType extends FieldType {
|
|||||||
if(data.isNull()) return;
|
if(data.isNull()) return;
|
||||||
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
|
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
|
||||||
.layout_match_wrap()
|
.layout_match_wrap()
|
||||||
.align_center()
|
.align_left()
|
||||||
.size(24)
|
.size(24)
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public class TextType extends FieldType {
|
|||||||
if(data.isNull()) return;
|
if(data.isNull()) return;
|
||||||
parent.addView(new TextViewBuilder(parent.getContext(), (String) data.get())
|
parent.addView(new TextViewBuilder(parent.getContext(), (String) data.get())
|
||||||
.layout_match_wrap()
|
.layout_match_wrap()
|
||||||
.align_center()
|
.align_left()
|
||||||
.size(18)
|
.size(18)
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import static com.ridgebotics.ridgescout.utility.DataManager.pit_transferValues;
|
|||||||
import static com.ridgebotics.ridgescout.utility.DataManager.pit_values;
|
import static com.ridgebotics.ridgescout.utility.DataManager.pit_values;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.graphics.Paint;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
@@ -221,19 +222,18 @@ public class TeamsFragment extends Fragment {
|
|||||||
ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[matchIndex], match_values, match_transferValues);
|
ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[matchIndex], match_values, match_transferValues);
|
||||||
|
|
||||||
|
|
||||||
binding.matchArea.addView(
|
TextView title = new TextViewBuilder(getContext(),
|
||||||
new TextViewBuilder(getContext(), "M" + (match_num) + " " + split[2] + "-" + split[3] + " by " + psda.username)
|
"M" + (match_num) + " " + split[2] + "-" + split[3] + " by " + psda.username)
|
||||||
.align_center()
|
.align_center()
|
||||||
.size(30)
|
.size(30)
|
||||||
.padding(0,0,40,5)
|
.padding(0, 0, 40, 5)
|
||||||
.build()
|
.build();
|
||||||
|
title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
||||||
);
|
binding.matchArea.addView(title);
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < psda.data.array.length; i++) {
|
for (int i = 0; i < psda.data.array.length; i++) {
|
||||||
TextViewBuilder tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
|
TextViewBuilder tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
|
||||||
.align_center()
|
.align_left()
|
||||||
.size(25);
|
.size(25);
|
||||||
|
|
||||||
if (psda.data.array[i].isNull()) {
|
if (psda.data.array[i].isNull()) {
|
||||||
@@ -282,6 +282,7 @@ public class TeamsFragment extends Fragment {
|
|||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
if(data[i] != null)
|
if(data[i] != null)
|
||||||
match_latest_values[i].add_compiled_view(binding.matchArea, data[i]);
|
match_latest_values[i].add_compiled_view(binding.matchArea, data[i]);
|
||||||
}
|
}
|
||||||
@@ -307,13 +308,13 @@ public class TeamsFragment extends Fragment {
|
|||||||
|
|
||||||
for(int i = 0; i < match_latest_values.length; i++){
|
for(int i = 0; i < match_latest_values.length; i++){
|
||||||
|
|
||||||
binding.matchArea.addView(
|
TextView tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
|
||||||
new TextViewBuilder(getContext(), match_latest_values[i].name)
|
|
||||||
.align_center()
|
.align_center()
|
||||||
.size(30)
|
.size(30)
|
||||||
.padding(0,0,20,5)
|
.padding(0,0,20,5)
|
||||||
.build()
|
.build();
|
||||||
);
|
tv.setPaintFlags(tv.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
||||||
|
binding.matchArea.addView(tv);
|
||||||
|
|
||||||
if(data[i] != null)
|
if(data[i] != null)
|
||||||
match_latest_values[i].add_history_view(binding.matchArea, data[i]);
|
match_latest_values[i].add_history_view(binding.matchArea, data[i]);
|
||||||
|
|||||||
@@ -157,9 +157,17 @@ public class ScoutingFragment extends Fragment {
|
|||||||
private void updateDashboard() {
|
private void updateDashboard() {
|
||||||
binding.textName.setText("Welcome, " + SettingsManager.getUsername() + "!");
|
binding.textName.setText("Welcome, " + SettingsManager.getUsername() + "!");
|
||||||
|
|
||||||
int curMatchNum = SettingsManager.getMatchNum();
|
binding.textRescoutIndicator.setText("Things to rescout: " + DataManager.rescout_list.size());
|
||||||
int nextMatch;
|
|
||||||
|
if(event.matches.size() == 0) {
|
||||||
|
binding.textMatchAlliance.setText("No Matches!");
|
||||||
|
} else {
|
||||||
int teamNum = SettingsManager.getTeamNum();
|
int teamNum = SettingsManager.getTeamNum();
|
||||||
|
int curMatchNum = SettingsManager.getMatchNum();
|
||||||
|
|
||||||
|
binding.textMatchAlliance.setText("Match: " + (curMatchNum+1) + ", " + SettingsManager.getAllyPos());
|
||||||
|
|
||||||
|
int nextMatch;
|
||||||
try {
|
try {
|
||||||
nextMatch = event.getNextTeamMatch(teamNum, curMatchNum).matchIndex;
|
nextMatch = event.getNextTeamMatch(teamNum, curMatchNum).matchIndex;
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
@@ -167,8 +175,6 @@ public class ScoutingFragment extends Fragment {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.textMatchAlliance.setText("Match: " + (curMatchNum+1) + ", " + SettingsManager.getAllyPos());
|
|
||||||
binding.textRescoutIndicator.setText("Things to rescout: " + DataManager.rescout_list.size());
|
|
||||||
|
|
||||||
binding.infoBox.addView(new TextViewBuilder(getContext(), "Our next match: Match " + nextMatch)
|
binding.infoBox.addView(new TextViewBuilder(getContext(), "Our next match: Match " + nextMatch)
|
||||||
.body1()
|
.body1()
|
||||||
@@ -181,4 +187,5 @@ public class ScoutingFragment extends Fragment {
|
|||||||
.body1()
|
.body1()
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -152,6 +152,8 @@ public class SettingsFragment extends Fragment {
|
|||||||
|
|
||||||
manager.addItem(new CheckboxSettingsItem(EnableQuickAllianceChangeKey, "Enable quick alliance swap", null));
|
manager.addItem(new CheckboxSettingsItem(EnableQuickAllianceChangeKey, "Enable quick alliance swap", null));
|
||||||
manager.addItem(new DropdownSettingsItem(FieldImageKey, "Field Image", new String[]{
|
manager.addItem(new DropdownSettingsItem(FieldImageKey, "Field Image", new String[]{
|
||||||
|
"2026",
|
||||||
|
"2026 (Flipped)",
|
||||||
"2025",
|
"2025",
|
||||||
"2025 (Flipped)"
|
"2025 (Flipped)"
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -165,12 +165,12 @@ public class TBASelectorFragment extends Fragment {
|
|||||||
try {
|
try {
|
||||||
Date startDate = format.parse(j.getString("start_date"));
|
Date startDate = format.parse(j.getString("start_date"));
|
||||||
Date endDate = format.parse(j.getString("end_date"));
|
Date endDate = format.parse(j.getString("end_date"));
|
||||||
if(currentTime.after(endDate)){
|
if(currentTime.after(startDate) && currentTime.before(endDate)) {
|
||||||
|
row.setColor(tba_current);
|
||||||
|
} else if(currentTime.after(endDate)){
|
||||||
row.setColor(tba_previous);
|
row.setColor(tba_previous);
|
||||||
}else if(currentTime.before(startDate)){
|
}else if(currentTime.before(startDate)){
|
||||||
row.setColor(tba_next);
|
row.setColor(tba_next);
|
||||||
}else if(currentTime.after(startDate) && currentTime.before(endDate)){
|
|
||||||
row.setColor(tba_current);
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
AlertManager.error("Failed finding start and end dates!", e);
|
AlertManager.error("Failed finding start and end dates!", e);
|
||||||
|
|||||||
@@ -81,6 +81,12 @@ public class FieldPosView extends FrameLayout {
|
|||||||
case "2025 (Flipped)":
|
case "2025 (Flipped)":
|
||||||
setImageResource(R.drawable.field_2025_flipped);
|
setImageResource(R.drawable.field_2025_flipped);
|
||||||
break;
|
break;
|
||||||
|
case "2026":
|
||||||
|
setImageResource(R.drawable.field_2026);
|
||||||
|
break;
|
||||||
|
case "2026 (Flipped)":
|
||||||
|
setImageResource(R.drawable.field_2026_flipped);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,9 +67,9 @@ public class Colors {
|
|||||||
public static final int fileselector_unselected_color = 0x50006600;
|
public static final int fileselector_unselected_color = 0x50006600;
|
||||||
|
|
||||||
// TBA
|
// TBA
|
||||||
public static final int tba_previous = 0x30FF0000;
|
public static final int tba_previous = Color.argb(30, 64,64,64);
|
||||||
public static final int tba_current = 0x50ff0000;
|
public static final int tba_current = 0x7f00ff00;
|
||||||
public static final int tba_next = 0x30FFFF00;
|
public static final int tba_next = Color.argb(30, 192,192,192);
|
||||||
public static final int tba_red = 0x50ff0000;
|
public static final int tba_red = 0x50ff0000;
|
||||||
public static final int tba_blue = 0x500000ff;
|
public static final int tba_blue = 0x500000ff;
|
||||||
public static final int tba_toggle_background = 0x30000000;
|
public static final int tba_toggle_background = 0x30000000;
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ public class SettingsManager {
|
|||||||
hm.put(UnameKey, "Username");
|
hm.put(UnameKey, "Username");
|
||||||
hm.put(SelEVCodeKey, "unset");
|
hm.put(SelEVCodeKey, "unset");
|
||||||
hm.put(WifiModeKey, false);
|
hm.put(WifiModeKey, false);
|
||||||
hm.put(YearNumKey, 2025);
|
hm.put(YearNumKey, 2026);
|
||||||
hm.put(FieldImageKey, "2025");
|
hm.put(FieldImageKey, "2026");
|
||||||
hm.put(MatchNumKey, 0);
|
hm.put(MatchNumKey, 0);
|
||||||
hm.put(AllyPosKey, "red-1");
|
hm.put(AllyPosKey, "red-1");
|
||||||
hm.put(DataModeKey, 0);
|
hm.put(DataModeKey, 0);
|
||||||
|
|||||||
|
After Width: | Height: | Size: 636 KiB |
|
After Width: | Height: | Size: 954 KiB |
@@ -60,7 +60,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Pit Data"
|
android:text="Pit Data"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:textSize="24sp"
|
android:textSize="35sp"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/team_description2"
|
app:layout_constraintTop_toBottomOf="@+id/team_description2"
|
||||||
tools:layout_editor_absoluteX="0dp" />
|
tools:layout_editor_absoluteX="0dp" />
|
||||||
|
|
||||||
@@ -73,6 +73,11 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/divider3"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="12dp"
|
||||||
|
android:background="?android:attr/listDivider" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
@@ -81,7 +86,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Match Data"
|
android:text="Match Data"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:textSize="24sp"
|
android:textSize="35sp"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/team_description2"
|
app:layout_constraintTop_toBottomOf="@+id/team_description2"
|
||||||
tools:layout_editor_absoluteX="0dp" />
|
tools:layout_editor_absoluteX="0dp" />
|
||||||
|
|
||||||
@@ -139,9 +144,13 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/divider2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:background="?android:attr/listDivider" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[versions]
|
[versions]
|
||||||
agp = "8.13.0"
|
agp = "8.13.2"
|
||||||
junit = "4.13.2"
|
junit = "4.13.2"
|
||||||
junitVersion = "1.1.5"
|
junitVersion = "1.1.5"
|
||||||
espressoCore = "3.5.1"
|
espressoCore = "3.5.1"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 493 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 434 KiB |
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 454 KiB |
@@ -17,7 +17,6 @@ dependencyResolutionManagement {
|
|||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven ( url = "https://jitpack.io" )
|
maven ( url = "https://jitpack.io" )
|
||||||
jcenter()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||