X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altoslib%2FAltosConfigData.java;h=5b9ee03120689d829d7f789a40218c143837daa8;hb=d80c1317f596f73d192e6fbb33c3579d54802182;hp=dc9fd6b378ec6708ac2aaebede9c18fc0b729ec8;hpb=e4c93942bbde7a538d1dca114f20dc827275a8e1;p=fw%2Faltos diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index dc9fd6b3..5b9ee031 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -83,6 +83,11 @@ public class AltosConfigData { /* HAS_BEEP */ public int beep; + /* HAS_RADIO_10MW */ + public int radio_10mw; + + public int report_feet; + /* Storage info replies */ public int storage_size; public int storage_erase_unit; @@ -199,19 +204,32 @@ public class AltosConfigData { case AltosLib.AO_LOG_FORMAT_FULL: return 0x7fff - value; case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD: - case AltosLib.AO_LOG_FORMAT_TELEMETRUM: case AltosLib.AO_LOG_FORMAT_TELEMEGA: case AltosLib.AO_LOG_FORMAT_TELEMEGA_3: - case AltosLib.AO_LOG_FORMAT_TELEMEGA_4: return 4095 - value; + case AltosLib.AO_LOG_FORMAT_TELEMETRUM: + /* + * TeleMetrum v2 and later use the same log format, but + * have different accelerometers. This is the only place + * it matters in altoslib. + */ + if (product.startsWith("TeleMetrum-v2")) + return 4095 - value; + /* fall through */ + case AltosLib.AO_LOG_FORMAT_TELEMEGA_4: case AltosLib.AO_LOG_FORMAT_EASYMEGA_2: + case AltosLib.AO_LOG_FORMAT_EASYMOTOR: return -value; default: + if (product.startsWith("EasyTimer-")) + return -value; return AltosLib.MISSING; } } public boolean has_monitor_battery() { + if (product == null) + return false; if (product.startsWith("TeleBT")) return true; return false; @@ -302,6 +320,10 @@ public class AltosConfigData { beep = AltosLib.MISSING; + radio_10mw = AltosLib.MISSING; + + report_feet = AltosLib.MISSING; + tracker_motion = AltosLib.MISSING; tracker_interval = AltosLib.MISSING; @@ -318,10 +340,17 @@ public class AltosConfigData { /* Return + accel calibration relative to a specific pad orientation */ public int accel_cal_plus(int pad_orientation) { adjust_accel_cal(); + if (!accel_cal_adjusted) + return AltosLib.MISSING; + switch (pad_orientation) { case AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP: + case AltosLib.AO_PAD_ORIENTATION_WORDS_UPRIGHT: + case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_UP: return accel_cal_plus_cooked; case AltosLib.AO_PAD_ORIENTATION_ANTENNA_DOWN: + case AltosLib.AO_PAD_ORIENTATION_WORDS_UPSIDEDOWN: + case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_DOWN: return invert_accel_value(accel_cal_minus_cooked); default: return AltosLib.MISSING; @@ -331,10 +360,17 @@ public class AltosConfigData { /* Return - accel calibration relative to a specific pad orientation */ public int accel_cal_minus(int pad_orientation) { adjust_accel_cal(); + if (!accel_cal_adjusted) + return AltosLib.MISSING; + switch (pad_orientation) { case AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP: + case AltosLib.AO_PAD_ORIENTATION_WORDS_UPRIGHT: + case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_UP: return accel_cal_minus_cooked; case AltosLib.AO_PAD_ORIENTATION_ANTENNA_DOWN: + case AltosLib.AO_PAD_ORIENTATION_WORDS_UPSIDEDOWN: + case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_DOWN: return invert_accel_value(accel_cal_plus_cooked); default: return AltosLib.MISSING; @@ -346,18 +382,22 @@ public class AltosConfigData { */ private void adjust_accel_cal() { if (!accel_cal_adjusted && + product != null && pad_orientation != AltosLib.MISSING && accel_cal_plus != AltosLib.MISSING && - accel_cal_minus != AltosLib.MISSING && - log_format != AltosLib.AO_LOG_FORMAT_UNKNOWN) + accel_cal_minus != AltosLib.MISSING) { switch (pad_orientation) { case AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP: + case AltosLib.AO_PAD_ORIENTATION_WORDS_UPRIGHT: + case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_UP: accel_cal_plus_cooked = accel_cal_plus; accel_cal_minus_cooked = accel_cal_minus; accel_cal_adjusted = true; break; case AltosLib.AO_PAD_ORIENTATION_ANTENNA_DOWN: + case AltosLib.AO_PAD_ORIENTATION_WORDS_UPSIDEDOWN: + case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_DOWN: accel_cal_plus_cooked = invert_accel_value(accel_cal_minus); accel_cal_minus_cooked = invert_accel_value(accel_cal_plus); accel_cal_adjusted = true; @@ -474,6 +514,11 @@ public class AltosConfigData { /* HAS_BEEP */ try { beep = get_int(line, "Beeper setting:"); } catch (Exception e) {} + /* HAS_RADIO_10MW */ + try { radio_10mw = get_int(line, "Radio 10mw limit:"); } catch (Exception e) {} + + try { report_feet = get_int(line, "Report in feet:"); } catch (Exception e) {} + /* HAS_TRACKER */ try { int[] values = get_values(line, "Tracker setting:"); @@ -524,9 +569,6 @@ public class AltosConfigData { } } } catch (Exception e) {} - - /* Fix accel cal as soon as all of the necessary values appear */ - adjust_accel_cal(); } public AltosConfigData() { @@ -624,6 +666,10 @@ public class AltosConfigData { return true; if (product.startsWith("TeleMega-v4")) return true; + if (product.startsWith("EasyMotor-v2")) + return true; + if (product.startsWith("EasyMotor-v3")) + return true; } throw new AltosUnknownProduct(product); } @@ -636,6 +682,11 @@ public class AltosConfigData { return AltosAdxl375.X_AXIS; if (product.startsWith("TeleMega-v4")) return AltosAdxl375.X_AXIS; + if (product.startsWith("EasyMotor-v2")) + return AltosAdxl375.X_AXIS; + if (product.startsWith("EasyMotor-v3")) + return AltosAdxl375.X_AXIS; + } throw new AltosUnknownProduct(product); } @@ -697,6 +748,14 @@ public class AltosConfigData { /* HAS_BEEP */ if (beep != AltosLib.MISSING) beep = source.beep(); + + /* HAS_RADIO_10MW */ + if (radio_10mw != AltosLib.MISSING) + radio_10mw = source.radio_10mw(); + + if (report_feet != AltosLib.MISSING) + report_feet = source.report_feet(); + /* HAS_TRACKER */ if (tracker_motion != AltosLib.MISSING) tracker_motion = source.tracker_motion(); @@ -735,7 +794,7 @@ public class AltosConfigData { 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_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); @@ -752,6 +811,8 @@ public class AltosConfigData { dest.set_aprs_format(aprs_format); dest.set_aprs_offset(aprs_offset); dest.set_beep(beep); + dest.set_radio_10mw(radio_10mw); + dest.set_report_feet(report_feet); dest.set_tracker_motion(tracker_motion); dest.set_tracker_interval(tracker_interval); } @@ -784,33 +845,28 @@ public class AltosConfigData { has_setting, radio_calibration); /* When remote, reset the dongle frequency at the same time */ - if (remote) { - link.flush_output(); + if (remote && frequency != link.frequency) { link.stop_remote(); link.set_radio_frequency(frequency); - link.flush_output(); link.start_remote(); } } if (telemetry_rate != AltosLib.MISSING) { link.printf("c T %d\n", telemetry_rate); - if (remote) { - link.flush_output(); + if (remote && telemetry_rate != link.telemetry_rate) { 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(); + 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.flush_output(); link.start_remote(); } } @@ -824,11 +880,25 @@ public class AltosConfigData { 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); + if (plus != AltosLib.MISSING && minus != AltosLib.MISSING) { + if (plus < 0) + plus = 65536 + plus; + if (minus < 0) + minus = 65536 + minus; + if (accel_zero_along != AltosLib.MISSING && + accel_zero_across != AltosLib.MISSING && + accel_zero_through != AltosLib.MISSING) + link.printf("c a %d %d %d %d %d\n", + plus, minus, + accel_zero_along, + accel_zero_across, + accel_zero_through); + else + link.printf("c a %d %d\n", plus, minus); + } /* HAS_LOG */ - if (flight_log_max != 0) + if (flight_log_max != 0 && flight_log_max != AltosLib.MISSING) link.printf("c l %d\n", flight_log_max); /* HAS_IGNITE */ @@ -862,6 +932,14 @@ public class AltosConfigData { if (beep != AltosLib.MISSING) link.printf("c b %d\n", beep); + /* HAS_RADIO_10MW */ + if (radio_10mw != AltosLib.MISSING) + link.printf("c p %d\n", radio_10mw); + + /* HAS_RADIO_10MW */ + if (report_feet != AltosLib.MISSING) + link.printf("c u %d\n", report_feet); + /* HAS_TRACKER */ if (tracker_motion != AltosLib.MISSING && tracker_interval != AltosLib.MISSING) link.printf("c t %d %d\n", tracker_motion, tracker_interval); @@ -870,7 +948,7 @@ public class AltosConfigData { /* UI doesn't support accel cal */ link.printf("c w\n"); - link.flush_output(); + read_link(link, "Saved"); } public AltosConfigData(AltosLink link) throws InterruptedException, TimeoutException { @@ -886,5 +964,6 @@ public class AltosConfigData { read_link(link, "done"); break; } + adjust_accel_cal(); } }