Log.e(TAG, String.format(format, arguments));
}
+ static void trace(String format, Object ... arguments) {
+ error(format, arguments);
+ for (StackTraceElement el : Thread.currentThread().getStackTrace())
+ Log.e(TAG, "\t" + el.toString() + "\n");
+ }
+
static void check_ui(String format, Object ... arguments) {
- if (Looper.myLooper() == Looper.getMainLooper()) {
- Log.e(TAG, String.format("ON UI THREAD " + format, arguments));
- for (StackTraceElement el : Thread.currentThread().getStackTrace())
- Log.e(TAG, "\t" + el.toString() + "\n");
- }
+ if (Looper.myLooper() == Looper.getMainLooper())
+ trace("ON UI THREAD " + format, arguments);
}
}
}
};
-
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
+ AltosDebug.debug("onServiceConnected\n");
mService = new Messenger(service);
try {
Message msg = Message.obtain(null, TelemetryService.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
+ AltosDebug.debug("attempt to register telemetry service client failed\n");
// In this case the service has crashed before we could even do anything with it
}
if (pending_usb_device != null) {
}
public void onServiceDisconnected(ComponentName className) {
+ AltosDebug.debug("onServiceDisconnected\n");
// This is called when the connection with the service has been unexpectedly disconnected - process crashed.
mService = null;
}
};
void doBindService() {
+ AltosDebug.debug("doBindService\n");
bindService(new Intent(this, TelemetryService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService() {
+ AltosDebug.debug("doUnbindService\n");
if (mIsBound) {
// If we have received the service, and hence registered with it, then now is the time to unregister.
if (mService != null) {
}
}
+ public AltosDroidTab findTab(String name) {
+ for (AltosDroidTab mTab : mTabs)
+ if (name.equals(mTab.tab_name()))
+ return mTab;
+ return null;
+ }
+
public void registerTab(AltosDroidTab mTab) {
mTabs.add(mTab);
}
void update_ui(TelemetryState telem_state, AltosState state, boolean quiet) {
+ AltosDebug.debug("update_ui telem %b state %b quiet %b saved_state %b\n",
+ telem_state != null,
+ state != null,
+ quiet,
+ saved_state != null);
+
this.state = state;
int prev_state = AltosLib.ao_flight_invalid;
saved_state = new SavedState(state);
}
- for (AltosDroidTab mTab : mTabs)
+ for (AltosDroidTab mTab : mTabs) {
+ AltosDebug.debug("mTab %s current %s\n",
+ mTab, mTabsAdapter.currentItem());
mTab.update_ui(telem_state, state, from_receiver, location, mTab == mTabsAdapter.currentItem());
+ }
if (mAltosVoice != null && mTabsAdapter.currentItem() != null)
mAltosVoice.tell(telem_state, state, from_receiver, location, (AltosDroidTab) mTabsAdapter.currentItem(), quiet);
@Override
public void onCreate(Bundle savedInstanceState) {
+ AltosDebug.init(this);
+ AltosDebug.debug("+++ ON CREATE +++");
+
// Initialise preferences
AltosDroidPreferences.init(this);
setTheme(themes[AltosDroidPreferences.font_size()]);
super.onCreate(savedInstanceState);
- AltosDebug.init(this);
- AltosDebug.debug("+++ ON CREATE +++");
-
fm = getSupportFragmentManager();
mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
- mTabsAdapter.addTab(mTabHost.newTabSpec(tab_pad_name).setIndicator(create_tab_view("Pad")), TabPad.class, null);
- mTabsAdapter.addTab(mTabHost.newTabSpec(tab_flight_name).setIndicator(create_tab_view("Flight")), TabFlight.class, null);
- mTabsAdapter.addTab(mTabHost.newTabSpec(tab_recover_name).setIndicator(create_tab_view("Recover")), TabRecover.class, null);
- mTabsAdapter.addTab(mTabHost.newTabSpec(tab_map_name).setIndicator(create_tab_view("Map")), TabMap.class, null);
+ mTabsAdapter.addTab(mTabHost.newTabSpec(tab_pad_name).setIndicator(create_tab_view("Pad")), TabPad.class, null, findTab(tab_pad_name));
+ mTabsAdapter.addTab(mTabHost.newTabSpec(tab_flight_name).setIndicator(create_tab_view("Flight")), TabFlight.class, null, findTab(tab_flight_name));
+ mTabsAdapter.addTab(mTabHost.newTabSpec(tab_recover_name).setIndicator(create_tab_view("Recover")), TabRecover.class, null, findTab(tab_recover_name));
+ mTabsAdapter.addTab(mTabHost.newTabSpec(tab_map_name).setIndicator(create_tab_view("Map")), TabMap.class, null, findTab(tab_map_name));
// Display the Version
mVersion = (TextView) findViewById(R.id.version);
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
- AltosDebug.debug("onNewIntent");
+ AltosDebug.debug("+ ON NEW INTENT +");
noticeIntent(intent);
}
- private void enable_location_updates() {
+ private void enable_location_updates(boolean do_update) {
// Listen for GPS and Network position updates
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
AltosDebug.debug("Failed to get GPS updates\n");
}
- update_ui(telemetry_state, state, true);
+ if (do_update)
+ update_ui(telemetry_state, state, true);
}
static final int MY_PERMISSION_REQUEST = 1001;
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION)) {
have_location_permission = true;
- enable_location_updates();
+ enable_location_updates(true);
if (map_online != null)
map_online.position_permission();
}
@Override
public void onResume() {
- super.onResume();
AltosDebug.debug("+ ON RESUME +");
+ super.onResume();
+
if (!asked_permission) {
asked_permission = true;
if (ActivityCompat.checkSelfPermission(this,
}
}
if (have_location_permission)
- enable_location_updates();
+ enable_location_updates(false);
}
@Override
public void onPause() {
- super.onPause();
AltosDebug.debug("- ON PAUSE -");
+
+ super.onPause();
+
// Stop listening for location updates
if (have_location_permission)
((LocationManager) getSystemService(Context.LOCATION_SERVICE)).removeUpdates(this);
@Override
public void onStop() {
- super.onStop();
AltosDebug.debug("-- ON STOP --");
+
+ super.onStop();
}
@Override
public void onDestroy() {
- super.onDestroy();
AltosDebug.debug("--- ON DESTROY ---");
+ super.onDestroy();
+
+ saved_state = null;
+
doUnbindService();
if (mAltosVoice != null) {
mAltosVoice.stop();
@Override
public void onAttach(Context context) {
+ AltosDebug.debug("tab onAttach %s %s\n", tab_name(), this);
super.onAttach(context);
altos_droid = (AltosDroid) context;
altos_droid.registerTab(this);
@Override
public void onDetach() {
+ AltosDebug.debug("tab onDetach %s %s\n", tab_name(), this);
super.onDetach();
altos_droid.unregisterTab(this);
altos_droid = null;
@Override
public void onResume() {
super.onResume();
- AltosDebug.debug("onResume tab %s\n", tab_name());
+ AltosDebug.debug("onResume tab %s %s\n", tab_name(), this);
set_visible(true);
}
public void update_ui(TelemetryState telem_state, AltosState state,
AltosGreatCircle from_receiver, Location receiver, boolean is_current)
{
+ AltosDebug.debug("update_ui %s is_current %b\n", tab_name(), is_current);
last_telem_state = telem_state;
last_state = state;
last_from_receiver = from_receiver;
debug("MapView draw without map\n");
return;
}
+ if (map.transform == null) {
+ debug("MapView draw without transform\n");
+ return;
+ }
canvas = view_canvas;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(stroke_width);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ AltosDebug.debug("TabPad onCreateView\n");
View v = inflater.inflate(R.layout.tab_pad, container, false);
battery_voltage_view = (TextView) v.findViewById(R.id.battery_voltage_value);
battery_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.battery_redled),
receiver_latitude_view = (TextView) v.findViewById(R.id.receiver_lat_value);
receiver_longitude_view = (TextView) v.findViewById(R.id.receiver_lon_value);
receiver_altitude_view = (TextView) v.findViewById(R.id.receiver_alt_value);
- return v;
+
+ AltosDebug.debug("TabPad onCreateView done battery_voltage_view %s\n", battery_voltage_view);
+ return v;
}
public String tab_name() { return AltosDroid.tab_pad_name; }
public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) {
+ AltosDebug.debug("pad show state %b bvv %s\n", state != null, battery_voltage_view);
if (state != null) {
battery_voltage_view.setText(AltosDroid.number("%1.2f V", state.battery_voltage));
battery_lights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING);
double altitude = AltosLib.MISSING;
if (receiver.hasAltitude())
altitude = receiver.getAltitude();
- receiver_latitude_view.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S"));
- receiver_longitude_view.setText(AltosDroid.pos(receiver.getLongitude(), "E", "W"));
+ String lat_text = AltosDroid.pos(receiver.getLatitude(), "N", "S");
+ String lon_text = AltosDroid.pos(receiver.getLongitude(), "E", "W");
+ AltosDebug.debug("lat %s lon %s\n", lat_text, lon_text);
+ receiver_latitude_view.setText(lat_text);
+ receiver_longitude_view.setText(lon_text);
set_value(receiver_altitude_view, AltosConvert.height, 1, altitude);
}
}
private final Bundle args;
private Fragment fragment;
- TabInfo(String _tag, Class<?> _class, Bundle _args) {
+ TabInfo(String _tag, Class<?> _class, Bundle _args, Fragment _fragment) {
tag = _tag;
clss = _class;
args = _args;
+ fragment = _fragment;
}
}
mViewPager.addOnPageChangeListener(this);
}
- public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
+ public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args, Fragment fragment) {
tabSpec.setContent(new DummyTabFactory(mContext));
String tag = tabSpec.getTag();
- TabInfo info = new TabInfo(tag, clss, args);
+ TabInfo info = new TabInfo(tag, clss, args, fragment);
mTabs.add(info);
mTabHost.addTab(tabSpec);
notifyDataSetChanged();
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
AltosDebug.debug("TabsAdapter.getItem(%d)", position);
- info.fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);
+ if (info.fragment == null)
+ info.fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);
return info.fragment;
}
AltosDroidTab cur_frag = (AltosDroidTab) mTabs.get(position).fragment;
+ AltosDebug.debug("TabsAdapter.onTabChanged(%s) = %d cur %s prev %s", tabId, position, cur_frag, prev_frag);
+
if (prev_frag != cur_frag) {
if (prev_frag != null) {
prev_frag.set_visible(false);
}
}
- if (cur_frag != null) {
+
+ /* This happens when the tab is selected before any of them
+ * have been created, like during rotation
+ */
+ if (cur_frag != null)
cur_frag.set_visible(true);
- }
- AltosDebug.debug("TabsAdapter.onTabChanged(%s) = %d", tabId, position);
mViewPager.setCurrentItem(position);
}
+++ /dev/null
-#!/usr/bin/nickle
-
-import File;
-
-string timed_read(file f, int timeout) {
- thread reader = fork func() {
- try {
- return fgets(f);
- } catch Thread::signal(int i) {
- return "";
- }
- }();
-
- thread killer = fork func() {
- try {
- sleep (timeout);
- Thread::send_signal(reader, 1);
- } catch Thread::signal(int i) {
- return;
- }
- }();
-
- poly v = Thread::join(reader);
- Thread::send_signal(killer, 1);
- Thread::join(killer);
- if (is_string(v))
- return v;
- return "";
-}
-
-void flush_input(file f) {
- for (;;) {
- string s = timed_read(f, 200);
- if (s == "")
- break;
- }
-}
-
-string[*] settings(file f) {
- string[...] x = {};
-
- flush_input(f);
- fprintf (f, "c s\nv\n");
- flush(f);
- for (;;) {
- string l = File::fgets(f);
- x[dim(x)] = l;
- if (String::index(l, "software-version") == 0)
- break;
- }
- return x;
-}
-
-string[*] find_setting(string[*] s, string match) {
- for (int i = 0; i < dim(s); i++)
- if (String::index(s[i], match) == 0)
- return String::split(s[i], " ");
- return (string[*]) {};
-}
-
-bool
-do_cal(file f) {
- flush_input(f);
- fprintf(f, "E 1\nc a 0\n");
- flush(f);
- string s = "";
- bool worked = true;
- bool running = false;
-
- thread put = fork func() {
- try {
- for (;;) {
- putc(getchar(), f);
- flush(f);
- }
- } catch Thread::signal(int i) {
- return;
- }
- }();
-
- for (;;) {
- int c = getc(f);
- if (c == '\n')
- s = "";
- else
- s = s + String::new(c);
- putchar(c); flush(stdout);
- if (String::index(s, "press a key...") >= 0)
- running = true;
- if (String::index(s, "Invalid") >= 0)
- worked = false;
- if (running && String::index(s, ">") >= 0)
- break;
- }
- fprintf (f, "E 0\n");
- if (worked)
- fprintf (f, "c w\n");
- sleep(200);
- Thread::send_signal(put, 1);
- Thread::join(put);
-
- return worked;
-}
-
-void main () {
- string name = argv[1];
- file f = open(name, "r+");
-
- if (do_cal(f)) {
- string[*] s = settings(f);
- string[*] ac = find_setting(s, "Accel cal");
- printf ("Calibration value +1g %s -1g %s saved\n", ac[3], ac[5]);
- exit (0);
- } else {
- printf ("Calibration failed\n");
- exit (1);
- }
-}
-
-main();
+++ /dev/null
-#!/bin/sh
-
-case $# in
-2)
- dev="$1"
- serial="$2"
- ;;
-*)
- echo "Usage: $0 <device> <serial>"
- exit 1;
- ;;
-esac
-
-echo 'E 0' > $dev
-
-while true; do
-
- dd if=$dev iflag=nonblock of=/dev/null > /dev/null 2>&1
-
- echo 'C 1' > $dev
-
- echo -n "Generating RF carrier. Please enter measured frequency [enter for done]: "
-
- read FREQ
-
- echo 'C 0' > $dev
-
- calline=`./get-radio-cal $dev`
- CURRENT_CAL=`echo $calline | awk '{print $2}'`
- CURRENT_FREQ=`echo $calline | awk '{print $4}'`
- CAL_VALUE=$CURRENT_CAL
-
- case "$FREQ" in
- "")
- echo $serial","$CAL_VALUE >> cal_values
- exit 0
- ;;
- *)
- echo "Current radio calibration "$CURRENT_CAL
- echo "Current radio frequency "$CURRENT_FREQ
-
- CAL_VALUE=`nickle -e "floor($CURRENT_FREQ / $FREQ * $CURRENT_CAL + 0.5)"`
-
- echo "Setting cal value" $CAL_VALUE
-
- dd if=$dev iflag=nonblock of=/dev/null > /dev/null 2>&1
-
- cat << EOF > $dev
-c f $CAL_VALUE
-EOF
- ;;
- esac
-done
-
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.57)
-AC_INIT([altos], 1.9.10)
-ANDROID_VERSION=32
+AC_INIT([altos], 1.9.10.1)
+ANDROID_VERSION=33
AC_CONFIG_SRCDIR([src/kernel/ao.h])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE
-RELEASE_DATE=2021-10-10
+RELEASE_DATE=2021-10-16
AC_SUBST(RELEASE_DATE)
DOC_DATE=`LC_ALL=C date -d $RELEASE_DATE +'%d %b %Y'`