ao-tools/ao-test-gps: Improve output formatting
[fw/altos] / ao-tools / ao-sky-flash / sky_bin.c
1 /*
2  * Copyright © 2012 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 #include "sky_flash.h"
19 #include <stdio.h>
20 #include <string.h>
21
22 #define FLASHBYTES      8192
23
24 int
25 skytraq_send_bin(int fd, const char *filename)
26 {
27         FILE            *file;
28         char            buf[FLASHBYTES];
29         int             count;
30         unsigned char   cksum;
31         int             c;
32         long            size;
33         long            pos;
34         char            message[1024];
35         int             ret;
36         
37         file = fopen(filename, "r");
38         if (!file) {
39                 perror(filename);
40                 return -1;
41         }
42
43         /* Compute checksum, figure out how long the file */
44         cksum = 0;
45         while ((c = getc(file)) != EOF)
46                 cksum += (unsigned char) c;
47         size = ftell(file);
48         rewind(file);
49
50         sprintf(message, "BINSIZE = %d Checksum = %d Loopnumber = %d ", size, cksum, 1);
51
52         ret = skytraq_cmd_wait(fd, message, strlen(message) + 1, "OK", 20000);
53         if (ret < 0)
54                 printf ("waitstatus failed %d\n", ret);
55
56         pos = 0;
57         for (;;) {
58                 count = fread(buf, 1, sizeof (buf), file);
59                 if (count < 0) {
60                         perror("fread");
61                         fclose(file);
62                         return -1;
63                 }
64                 if (count == 0)
65                         break;
66                 skytraq_dbg_printf (0, "%7d of %7d ", pos + count, size);
67                 pos += count;
68                 ret = skytraq_cmd_wait(fd, buf, count, "OK", 20000);
69                 if (ret < 0)
70                         return ret;
71         }
72         return skytraq_waitstatus(fd, "END", 30000);
73 }