2024-09-15 22:47:45 -06:00
package com.ridgebotics.ridgescout.scoutingData ;
2024-06-28 15:44:38 -06:00
2025-04-04 14:15:30 -06:00
import com.ridgebotics.ridgescout.scoutingData.transfer.TransferType ;
2024-09-15 22:47:45 -06:00
import com.ridgebotics.ridgescout.types.ScoutingArray ;
2025-04-04 14:15:30 -06:00
import com.ridgebotics.ridgescout.types.data.DataType ;
import com.ridgebotics.ridgescout.types.data.IntArrType ;
import com.ridgebotics.ridgescout.types.data.StringType ;
import com.ridgebotics.ridgescout.types.input.FieldType ;
import com.ridgebotics.ridgescout.types.data.IntType ;
2024-09-15 22:47:45 -06:00
import com.ridgebotics.ridgescout.utility.AlertManager ;
2025-04-04 14:15:30 -06:00
import com.ridgebotics.ridgescout.utility.FileEditor ;
2024-09-15 22:47:45 -06:00
import com.ridgebotics.ridgescout.utility.BuiltByteParser ;
import com.ridgebotics.ridgescout.utility.ByteBuilder ;
2024-06-28 15:44:38 -06:00
2025-04-08 12:27:09 -06:00
import java.io.IOException ;
2024-06-28 15:44:38 -06:00
import java.util.ArrayList ;
2024-09-28 12:43:19 -06:00
import java.util.Arrays ;
2025-04-10 14:17:46 -06:00
import java.util.Collections ;
import java.util.List ;
2024-06-28 15:44:38 -06:00
public class ScoutingDataWriter {
// private static final int int_type_id = 255;
// private static final int string_type_id = 254;
2025-04-04 14:15:30 -06:00
public static boolean save ( int version , String username , String filename , DataType [ ] data ) {
2024-06-28 15:44:38 -06:00
ByteBuilder bb = new ByteBuilder ( ) ;
try {
bb . addInt ( version ) ;
bb . addString ( username ) ;
for ( int i = 0 ; i < data . length ; i + + ) {
switch ( data [ i ] . getValueType ( ) ) {
case NUM :
2024-09-04 19:34:06 -06:00
bb . addInt ( ( int ) data [ i ] . forceGetValue ( ) ) ;
2025-04-07 21:41:34 -06:00
System . out . println ( " Saved INT: " + data [ i ] . getUUID ( ) + " , ( " + data [ i ] . get ( ) + " ) " ) ;
2024-06-28 15:44:38 -06:00
break ;
case STRING :
2024-09-04 19:34:06 -06:00
bb . addString ( ( String ) data [ i ] . forceGetValue ( ) ) ;
2025-04-07 21:41:34 -06:00
System . out . println ( " Saved STR: " + data [ i ] . getUUID ( ) + " , ( " + data [ i ] . get ( ) + " ) " ) ;
2024-06-28 15:44:38 -06:00
break ;
2024-09-28 12:43:19 -06:00
case NUMARR :
bb . addIntArray ( ( int [ ] ) data [ i ] . forceGetValue ( ) ) ;
2025-04-07 21:41:34 -06:00
System . out . println ( " Saved INT Array: " + data [ i ] . getUUID ( ) + " , ( " + Arrays . toString ( ( int [ ] ) data [ i ] . get ( ) ) + " ) " ) ;
2024-06-28 15:44:38 -06:00
}
}
byte [ ] bytes = bb . build ( ) ;
2025-04-04 14:15:30 -06:00
FileEditor . writeFile ( filename , bytes ) ;
2024-06-28 15:44:38 -06:00
return true ;
} catch ( ByteBuilder . buildingException e ) {
2024-07-24 15:27:13 -06:00
AlertManager . error ( e ) ;
2024-06-28 15:44:38 -06:00
return false ;
}
}
public static class ParsedScoutingDataResult {
public String filename ;
public String username ;
public int version ;
2024-07-03 10:20:40 -06:00
public ScoutingArray data ;
2024-06-28 15:44:38 -06:00
}
2025-04-04 14:15:30 -06:00
public static ParsedScoutingDataResult load ( String filename , FieldType [ ] [ ] values , TransferType [ ] [ ] transferValues ) {
byte [ ] bytes = FileEditor . readFile ( filename ) ;
2024-06-28 15:44:38 -06:00
BuiltByteParser bbp = new BuiltByteParser ( bytes ) ;
2025-04-08 12:27:09 -06:00
2024-06-28 15:44:38 -06:00
try {
ArrayList < BuiltByteParser . parsedObject > objects = bbp . parse ( ) ;
2025-04-04 14:15:30 -06:00
DataType [ ] dataTypes = new DataType [ objects . size ( ) - 2 ] ;
2024-06-28 15:44:38 -06:00
int version = ( ( int ) objects . get ( 0 ) . get ( ) ) ;
2025-04-08 12:27:09 -06:00
if ( values . length < = version ) {
2025-04-09 18:35:28 -06:00
// AlertManager.addSimpleError("Error loading " + filename);
AlertManager . error ( new BuiltByteParser . byteParsingExeption ( " Field version ( " + version + " ) is too recent as compared to latest version ( " + ( values . length - 1 ) + " )! " ) ) ;
return null ;
2025-04-08 12:27:09 -06:00
}
2024-07-03 19:31:20 -06:00
// System.out.println(version);
2024-06-28 15:44:38 -06:00
String username = ( String ) objects . get ( 1 ) . get ( ) ;
for ( int i = 0 ; i < values [ version ] . length ; i + + ) {
switch ( objects . get ( i + 2 ) . getType ( ) ) {
2024-09-07 11:36:07 -06:00
case 1 : // Int
2025-04-07 21:41:34 -06:00
dataTypes [ i ] = IntType . newNull ( values [ version ] [ i ] . UUID ) ;
2024-09-04 19:34:06 -06:00
dataTypes [ i ] . forceSetValue ( objects . get ( i + 2 ) . get ( ) ) ;
2025-04-07 21:41:34 -06:00
System . out . println ( " Loaded INT: " + values [ version ] [ i ] . name + " ( " + values [ version ] [ i ] . UUID + " ) " + " , ( " + dataTypes [ i ] . get ( ) + " ) " ) ;
2024-06-28 15:44:38 -06:00
break ;
2024-09-07 11:36:07 -06:00
case 2 : // String
2025-04-07 21:41:34 -06:00
dataTypes [ i ] = StringType . newNull ( values [ version ] [ i ] . UUID ) ;
2024-09-04 19:34:06 -06:00
dataTypes [ i ] . forceSetValue ( objects . get ( i + 2 ) . get ( ) ) ;
2025-04-07 21:41:34 -06:00
System . out . println ( " Loaded STR: " + values [ version ] [ i ] . name + " ( " + values [ version ] [ i ] . UUID + " ) " + " , ( " + dataTypes [ i ] . get ( ) + " ) " ) ;
2024-06-28 15:44:38 -06:00
break ;
2024-09-28 12:43:19 -06:00
case 3 : // Int array
2025-04-07 21:41:34 -06:00
dataTypes [ i ] = IntArrType . newNull ( values [ version ] [ i ] . UUID ) ;
2024-09-28 12:43:19 -06:00
dataTypes [ i ] . forceSetValue ( objects . get ( i + 2 ) . get ( ) ) ;
2025-04-07 21:41:34 -06:00
System . out . println ( " Loaded intARR: " + values [ version ] [ i ] . name + " ( " + values [ version ] [ i ] . UUID + " ) " + " , ( " + Arrays . toString ( ( int [ ] ) dataTypes [ i ] . get ( ) ) + " ) " ) ;
2024-09-28 12:43:19 -06:00
break ;
2024-06-28 15:44:38 -06:00
}
}
2024-07-03 10:20:40 -06:00
ScoutingArray msa = new ScoutingArray ( version , dataTypes , values , transferValues ) ;
2024-06-28 15:44:38 -06:00
msa . update ( ) ;
ParsedScoutingDataResult psda = new ParsedScoutingDataResult ( ) ;
psda . filename = filename ;
psda . username = username ;
psda . version = version ;
psda . data = msa ;
return psda ;
} catch ( BuiltByteParser . byteParsingExeption e ) {
2024-07-24 15:27:13 -06:00
AlertManager . error ( e ) ;
2024-06-28 15:44:38 -06:00
return null ;
}
}
2025-04-10 14:17:46 -06:00
// A function that takes in a list of names seperated by commas, and adds a name if it is not included
// This is used for multi-scouter attribution to data.
public static String checkAddName ( String prevnames , String name ) {
List < String > names = new ArrayList < > ( List . of ( prevnames . split ( " , " ) ) ) ;
if ( ! names . contains ( name ) )
names . add ( name ) ;
return String . join ( " , " , names ) ;
}
2024-06-28 15:44:38 -06:00
}