+ public boolean has_frequency() {
+ return radio_frequency >= 0 || radio_setting >= 0 || radio_channel >= 0;
+ }
+
+ public boolean has_telemetry_rate() {
+ return telemetry_rate >= 0;
+ }
+
+ public void set_frequency(double freq) {
+ int frequency = radio_frequency;
+ int setting = radio_setting;
+
+ if (frequency > 0) {
+ radio_frequency = (int) Math.floor (freq * 1000 + 0.5);
+ radio_channel = -1;
+ } else if (setting > 0) {
+ radio_setting =AltosConvert.radio_frequency_to_setting(freq,
+ radio_calibration);
+ radio_channel = -1;
+ } else {
+ radio_channel = AltosConvert.radio_frequency_to_channel(freq);
+ }
+ }
+
+ public double frequency() {
+ int channel = radio_channel;
+ int setting = radio_setting;
+
+ if (radio_frequency < 0 && channel < 0 && setting < 0)
+ return -1;
+
+ if (channel < 0)
+ channel = 0;
+ if (setting < 0)
+ 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("EasyMega"))
+ return false;
+ return true;
+ }
+
+
+ public void get_values(AltosConfigValues source) throws AltosConfigDataException {
+
+ /* HAS_FLIGHT */
+ if (main_deploy >= 0)
+ main_deploy = source.main_deploy();
+ if (apogee_delay >= 0)
+ apogee_delay = source.apogee_delay();
+ if (apogee_lockout >= 0)
+ apogee_lockout = source.apogee_lockout();
+
+ /* HAS_RADIO */
+ if (has_frequency())
+ set_frequency(source.radio_frequency());
+ if (radio_enable >= 0)
+ radio_enable = source.radio_enable();
+ if (callsign != null)
+ callsign = source.callsign();
+ if (radio_calibration >= 0)
+ radio_calibration = source.radio_calibration();
+ if (telemetry_rate >= 0)
+ telemetry_rate = source.telemetry_rate();
+
+ /* HAS_ACCEL */
+ if (pad_orientation >= 0)
+ pad_orientation = source.pad_orientation();
+
+ /* HAS_LOG */
+ if (flight_log_max >= 0)
+ flight_log_max = source.flight_log_max();
+
+ /* HAS_IGNITE */
+ if (ignite_mode >= 0)
+ ignite_mode = source.ignite_mode();
+
+ /* AO_PYRO_NUM */
+ if (npyro > 0)
+ pyros = source.pyros();
+ if (pyro_firing_time >= 0)
+ pyro_firing_time = source.pyro_firing_time();
+
+ /* HAS_APRS */
+ if (aprs_interval >= 0)
+ aprs_interval = source.aprs_interval();
+ if (aprs_ssid >= 0)
+ aprs_ssid = source.aprs_ssid();
+
+ /* HAS_BEEP */
+ if (beep >= 0)
+ beep = source.beep();
+ /* HAS_TRACKER */
+ if (tracker_motion >= 0)
+ tracker_motion = source.tracker_motion();
+ if (tracker_interval >= 0)
+ 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 > 0)
+ max_enabled = false;
+
+ switch (log_format) {
+ case AltosLib.AO_LOG_FORMAT_TINY:
+ max_enabled = false;
+ break;
+ default:
+ if (stored_flight > 0)
+ 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() / 1024);
+ dest.set_flight_log_max(flight_log_max);
+ dest.set_ignite_mode(ignite_mode);
+ dest.set_pad_orientation(pad_orientation);
+ dest.set_callsign(callsign);
+ if (npyro > 0)
+ 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_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 >= 0)
+ link.printf("c m %d\n", main_deploy);
+ if (apogee_delay >= 0)
+ link.printf("c d %d\n", apogee_delay);
+ if (apogee_lockout >= 0)
+ link.printf("c L %d\n", apogee_lockout);
+
+ /* Don't mess with radio calibration when remote */
+ if (radio_calibration > 0 && !remote)
+ link.printf("c f %d\n", radio_calibration);
+
+ /* HAS_RADIO */
+ if (has_frequency()) {
+ boolean has_frequency = radio_frequency >= 0;
+ boolean has_setting = radio_setting > 0;
+ 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) {
+ link.flush_output();
+ link.stop_remote();
+ link.set_radio_frequency(frequency);
+ link.flush_output();
+ link.start_remote();
+ }
+ }
+
+ if (telemetry_rate >= 0) {
+ link.printf("c T %d\n", telemetry_rate);
+ if (remote) {
+ link.flush_output();
+ link.stop_remote();
+ link.set_telemetry_rate(telemetry_rate);
+ link.flush_output();
+ link.start_remote();
+ }
+ }
+
+ if (callsign != null) {
+ link.printf("c c %s\n", callsign);
+ if (remote) {
+ link.flush_output();
+ link.stop_remote();
+ link.set_callsign(callsign);
+ link.flush_output();
+ link.start_remote();
+ }
+ }
+
+ if (radio_enable >= 0)
+ link.printf("c e %d\n", radio_enable);
+
+ /* HAS_ACCEL */
+ /* UI doesn't support accel cal */
+ if (pad_orientation >= 0)
+ link.printf("c o %d\n", pad_orientation);
+
+ /* HAS_LOG */
+ if (flight_log_max != 0)
+ link.printf("c l %d\n", flight_log_max);
+
+ /* HAS_IGNITE */
+ if (ignite_mode >= 0)
+ link.printf("c i %d\n", ignite_mode);
+
+ /* HAS_AES */
+ /* UI doesn't support AES key config */
+
+ /* AO_PYRO_NUM */
+ if (npyro > 0) {
+ for (int p = 0; p < pyros.length; p++) {
+ link.printf("c P %s\n",
+ pyros[p].toString());
+ }
+ }
+ if (pyro_firing_time >= 0)
+ link.printf("c I %d\n", (int) (pyro_firing_time * 100.0 + 0.5));
+
+ /* HAS_APRS */
+ if (aprs_interval >= 0)
+ link.printf("c A %d\n", aprs_interval);
+ if (aprs_ssid >= 0)
+ link.printf("c S %d\n", aprs_ssid);
+
+ /* HAS_BEEP */
+ if (beep >= 0)
+ link.printf("c b %d\n", beep);
+
+ /* HAS_TRACKER */
+ if (tracker_motion >= 0 && tracker_interval >= 0)
+ link.printf("c t %d %d\n", tracker_motion, tracker_interval);
+
+ /* HAS_GYRO */
+ /* UI doesn't support accel cal */
+
+ link.printf("c w\n");
+ link.flush_output();
+ }
+
+ 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;
+ }
+ }
+
+}