Example #1
0
  /**
   * Register a class prior to use. This is mandatory before calling {@link
   * #requestSimObjectData(Class, int, SimConnectPeriod, boolean)} or {@link
   * #unwrap(RecvSimObjectData)} or {@link #setSimObjectData(Object, int)}
   *
   * @param c class to use
   * @param dataDefID force data definition ID
   * @return data definition ID (here <code>dataDefID</code>)
   * @throws IllegalDataDefinition if the class <code>c</code> contains invalid or non-mappable
   *     fields
   * @throws IOException SimConnect IO Errors
   */
  public int registerClass(int dataDefID, Class<?> c) throws IOException, IllegalDataDefinition {

    //
    // don't do it twice
    if (definitionIds.containsKey(c)) {
      return definitionIds.get(c).intValue();
    }

    int fieldAdded = 0;

    for (Field f : c.getDeclaredFields()) {
      if (f.isAnnotationPresent(FlightSimData.class)) {
        // register field
        FlightSimData fsd = f.getAnnotation(FlightSimData.class);

        String variable = fsd.variable();
        String units = fsd.units();

        // determinate field simconnect type from its class

        SimConnectDataType type = SimConnectDataType.INVALID;
        if (f.getType().equals(Float.class) || f.getType().equals(float.class))
          type = SimConnectDataType.FLOAT32;
        else if (f.getType().equals(Double.class) || f.getType().equals(double.class))
          type = SimConnectDataType.FLOAT64;
        else if (f.getType().equals(Integer.class) || f.getType().equals(int.class))
          type = SimConnectDataType.INT32;
        else if (f.getType().equals(Long.class) || f.getType().equals(long.class))
          type = SimConnectDataType.INT64;
        else if (f.getType().equals(Boolean.class) || f.getType().equals(boolean.class))
          type = SimConnectDataType.INT32;
        else if (f.getType().equals(Short.class) || f.getType().equals(short.class))
          type = SimConnectDataType.INT32;
        else if (f.getType().equals(LatLonAlt.class)) type = SimConnectDataType.LATLONALT;
        else if (f.getType().equals(XYZ.class)) type = SimConnectDataType.XYZ;
        else if (f.getType().equals(Waypoint.class)) type = SimConnectDataType.WAYPOINT;
        else if (f.getType().equals(MarkerState.class)) type = SimConnectDataType.MARKERSTATE;
        else if (f.getType().equals(String.class)) {
          int len = fsd.stringWidth();
          switch (len) {
            case 8:
              type = SimConnectDataType.STRING8;
              break;
            case 32:
              type = SimConnectDataType.STRING32;
              break;
            case 64:
              type = SimConnectDataType.STRING64;
              break;
            case 128:
              type = SimConnectDataType.STRING128;
              break;
            case 256:
              type = SimConnectDataType.STRING256;
              break;
            case 260:
              type = SimConnectDataType.STRING260;
              break;
            default:
              throw new IllegalDataDefinition("Invalid string length (" + len + ")");
          }
        }

        if (type == SimConnectDataType.INVALID) {
          throw new IllegalDataDefinition("Invalid field type (" + f.getType().getName() + ")");
        }

        //
        // build simconnect data def
        simConnect.addToDataDefinition(dataDefID, variable, units, type);
        fieldAdded++;
      }
    }

    // register it if we had something to write
    if (fieldAdded > 0) definitionIds.put(c, dataDefID);

    return requestID;
  }