001package armyc2.c5isr.renderer.utilities; 002 003import android.content.Context; 004 005import java.io.BufferedReader; 006import java.io.IOException; 007import java.io.InputStream; 008import java.io.InputStreamReader; 009import java.util.ArrayList; 010import java.util.HashMap; 011import java.util.List; 012import java.util.Map; 013 014import armyc2.c5isr.renderer.R; 015 016public class C2DLookup { 017 018 private static C2DLookup _instance = null; 019 private static Boolean _initCalled = false; 020 021 private static Map<String, String[]> _C2DLookup = null; 022 023 private String TAG = "C2DLookup"; 024 025 026 private C2DLookup() { 027 028 } 029 030 public static synchronized C2DLookup getInstance() { 031 if (_instance == null) { 032 _instance = new C2DLookup(); 033 } 034 return _instance; 035 } 036 037 public final synchronized void init(Context context) 038 { 039 if (_initCalled == false) 040 { 041 _C2DLookup = new HashMap<>(); 042 String[] temp = null; 043 String delimiter = "\t"; 044 045 try { 046 InputStream is = context.getResources().openRawResource(R.raw.c2d); 047 048 BufferedReader br = new BufferedReader(new InputStreamReader(is)); 049 050 051 String line = br.readLine(); 052 while (line != null) { 053 //parse first line 054 temp = line.split(delimiter); 055 056 if(temp.length >= 3) { 057 _C2DLookup.put(temp[0], temp); 058 } 059 060 //read next line for next loop 061 line = br.readLine(); 062 } 063 064 _initCalled = true; 065 } catch (IOException ioe) { 066 System.out.println(ioe.getMessage()); 067 } catch (Exception e) { 068 System.out.println(e.getMessage()); 069 } 070 } 071 } 072 073 /** 074 * Take a complete 15 character 2525C symbol code and converts it to 2525D if there is a match. 075 * Returns null if no match. 076 * @param symbolID 15 character 2525C symbol code. 077 * @return 30 character 2525D code or null if no matching symbol 078 */ 079 public String getDCode(String symbolID) 080 { 081 return getDCode(symbolID, true); 082 } 083 084 /** 085 * Take a complete 15 character 2525C symbol code and converts it to 2525D if there is a match. 086 * Returns null if no match. 087 * @param symbolID 15 character 2525C symbol code. 088 * @param includeCountryCode 2525C symbols don't display the country label so set to false if you don't want it displayed. 089 * @return 30 character 2525D code or null if no matching symbol. 090 */ 091 public String getDCode(String symbolID, boolean includeCountryCode) 092 { 093 String basicID = SymbolUtilities.getBasicSymbolID2525C(symbolID); 094 String newCode = "110000000000000000000000000000"; 095 096 String[] parts = _C2DLookup.get(basicID); 097 if(parts==null) 098 return null; 099 100 //set version 101 newCode = SymbolID.setVersion(newCode, Integer.parseInt(parts[1])); 102 //set symbol set 103 newCode = SymbolID.setSymbolSet(newCode, Integer.parseInt(parts[2])); 104 //set entity code 105 newCode = SymbolID.setEntityCode(newCode, Integer.parseInt(parts[3])); 106 //Set Echelon/Mobility (not used currently) 107 /*if(!parts[4].isEmpty()) 108 newCode = SymbolID.setEchelonMobility(newCode, (parts[4]));*/ 109 //set sector modifier 1 110 if(!parts[5].isEmpty()) 111 newCode = SymbolID.setModifier1(newCode, (parts[5])); 112 //set sector modifier 2 113 if(!parts[6].isEmpty()) 114 newCode = SymbolID.setModifier2(newCode, (parts[6])); 115 116 //get affiliation to set context and affiliation 117 char aff = symbolID.charAt(1); 118 119 switch (aff) 120 { 121 case 'G': 122 case 'W': 123 case 'M': 124 case 'D': 125 case 'L': 126 case 'J': 127 case 'K': 128 newCode = SymbolID.setContext(newCode, SymbolID.StandardIdentity_Context_Exercise); 129 break; 130 default: 131 newCode = SymbolID.setContext(newCode, SymbolID.StandardIdentity_Context_Reality); 132 } 133 134 //set affiliation 135 if(aff=='F' || aff=='D') 136 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Friend); 137 else if(aff=='H' || aff=='K') 138 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Hostile_Faker); 139 else if(aff=='N' || aff=='L') 140 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Neutral); 141 else if(aff=='P' || aff=='G') 142 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Pending); 143 else if(aff=='S' || aff=='J') 144 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Suspect_Joker); 145 else if(aff=='A' || aff=='M') 146 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_AssumedFriend); 147 else if(aff=='U' || aff=='W') 148 newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Unknown); 149 150 //set status 151 char status = symbolID.charAt(3); 152 153 if(status == 'A') 154 newCode = SymbolID.setStatus(newCode, SymbolID.Status_Planned_Anticipated_Suspect); 155 if(status == 'P') 156 newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present); 157 if(status == 'C') 158 newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_FullyCapable); 159 if(status == 'D') 160 newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_Damaged); 161 if(status == 'X') 162 newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_Destroyed); 163 if(status == 'F') 164 newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_FullToCapacity); 165 166 String modifier = symbolID.substring(10,12); 167 if(modifier.charAt(0)!='H' &&//installation 168 modifier.charAt(0)!='M' && //mobility 169 modifier.charAt(0)!='N') //towed array 170 { 171 switch(modifier.charAt(1)) 172 { 173 case 'A': 174 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Team_Crew); 175 break; 176 case 'B': 177 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Squad); 178 break; 179 case 'C': 180 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Section); 181 break; 182 case 'D': 183 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Platoon_Detachment); 184 break; 185 case 'E': 186 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Company_Battery_Troop); 187 break; 188 case 'F': 189 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Battalion_Squadron); 190 break; 191 case 'G': 192 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Regiment_Group); 193 break; 194 case 'H': 195 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Brigade); 196 break; 197 case 'I': 198 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Division); 199 break; 200 case 'J': 201 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Corps_MEF); 202 break; 203 case 'K': 204 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Army); 205 break; 206 case 'L': 207 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_ArmyGroup_Front); 208 break; 209 case 'M': 210 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Region_Theater); 211 break; 212 case 'N': 213 newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Region_Command); 214 break; 215 216 } 217 218 switch (modifier.charAt(0)) 219 { 220 case 'A': 221 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_Headquarters); 222 break; 223 case 'B': 224 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_TaskForce_Headquarters); 225 break; 226 case 'C': 227 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy_Headquarters); 228 break; 229 case 'D': 230 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy_TaskForce_Headquarters); 231 break; 232 case 'E': 233 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_TaskForce); 234 break; 235 case 'F': 236 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy); 237 break; 238 case 'G': 239 newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy_TaskForce); 240 break; 241 } 242 } 243 else 244 { 245 if(modifier.equals("HB")) 246 SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy); 247 else if(modifier.charAt(0)=='M') 248 { 249 switch(modifier.charAt(1)) 250 { 251 case 'O': 252 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_WheeledLimitedCrossCountry); 253 break; 254 case 'P': 255 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_WheeledCrossCountry); 256 break; 257 case 'Q': 258 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Tracked); 259 break; 260 case 'R': 261 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Wheeled_Tracked); 262 break; 263 case 'S': 264 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Towed); 265 break; 266 case 'T': 267 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Rail); 268 break; 269 case 'U': 270 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_OverSnow); 271 break; 272 case 'V': 273 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Sled); 274 break; 275 case 'W': 276 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_PackAnimals); 277 break; 278 case 'X': 279 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Barge); 280 break; 281 case 'Y': 282 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Amphibious); 283 break; 284 } 285 } 286 else if(modifier.charAt(0)=='N') 287 { 288 switch(modifier.charAt(1)) { 289 case 'S': 290 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_ShortTowedArray); 291 break; 292 case 'L': 293 newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_LongTowedArray); 294 break; 295 } 296 } 297 } 298 299 //country code 300 if(includeCountryCode) 301 newCode = newCode.substring(0,27) + GENCLookup.getInstance().get3DigitCode(symbolID.substring(12,14)); 302 303 return newCode; 304 } 305 306} 307