+ public boolean has_frequency() {
+ return radio_frequency != AltosLib.MISSING || radio_setting != AltosLib.MISSING || radio_channel != AltosLib.MISSING;
+ }
+
+ public boolean has_telemetry_rate() {
+ return telemetry_rate != AltosLib.MISSING;
+ }
+
+ public void set_frequency(double freq) {
+ int frequency = radio_frequency;
+ int setting = radio_setting;
+
+ if (frequency != AltosLib.MISSING) {
+ radio_frequency = (int) Math.floor (freq * 1000 + 0.5);
+ radio_channel = AltosLib.MISSING;
+ } else if (setting != AltosLib.MISSING) {
+ radio_setting =AltosConvert.radio_frequency_to_setting(freq, radio_calibration);
+ radio_channel = AltosLib.MISSING;
+ } else {
+ radio_channel = AltosConvert.radio_frequency_to_channel(freq);
+ }
+ }
+
+ public double frequency() {
+ int channel = radio_channel;
+ int setting = radio_setting;
+
+ if (radio_frequency == AltosLib.MISSING && channel == AltosLib.MISSING && setting == AltosLib.MISSING)
+ return AltosLib.MISSING;
+
+ if (channel == AltosLib.MISSING)
+ channel = 0;
+ if (setting == AltosLib.MISSING)
+ setting = 0;
+
+ return AltosConvert.radio_to_frequency(radio_frequency,
+ setting,
+ radio_calibration,
+ channel);
+ }
+
+ boolean use_flash_for_config() {
+ if (product.startsWith("TeleMega"))
+ return false;
+ if (product.startsWith("TeleMetrum-v2"))
+ return false;
+ if (product.startsWith("TeleMetrum-v3"))
+ return false;
+ if (product.startsWith("EasyMega"))
+ return false;
+ return true;
+ }
+
+
+ public boolean mma655x_inverted() throws AltosUnknownProduct {
+ if (product != null) {
+ if (product.startsWith("EasyMega-v1"))
+ return false;
+ if (product.startsWith("TeleMetrum-v2"))
+ return true;
+ if (product.startsWith("TeleMega-v2"))
+ return false;
+ if (product.startsWith("TeleMega-v1"))
+ return false;
+ }
+ throw new AltosUnknownProduct(product);
+ }
+
+ public boolean adxl375_inverted() throws AltosUnknownProduct {
+ if (product != null) {
+ if (product.startsWith("EasyMega-v2"))
+ return true;
+ if (product.startsWith("TeleMetrum-v3"))
+ return true;
+ if (product.startsWith("TeleMega-v4"))
+ return true;
+ }
+ throw new AltosUnknownProduct(product);
+ }
+
+ public int adxl375_axis() throws AltosUnknownProduct {
+ if (product != null) {
+ if (product.startsWith("EasyMega-v2"))
+ return AltosAdxl375.X_AXIS;
+ if (product.startsWith("TeleMetrum-v3"))
+ return AltosAdxl375.X_AXIS;
+ if (product.startsWith("TeleMega-v4"))
+ return AltosAdxl375.X_AXIS;
+ }
+ throw new AltosUnknownProduct(product);
+ }
+
+ public void get_values(AltosConfigValues source) throws AltosConfigDataException {
+
+ /* HAS_FLIGHT */
+ if (main_deploy != AltosLib.MISSING)
+ main_deploy = source.main_deploy();
+ if (apogee_delay != AltosLib.MISSING)
+ apogee_delay = source.apogee_delay();
+ if (apogee_lockout != AltosLib.MISSING)
+ apogee_lockout = source.apogee_lockout();
+
+ /* HAS_RADIO */
+ if (has_frequency())
+ set_frequency(source.radio_frequency());
+ if (radio_enable != AltosLib.MISSING)
+ radio_enable = source.radio_enable();
+ if (callsign != null)
+ callsign = source.callsign();
+ if (telemetry_rate != AltosLib.MISSING)
+ telemetry_rate = source.telemetry_rate();
+
+ /* HAS_ACCEL */
+ if (pad_orientation != AltosLib.MISSING)
+ pad_orientation = source.pad_orientation();
+
+ if (accel_cal_plus_cooked != AltosLib.MISSING)
+ accel_cal_plus_cooked = source.accel_cal_plus();
+
+ if (accel_cal_minus_cooked != AltosLib.MISSING)
+ accel_cal_minus_cooked = source.accel_cal_minus();
+
+ /* HAS_LOG */
+ if (flight_log_max != AltosLib.MISSING)
+ flight_log_max = source.flight_log_max();
+
+ /* HAS_IGNITE */
+ if (ignite_mode != AltosLib.MISSING)
+ ignite_mode = source.ignite_mode();
+
+ /* AO_PYRO_NUM */
+ if (npyro != AltosLib.MISSING)
+ pyros = source.pyros();
+ if (pyro_firing_time != AltosLib.MISSING)
+ pyro_firing_time = source.pyro_firing_time();
+
+ /* HAS_APRS */
+ if (aprs_interval != AltosLib.MISSING)
+ aprs_interval = source.aprs_interval();
+ if (aprs_ssid != AltosLib.MISSING)
+ aprs_ssid = source.aprs_ssid();
+ if (aprs_format != AltosLib.MISSING)
+ aprs_format = source.aprs_format();
+ if (aprs_offset != AltosLib.MISSING)
+ aprs_offset = source.aprs_offset();
+
+ /* HAS_BEEP */
+ if (beep != AltosLib.MISSING)
+ beep = source.beep();
+ /* HAS_TRACKER */
+ if (tracker_motion != AltosLib.MISSING)
+ tracker_motion = source.tracker_motion();
+ if (tracker_interval != AltosLib.MISSING)
+ tracker_interval = source.tracker_interval();
+ }
+
+ public void set_values(AltosConfigValues dest) {
+ dest.set_serial(serial);
+ dest.set_product(product);
+ dest.set_version(version);
+ dest.set_altitude_32(altitude_32);
+ dest.set_main_deploy(main_deploy);
+ dest.set_apogee_delay(apogee_delay);
+ dest.set_apogee_lockout(apogee_lockout);
+ dest.set_radio_calibration(radio_calibration);
+ dest.set_radio_frequency(frequency());
+ dest.set_telemetry_rate(telemetry_rate);
+ boolean max_enabled = true;
+
+ if (log_space() == 0)
+ max_enabled = false;
+
+ if (log_fixed != AltosLib.MISSING)
+ max_enabled = false;
+
+ switch (log_format) {
+ case AltosLib.AO_LOG_FORMAT_TINY:
+ max_enabled = false;
+ break;
+ default:
+ if (flights != null)
+ max_enabled = false;
+ break;
+ }
+
+ dest.set_flight_log_max_enabled(max_enabled);
+ dest.set_radio_enable(radio_enable);
+ dest.set_flight_log_max_limit(log_space() >> 10, storage_erase_unit >> 10);
+ dest.set_flight_log_max(flight_log_max);
+ dest.set_ignite_mode(ignite_mode);
+ dest.set_pad_orientation(pad_orientation);
+ dest.set_accel_cal(accel_cal_plus(AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP),
+ accel_cal_minus(AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP));
+ dest.set_callsign(callsign);
+ if (npyro != AltosLib.MISSING)
+ dest.set_pyros(pyros);
+ else
+ dest.set_pyros(null);
+ dest.set_pyro_firing_time(pyro_firing_time);
+ dest.set_aprs_interval(aprs_interval);
+ dest.set_aprs_ssid(aprs_ssid);
+ dest.set_aprs_format(aprs_format);
+ dest.set_aprs_offset(aprs_offset);
+ dest.set_beep(beep);
+ dest.set_tracker_motion(tracker_motion);
+ dest.set_tracker_interval(tracker_interval);
+ }
+
+ public boolean log_has_state() {
+ switch (log_format) {
+ case AltosLib.AO_LOG_FORMAT_TELEGPS:
+ return false;
+ }
+ return true;
+ }
+
+ public void save(AltosLink link, boolean remote) throws InterruptedException, TimeoutException {
+
+ /* HAS_FLIGHT */
+ if (main_deploy != AltosLib.MISSING)
+ link.printf("c m %d\n", main_deploy);
+ if (apogee_delay != AltosLib.MISSING)
+ link.printf("c d %d\n", apogee_delay);
+ if (apogee_lockout != AltosLib.MISSING)
+ link.printf("c L %d\n", apogee_lockout);
+
+ /* HAS_RADIO */
+ if (has_frequency()) {
+ boolean has_frequency = radio_frequency != AltosLib.MISSING;
+ boolean has_setting = radio_setting != AltosLib.MISSING;
+ double frequency = frequency();
+ link.set_radio_frequency(frequency,
+ has_frequency,
+ has_setting,
+ radio_calibration);
+ /* When remote, reset the dongle frequency at the same time */
+ if (remote && frequency != link.frequency) {
+ link.stop_remote();
+ link.set_radio_frequency(frequency);
+ link.start_remote();
+ }
+ }
+
+ if (telemetry_rate != AltosLib.MISSING) {
+ link.printf("c T %d\n", telemetry_rate);
+ if (remote && telemetry_rate != link.telemetry_rate) {
+ link.stop_remote();
+ link.set_telemetry_rate(telemetry_rate);
+ link.start_remote();
+ }
+ }
+
+ if (callsign != null) {
+ link.printf("c c %s\n", callsign);
+ if (remote && !callsign.equals(link.callsign)) {
+ System.out.printf("changing link callsign from %s to %s\n", link.callsign, callsign);
+ link.stop_remote();
+ link.set_callsign(callsign);
+ link.start_remote();
+ }
+ }
+
+ if (radio_enable != AltosLib.MISSING)
+ link.printf("c e %d\n", radio_enable);
+
+ /* HAS_ACCEL */
+ /* set orientation first so that we know how to set the accel cal */
+ if (pad_orientation != AltosLib.MISSING)
+ link.printf("c o %d\n", pad_orientation);
+ int plus = accel_cal_plus(pad_orientation);
+ int minus = accel_cal_minus(pad_orientation);
+ if (plus != AltosLib.MISSING && minus != AltosLib.MISSING)
+ link.printf("c a %d %d\n", plus, minus);
+
+ /* HAS_LOG */
+ if (flight_log_max != 0 && flight_log_max != AltosLib.MISSING)
+ link.printf("c l %d\n", flight_log_max);
+
+ /* HAS_IGNITE */
+ if (ignite_mode != AltosLib.MISSING)
+ link.printf("c i %d\n", ignite_mode);
+
+ /* HAS_AES */
+ /* UI doesn't support AES key config */
+
+ /* AO_PYRO_NUM */
+ if (npyro != AltosLib.MISSING) {
+ for (int p = 0; p < pyros.length; p++) {
+ link.printf("c P %s\n",
+ pyros[p].toString());
+ }
+ }
+ if (pyro_firing_time != AltosLib.MISSING)
+ link.printf("c I %d\n", (int) (pyro_firing_time * 100.0 + 0.5));
+
+ /* HAS_APRS */
+ if (aprs_interval != AltosLib.MISSING)
+ link.printf("c A %d\n", aprs_interval);
+ if (aprs_ssid != AltosLib.MISSING)
+ link.printf("c S %d\n", aprs_ssid);
+ if (aprs_format != AltosLib.MISSING)
+ link.printf("c C %d\n", aprs_format);
+ if (aprs_offset != AltosLib.MISSING)
+ link.printf("c O %d\n", aprs_offset);
+
+ /* HAS_BEEP */
+ if (beep != AltosLib.MISSING)
+ link.printf("c b %d\n", beep);
+
+ /* HAS_TRACKER */
+ if (tracker_motion != AltosLib.MISSING && tracker_interval != AltosLib.MISSING)
+ link.printf("c t %d %d\n", tracker_motion, tracker_interval);
+
+ /* HAS_GYRO */
+ /* UI doesn't support accel cal */
+
+ link.printf("c w\n");
+ read_link(link, "Saved");
+ }
+
+ public AltosConfigData(AltosLink link) throws InterruptedException, TimeoutException {
+ reset();
+ link.printf("c s\nf\nv\n");
+ read_link(link, "software-version");
+ switch (log_format) {
+ case AltosLib.AO_LOG_FORMAT_UNKNOWN:
+ case AltosLib.AO_LOG_FORMAT_NONE:
+ break;
+ default:
+ link.printf("l\n");
+ read_link(link, "done");
+ break;
+ }
+ }
+}