summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorBdale Garbee <bdale@gag.com>2014-02-13 21:54:46 -0700
committerBdale Garbee <bdale@gag.com>2014-02-13 21:54:46 -0700
commite77c24aaaff12669ca6970dfcca770671387f59c (patch)
treec8929f4a71290e3a3c3b6d717788ae1837b2dffa /src/drivers
parent85974eadfde6103d297498ee8c4268e28ab008ba (diff)
parentbf268354535a3a7b2e093235e5347ed2a6d809ff (diff)
Merge branch 'branch-1.3' into debian
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/ao_aprs.c69
-rw-r--r--src/drivers/ao_bufio.c2
-rw-r--r--src/drivers/ao_fat.c23
-rw-r--r--src/drivers/ao_gps_ublox.c14
-rw-r--r--src/drivers/ao_sdcard.c20
-rw-r--r--src/drivers/ao_watchdog.c62
-rw-r--r--src/drivers/ao_watchdog.h24
7 files changed, 165 insertions, 49 deletions
diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c
index 56d98437..0a6c72ce 100644
--- a/src/drivers/ao_aprs.c
+++ b/src/drivers/ao_aprs.c
@@ -488,9 +488,29 @@ static void tncCompressInt(uint8_t *dest, int32_t value, int len) {
}
}
-#if HAS_ADC
+static int ao_num_sats(void)
+{
+ int i;
+ int n = 0;
+
+ for (i = 0; i < ao_gps_tracking_data.channels; i++) {
+ if (ao_gps_tracking_data.sats[i].svid)
+ n++;
+ }
+ return n;
+}
+
+static char ao_gps_locked(void)
+{
+ if (ao_gps_data.flags & AO_GPS_VALID)
+ return 'L';
+ else
+ return 'U';
+}
+
static int tncComment(uint8_t *buf)
{
+#if HAS_ADC
struct ao_data packet;
ao_arch_critical(ao_data_get(&packet););
@@ -500,61 +520,70 @@ static int tncComment(uint8_t *buf)
int16_t main = ao_ignite_decivolt(AO_SENSE_MAIN(&packet));
return sprintf((char *) buf,
- "B:%d.%d A:%d.%d M:%d.%d",
+ "%c%d B%d.%d A%d.%d M%d.%d",
+ ao_gps_locked(),
+ ao_num_sats(),
battery/10,
battery % 10,
apogee/10,
apogee%10,
main/10,
main%10);
-}
+#else
+ return sprintf((char *) buf,
+ "%c%d",
+ ao_gps_locked(),
+ ao_num_sats());
#endif
+}
/**
* Generate the plain text position packet.
*/
static int tncPositionPacket(void)
{
- int32_t latitude = ao_gps_data.latitude;
- int32_t longitude = ao_gps_data.longitude;
- int32_t altitude = ao_gps_data.altitude;
+ static int32_t latitude;
+ static int32_t longitude;
+ static int32_t altitude;
+ int32_t lat, lon, alt;
uint8_t *buf;
- if (altitude < 0)
- altitude = 0;
- altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048;
-
+ if (ao_gps_data.flags & AO_GPS_VALID) {
+ latitude = ao_gps_data.latitude;
+ longitude = ao_gps_data.longitude;
+ altitude = ao_gps_data.altitude;
+ if (altitude < 0)
+ altitude = 0;
+ }
+
buf = tncBuffer;
*buf++ = '!';
/* Symbol table ID */
*buf++ = '/';
- latitude = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000;
- longitude = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000;
+ lat = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000;
+ lon = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000;
#define ALTITUDE_LOG_BASE 0.001998002662673f /* log(1.002) */
- altitude = logf((float) altitude) * (1/ALTITUDE_LOG_BASE);
+ alt = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048;
+ alt = logf((float) altitude) * (1/ALTITUDE_LOG_BASE);
- tncCompressInt(buf, latitude, 4);
+ tncCompressInt(buf, lat, 4);
buf += 4;
- tncCompressInt(buf, longitude, 4);
+ tncCompressInt(buf, lon, 4);
buf += 4;
/* Symbol code */
*buf++ = '\'';
- tncCompressInt(buf, altitude, 2);
+ tncCompressInt(buf, alt, 2);
buf += 2;
*buf++ = 33 + ((1 << 5) | (2 << 3));
-#if HAS_ADC
buf += tncComment(buf);
-#else
- *buf = '\0';
-#endif
return buf - tncBuffer;
}
diff --git a/src/drivers/ao_bufio.c b/src/drivers/ao_bufio.c
index c0fe604a..70e30b67 100644
--- a/src/drivers/ao_bufio.c
+++ b/src/drivers/ao_bufio.c
@@ -45,7 +45,7 @@ static uint8_t ao_bufio_mutex;
#if 0
#define DBG(...) printf(__VA_ARGS__)
#else
-#define DBG(...)
+#define DBG(...) (void) 0
#endif
static inline void
diff --git a/src/drivers/ao_fat.c b/src/drivers/ao_fat.c
index 1a1b8eb0..cbcd42bc 100644
--- a/src/drivers/ao_fat.c
+++ b/src/drivers/ao_fat.c
@@ -187,7 +187,7 @@ _ao_fat_entry_replace(cluster_t cluster, cluster_t new_value)
sector_t sector;
cluster_offset_t offset;
uint8_t *buf;
- cluster_t ret;
+ cluster_t ret = 0;
cluster_t old_value;
uint8_t fat;
@@ -747,7 +747,7 @@ _ao_fat_current_sector(struct ao_file *file)
DBG("current sector offset %d size %d\n",
file->offset, file->dirent->size);
- if (file->offset > file->dirent->size) {
+ if (file->offset > (offset_t) file->dirent->size) {
printf ("file offset %d larger than size %d\n",
file->offset, file->dirent->size);
return 0xffffffff;
@@ -761,7 +761,7 @@ _ao_fat_current_sector(struct ao_file *file)
DBG("\treset to start of file %08x\n", file->cluster);
}
- if (file->cluster_offset + bytes_per_cluster <= file->offset) {
+ if ((offset_t) (file->cluster_offset + bytes_per_cluster) <= file->offset) {
cluster_t cluster_distance;
cluster_offset = sector_offset / sectors_per_cluster;
@@ -804,7 +804,7 @@ _ao_fat_invalidate_cluster_offset(struct ao_fat_dirent *dirent)
if (!file->busy)
continue;
if (file->dirent == dirent) {
- if (file->cluster_offset >= dirent->size) {
+ if (file->cluster_offset >= (offset_t) dirent->size) {
file->cluster_offset = 0;
file->cluster = dirent->cluster;
}
@@ -838,7 +838,7 @@ _ao_fat_set_size(struct ao_file *file, uint32_t size)
DBG ("\tfirst cluster %08x have %d need %d\n", first_cluster, have_clusters, need_clusters);
if (have_clusters != need_clusters) {
- if (file->cluster && size > file->cluster_offset) {
+ if (file->cluster && (offset_t) size > file->cluster_offset) {
cluster_t offset_clusters = (file->cluster_offset + bytes_per_cluster) / bytes_per_cluster;
cluster_t extra_clusters = need_clusters - offset_clusters;
cluster_t next_cluster;
@@ -888,6 +888,7 @@ _ao_fat_set_size(struct ao_file *file, uint32_t size)
static void
_ao_fat_root_init(uint8_t *dent, char name[11], uint8_t attr)
{
+ (void) attr;
memset(dent, '\0', 0x20);
memmove(dent, name, 11);
@@ -1249,7 +1250,7 @@ ao_fat_read(int8_t fd, void *dst, int len)
goto done;
}
- if (file->offset + len > file->dirent->size)
+ if (file->offset + len > (offset_t) file->dirent->size)
len = file->dirent->size - file->offset;
if (len < 0)
@@ -1296,7 +1297,7 @@ ao_fat_write(int8_t fd, void *src, int len)
goto done;
}
- if (file->offset + len > file->dirent->size) {
+ if (file->offset + len > (offset_t) file->dirent->size) {
ret = _ao_fat_set_size(file, file->offset + len);
if (ret < 0)
goto done;
@@ -1424,6 +1425,8 @@ done:
int8_t
ao_fat_rename(char old[11], char new[11])
{
+ (void) old;
+ (void) new;
return -AO_FAT_EIO;
}
@@ -1499,7 +1502,7 @@ ao_fat_list_cmd(void)
putchar('.');
for (; i < 11; i++)
putchar(dirent.name[i]);
- for (i = 0; i < NUM_FAT_ATTR; i++)
+ for (i = 0; i < (int) NUM_FAT_ATTR; i++)
putchar (dirent.attr & ao_fat_attr[i].bit ? ao_fat_attr[i].label : ' ');
printf (" @%08x %d\n", dirent.cluster, dirent.size);
}
@@ -1507,7 +1510,7 @@ ao_fat_list_cmd(void)
printf ("readdir failed: %d\n", status);
}
-static uint8_t
+static void
ao_fat_parse_name(char name[11])
{
uint8_t c;
@@ -1560,8 +1563,6 @@ ao_fat_write_cmd(void)
{
static char name[11];
int8_t fd;
- int cnt, i;
- static char buf[64];
char c;
int status;
diff --git a/src/drivers/ao_gps_ublox.c b/src/drivers/ao_gps_ublox.c
index 4fb90746..01169522 100644
--- a/src/drivers/ao_gps_ublox.c
+++ b/src/drivers/ao_gps_ublox.c
@@ -746,18 +746,20 @@ ao_gps(void) __reentrant
ao_gps_tracking_data.channels = 0;
struct ao_telemetry_satellite_info *dst = &ao_gps_tracking_data.sats[0];
+ struct nav_svinfo_sat *src = &nav_svinfo_sat[0];
for (i = 0; i < nav_svinfo_nsat; i++) {
- struct nav_svinfo_sat *src = &nav_svinfo_sat[i];
-
if (!(src->flags & (1 << NAV_SVINFO_SAT_FLAGS_UNHEALTHY)) &&
src->quality >= NAV_SVINFO_SAT_QUALITY_ACQUIRED)
{
- dst->svid = src->svid;
- dst->c_n_1 = src->cno;
- dst++;
- ao_gps_tracking_data.channels++;
+ if (ao_gps_tracking_data.channels < AO_TELEMETRY_SATELLITE_MAX_SAT) {
+ dst->svid = src->svid;
+ dst->c_n_1 = src->cno;
+ dst++;
+ ao_gps_tracking_data.channels++;
+ }
}
+ src++;
}
ao_mutex_put(&ao_gps_mutex);
diff --git a/src/drivers/ao_sdcard.c b/src/drivers/ao_sdcard.c
index 7806bc19..47188ef3 100644
--- a/src/drivers/ao_sdcard.c
+++ b/src/drivers/ao_sdcard.c
@@ -56,13 +56,13 @@ static enum ao_sdtype sdtype;
#if SDCARD_TRACE
#define DBG(...) printf(__VA_ARGS__)
#else
-#define DBG(...)
+#define DBG(...) (void) 0
#endif
#if SDCARD_WARN
#define WARN(...) printf(__VA_ARGS__)
#else
-#define WARN(...)
+#define WARN(...) (void) 0
#endif
#define later(x,y) ((int16_t) ((x) - (y)) >= 0)
@@ -100,7 +100,6 @@ ao_sdcard_send_cmd(uint8_t cmd, uint32_t arg)
{
uint8_t data[6];
uint8_t reply;
- int i;
uint16_t timeout;
DBG ("\tsend_cmd %d arg %08x\n", cmd, arg);
@@ -111,7 +110,7 @@ ao_sdcard_send_cmd(uint8_t cmd, uint32_t arg)
return SDCARD_STATUS_TIMEOUT;
}
- data[0] = cmd & 0x3f | 0x40;
+ data[0] = (cmd & 0x3f) | 0x40;
data[1] = arg >> 24;
data[2] = arg >> 16;
data[3] = arg >> 8;
@@ -402,7 +401,7 @@ static uint8_t
_ao_sdcard_reset(void)
{
int i;
- uint8_t ret;
+ uint8_t ret = 0x3f;
uint8_t response[10];
for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
@@ -419,12 +418,12 @@ _ao_sdcard_reset(void)
*/
if (ao_sdcard_send_if_cond(0x1aa, response) == SDCARD_STATUS_IDLE_STATE) {
uint32_t arg = 0;
- uint8_t sdver2 = 0;
+// uint8_t sdver2 = 0;
/* Check for SD version 2 */
if ((response[2] & 0xf) == 1 && response[3] == 0xaa) {
arg = 0x40000000;
- sdver2 = 1;
+// sdver2 = 1;
}
for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
@@ -487,7 +486,7 @@ ao_sdcard_wait_block_start(void)
uint8_t
ao_sdcard_read_block(uint32_t block, uint8_t *data)
{
- uint8_t ret;
+ uint8_t ret = 0x3f;
uint8_t start_block;
uint8_t crc[2];
int tries;
@@ -518,6 +517,7 @@ ao_sdcard_read_block(uint32_t block, uint8_t *data)
WARN ("read block command failed %d status %02x\n", block, ret);
status = _ao_sdcard_send_status();
WARN ("\tstatus now %04x\n", status);
+ (void) status;
goto bail;
}
@@ -567,8 +567,6 @@ ao_sdcard_write_block(uint32_t block, uint8_t *data)
uint8_t response[1];
uint8_t start_block[8];
uint16_t status;
- static uint8_t check_data[512];
- int i;
int tries;
ao_sdcard_lock();
@@ -612,7 +610,7 @@ ao_sdcard_write_block(uint32_t block, uint8_t *data)
if ((response[0] & SDCARD_DATA_RES_MASK) != SDCARD_DATA_RES_ACCEPTED) {
int i;
WARN("Data not accepted, response");
- for (i = 0; i < sizeof (response); i++)
+ for (i = 0; i < (int) sizeof (response); i++)
WARN(" %02x", response[i]);
WARN("\n");
ret = 0x3f;
diff --git a/src/drivers/ao_watchdog.c b/src/drivers/ao_watchdog.c
new file mode 100644
index 00000000..096a5564
--- /dev/null
+++ b/src/drivers/ao_watchdog.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <ao.h>
+
+static int ao_watchdog_enabled = TRUE;
+
+static void
+ao_watchdog(void)
+{
+ for (;;) {
+ while (!ao_watchdog_enabled)
+ ao_sleep(&ao_watchdog_enabled);
+ while (ao_watchdog_enabled) {
+ ao_delay(AO_WATCHDOG_INTERVAL);
+ ao_gpio_set(AO_WATCHDOG_PORT, AO_WATCHDOG_BIT, AO_WATCHDOG_PIN, 1);
+ ao_delay(1);
+ ao_gpio_set(AO_WATCHDOG_PORT, AO_WATCHDOG_BIT, AO_WATCHDOG_PIN, 0);
+ }
+ }
+}
+
+static void
+ao_watchdog_set(void)
+{
+ ao_cmd_hex();
+ if (ao_cmd_status == ao_cmd_success) {
+ ao_watchdog_enabled = ao_cmd_lex_i != 0;
+ ao_wakeup(&ao_watchdog_enabled);
+ }
+}
+
+
+static __code struct ao_cmds ao_watchdog_cmds[] = {
+ { ao_watchdog_set, "Q <0 off, 1 on>\0Enable or disable watchdog timer" },
+ { 0, NULL },
+};
+
+static struct ao_task watchdog_task;
+
+void
+ao_watchdog_init(void)
+{
+ ao_enable_output(AO_WATCHDOG_PORT, AO_WATCHDOG_BIT, AO_WATCHDOG, 0);
+ ao_cmd_register(&ao_watchdog_cmds[0]);
+ ao_add_task(&watchdog_task, ao_watchdog, "watchdog");
+}
+
diff --git a/src/drivers/ao_watchdog.h b/src/drivers/ao_watchdog.h
new file mode 100644
index 00000000..73e1559d
--- /dev/null
+++ b/src/drivers/ao_watchdog.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_WATCHDOG_H_
+#define _AO_WATCHDOG_H_
+
+void
+ao_watchdog_init(void);
+
+#endif /* _AO_WATCHDOG_H_ */