diff --git a/Makefile b/Makefile index 22a7c9e..48db9f2 100644 --- a/Makefile +++ b/Makefile @@ -11,13 +11,15 @@ LIBDIR=$(PREFIX)/lib MANDIR=$(PREFIX)/man INCDIR=$(PREFIX)/include +PORT = /dev/ttyACM0 + CC = gcc -#CFLAGS = -Wall -g -DBINDIR=\"$(BINDIR)\" -CFLAGS = -O2 -DBINDIR=\"$(BINDIR)\" +CPPFLAGS = -DBINDIR=\"$(BINDIR)\" -DPORT=\"$(PORT)\" +#CFLAGS = -g -Wall -fPIC ${CPPFLAGS} +CFLAGS = -O2 -fPIC ${CPPFLAGS} -PORT = /dev/ttyS0 -ENGINES = svgablink serblink +ENGINES = serblink RANLIB = echo #RANLIB = ranlib @@ -74,12 +76,12 @@ parse.c: dataread.l dl_read_save.c y.tab.h mv lex.yy.c $@ depend: parse.c dl_read_save.c - makedepend -f- -o.o $(CFLAGS) $(SRC) $(SVGASRC) $(SERSRC) > depend + makedepend -f- -o.o $(CPPFLAGS) $(SRC) $(SVGASRC) $(SERSRC) > depend @echo "Dependencies have been made, re-run make to build" @false serblink.o: $(SERSRC) - $(CC) -c $(CFLAGS) -DPORT=\"$(PORT)\" $(SERSRC) + $(CC) $(CFLAGS) -o $@ -c $(SERSRC) serblink: $(SEROBJ) rm -f $@ @@ -90,19 +92,19 @@ svgablink: $(SVGAOBJ) $(CC) $(CFLAGS) -o $@ $(SVGAOBJ) -lvga settime.o: settime.c - $(CC) $(CFLAGS) -I. -c settime.c + $(CC) $(CFLAGS) -I. -c -o $@ settime.c setwatch.o: setwatch.c - $(CC) $(CFLAGS) -I. -c setwatch.c + $(CC) $(CFLAGS) -I. -c -o $@ setwatch.c settime: settime.o libdatalink.a - $(CC) $(CFLAGS) -o $@ settime.o -L. -ldatalink + $(CC) $(CFLAGS) -o $@ settime.o libdatalink.a setwatch: setwatch.o libdatalink.a - $(CC) $(CFLAGS) -o $@ setwatch.o -L. -ldatalink + $(CC) $(CFLAGS) -o $@ setwatch.o libdatalink.a cvt: cvt.o - $(CC) $(CFLAGS) -o $@ + $(CC) $(CFLAGS) -o $@ -c $@.o install: all mkdir -p $(BINDIR) $(MANDIR)/man1 diff --git a/datalink.h b/datalink.h index ab6f2d7..d14eeae 100644 --- a/datalink.h +++ b/datalink.h @@ -212,10 +212,11 @@ typedef struct watch_info_s /* Watch types */ #define NO_WATCH 0 -#define DATALINK_70 1 -#define DATALINK_150 2 -#define DATALINK_150S 3 -#define DATALINK_IRONMAN 4 +#define DATALINK_50 1 +#define DATALINK_70 2 +#define DATALINK_150 3 +#define DATALINK_150S 4 +#define DATALINK_IRONMAN 5 #define DEF_LPTRANSINFO 1 diff --git a/dl_init_watch.c b/dl_init_watch.c index 9cfc929..d6a7408 100644 --- a/dl_init_watch.c +++ b/dl_init_watch.c @@ -62,6 +62,32 @@ WatchInfoPtr dl_init_watch(int type) switch (type) { + case DATALINK_50: + result->dl_device = type; + result->max_tz = 2; + result->max_alarms = 5; + result->max_chrons = 0; + result->max_chron_str = 0; + result->max_apps = 255; + result->max_phones = 255; + result->max_timers = 0; + result->max_todos = 255; + result->max_annivs = 255; + result->max_system = 1; + result->max_wristapp = 0; + result->max_melody = 0; + result->max_tzlen = 3; + result->max_mem = 850; + result->mem_size = 0; + result->max_str = 15; + result->max_alarm_str = 8; + result->max_phone_str = 12; + result->max_timer_str = 0; + result->max_wristapp_len = 0; + result->max_mel_len = 0; + result->pre_notification_time = 0; + result->time_adjust = 2; + break; case DATALINK_70: result->dl_device = type; result->max_tz = 2; diff --git a/dl_send_data.c b/dl_send_data.c index 3dfa12e..20f4203 100644 --- a/dl_send_data.c +++ b/dl_send_data.c @@ -27,10 +27,15 @@ #include #include #include +#include +#include #include "datalink.h" #include "datalink_private.h" -#define MAX_PCKT 38 +#define MAX_PCKT_OTHERS 38 +#define MAX_PCKT_50 32 + +unsigned max_pckt=MAX_PCKT_OTHERS; #define TIME_70 0x30 #define DSTART_70 0x60 @@ -53,7 +58,7 @@ static unsigned char datablock2[] = { 0x14, 0x70, 0x02, 0x5a, 0x47, 0xb7, 0xa9, 0xcc, 0x74, 0x6f, 0x00, 0x00 }; -static unsigned char time[] = { 17, 0x32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static unsigned char time_msg[] = { 17, 0x32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }; static unsigned char dstart[] = { 5, 0x93, 0, 0, 0 }; @@ -78,11 +83,11 @@ int _write_data(int fd, unsigned char *buf, unsigned char *data, int size, { int bytes_left; - while (*buf + size > MAX_PCKT - 2) + while (*buf + size > max_pckt - 2) { - bytes_left = *buf + size - MAX_PCKT + 2; + bytes_left = *buf + size - max_pckt + 2; memcpy(&buf[buf[0]], data, size - bytes_left); - buf[0] = MAX_PCKT; + buf[0] = max_pckt; dl_docrc(buf); if (write(fd, buf, *buf) != *buf) @@ -94,11 +99,18 @@ int _write_data(int fd, unsigned char *buf, unsigned char *data, int size, memcpy(buf, dspace, *dspace); - if (wi->dl_device == DATALINK_70) + if (wi->dl_device == DATALINK_50) + buf[0] = 0x3; + + if ((wi->dl_device == DATALINK_50) || (wi->dl_device == DATALINK_70)) buf[1] = DATA_70; - buf[2] = type; - buf[3] = (*pnum)++; + if (wi->dl_device == DATALINK_50) { + buf[2] = (*pnum)++; + } else { + buf[2] = type; + buf[3] = (*pnum)++; + } } if (!size) @@ -135,6 +147,14 @@ int dl_send_data(WatchInfoPtr wi, int type) int status; int ret=0; int p; + struct termios tios; + time_t now; + struct tm *tm; + unsigned char year; + + time(&now); + tm = localtime(&now); + year = tm->tm_year % 100; if (type == BLINK_FILE) { @@ -148,6 +168,7 @@ int dl_send_data(WatchInfoPtr wi, int type) } else { +#if 0 /* Try to get the directory for a temporary file from * the envinronment variable TMPDIR * Try P_tmpdir if that fails @@ -171,11 +192,43 @@ int dl_send_data(WatchInfoPtr wi, int type) sprintf(buf, "Can't open %s for writing.", fname); return ((*dl_error_proc) (buf)); } +#else + if (getenv("TIMEX_PORT")) { + strcpy(fname, getenv("TIMEX_PORT")); + } else { + strcpy(fname, PORT); + } + + if ((ofd = open(fname, O_WRONLY)) == -1) { + sprintf(buf, "Can't open %s for writing.", fname); + return ((*dl_error_proc) (buf)); + } + + if (tcgetattr(ofd, &tios) < 0) + { + return ((*dl_error_proc) ("tcgetattr failed")); + } + + cfmakeraw(&tios); + cfsetspeed(&tios, B115200); /* It's usb so baudrate doesn't matter */ + + if (tcsetattr(ofd, TCSANOW, &tios) < 0) + { + return ((*dl_error_proc) ("tcsetattr failed")); + } + + write(ofd, "Timex", 5); +#endif } + if (wi->dl_device == DATALINK_50) { + addr = 0x000e; + max_pckt = MAX_PCKT_50; + } + memcpy(buf, start1, *start1); - if (wi->dl_device == DATALINK_70) + if ((wi->dl_device == DATALINK_50) || (wi->dl_device == DATALINK_70)) { buf[4] = 1; } @@ -212,7 +265,10 @@ int dl_send_data(WatchInfoPtr wi, int type) for (i = 0; i < dl_download_data.num_times; i++) { - memcpy(buf, time, *time); + memcpy(buf, time_msg, *time_msg); + if (wi->dl_device == DATALINK_50) + buf[0] = 0xd; + p = 2; if (wi->dl_device == DATALINK_IRONMAN) { @@ -235,23 +291,29 @@ int dl_send_data(WatchInfoPtr wi, int type) buf[p++] = dl_download_data.times[i].year; buf[p++] = dl_download_data.times[i].dow; buf[p++] = dl_download_data.times[i].seconds; - } else - { + } else { buf[p++] = dl_download_data.times[i].hours; buf[p++] = dl_download_data.times[i].minutes; buf[p++] = dl_download_data.times[i].month; buf[p++] = dl_download_data.times[i].day; buf[p++] = dl_download_data.times[i].year; - buf[p++] = - dl_pack_char(dl_download_data. - times[i].label[0]); - buf[p++] = - dl_pack_char(dl_download_data. - times[i].label[1]); - buf[p++] = - dl_pack_char(dl_download_data. - times[i].label[2]); - buf[p++] = dl_download_data.times[i].dow - 1; + + if (wi->dl_device == DATALINK_50) { + buf[p++] = dl_download_data.times[i].dow; + buf[p++] = dl_download_data.times[i].seconds; + buf[p++] = dl_download_data.times[i].hour_fmt; + } else { + buf[p++] = + dl_pack_char(dl_download_data. + times[i].label[0]); + buf[p++] = + dl_pack_char(dl_download_data. + times[i].label[1]); + buf[p++] = + dl_pack_char(dl_download_data. + times[i].label[2]); + buf[p++] = dl_download_data.times[i].dow - 1; + } } if (wi->dl_device == DATALINK_150 || @@ -263,7 +325,7 @@ int dl_send_data(WatchInfoPtr wi, int type) dl_download_data.times[i].date_fmt & 0xFF; } - if (wi->dl_device == DATALINK_70) + if ((wi->dl_device == DATALINK_50) || (wi->dl_device == DATALINK_70)) buf[1] = TIME_70; dl_docrc(buf); @@ -276,43 +338,80 @@ int dl_send_data(WatchInfoPtr wi, int type) if (wi->dl_device != DATALINK_IRONMAN && dl_download_data.memory) { - memcpy(buf, dstart, *dstart); - buf[2] = 1; + if (wi->dl_device == DATALINK_50) { + buf[0] = 0x05; + buf[1] = 0x60; + buf[2] = dl_download_data.memory / (max_pckt - 6); + + if (dl_download_data.memory % (max_pckt - 6)) + buf[2]++; + buf[2]++; + } else { + memcpy(buf, dstart, *dstart); + buf[2] = 1; + } + dl_docrc(buf); if (write(ofd, buf, *buf) != *buf) return ((*dl_error_proc) ("Can't write dstart to tmp file.")); - memcpy(buf, dinfo, *dinfo); - buf[2] = 1; - buf[3] = dl_download_data.memory / (MAX_PCKT - 6); - if (dl_download_data.memory % (MAX_PCKT - 6)) - buf[3]++; + if (wi->dl_device == DATALINK_50) { + pnum=1; - buf[12] = dl_download_data.num_apps; - buf[13] = dl_download_data.num_todos; - buf[14] = dl_download_data.num_phones; - buf[15] = dl_download_data.num_annivs; - buf[4] = (addr >> 8) & 0xff; - buf[5] = addr & 0xff; - addr += dl_download_data.app_size; - buf[6] = (addr >> 8) & 0xff; - buf[7] = addr & 0xff; - addr += dl_download_data.todo_size; - buf[8] = (addr >> 8) & 0xff; - buf[9] = addr & 0xff; - addr += dl_download_data.phone_size; - buf[10] = (addr >> 8) & 0xff; - buf[11] = addr & 0xff; - buf[16] = 0x62; - buf[17] = dl_download_data.pre_notification_time / 5; - if (!buf[17]) - buf[17] = 0xff; - - if (wi->dl_device == DATALINK_70) - buf[1] = DATA_70; + buf[0] = 0x13; + buf[1] = 0x61; + buf[2] = pnum; + buf[3] = (addr >> 8) & 0xff; + buf[4] = addr & 0xff; + addr += dl_download_data.app_size; + buf[5] = (addr >> 8) & 0xff; + buf[6] = addr & 0xff; + addr += dl_download_data.todo_size; + buf[7] = (addr >> 8) & 0xff; + buf[8] = addr & 0xff; + addr += dl_download_data.phone_size; + buf[9] = (addr >> 8) & 0xff; + buf[10] = addr & 0xff; + buf[11] = dl_download_data.num_apps; + buf[12] = dl_download_data.num_todos; + buf[13] = dl_download_data.num_phones; + buf[14] = dl_download_data.num_annivs; + buf[15] = year; + buf[16] = dl_download_data.pre_notification_time / 5; + } else { + memcpy(buf, dinfo, *dinfo); + buf[2] = 1; + buf[3] = dl_download_data.memory / (max_pckt - 6); + + if (dl_download_data.memory % (max_pckt - 6)) + buf[3]++; + + buf[12] = dl_download_data.num_apps; + buf[13] = dl_download_data.num_todos; + buf[14] = dl_download_data.num_phones; + buf[15] = dl_download_data.num_annivs; + buf[4] = (addr >> 8) & 0xff; + buf[5] = addr & 0xff; + addr += dl_download_data.app_size; + buf[6] = (addr >> 8) & 0xff; + buf[7] = addr & 0xff; + addr += dl_download_data.todo_size; + buf[8] = (addr >> 8) & 0xff; + buf[9] = addr & 0xff; + addr += dl_download_data.phone_size; + buf[10] = (addr >> 8) & 0xff; + buf[11] = addr & 0xff; + buf[16] = 0x62; + buf[17] = dl_download_data.pre_notification_time / 5; + if (!buf[17]) + buf[17] = 0xff; + + if (wi->dl_device == DATALINK_70) + buf[1] = DATA_70; + } dl_docrc(buf); @@ -320,15 +419,26 @@ int dl_send_data(WatchInfoPtr wi, int type) return ((*dl_error_proc) ("Can't write dinfo to tmp file.")); - pnum = 1; + if (wi->dl_device == DATALINK_50) + pnum = 2; + else + pnum = 1; + memcpy(buf, dspace, *dspace); - if (wi->dl_device == DATALINK_70) - buf[1] = DATA_70; + if (wi->dl_device == DATALINK_50) + buf[0] = 0x3; - buf[2] = 1; - buf[3] = pnum++; + if ((wi->dl_device == DATALINK_50) || (wi->dl_device == DATALINK_70)) + buf[1] = DATA_70; + if (wi->dl_device == DATALINK_50) { + buf[2] = pnum++; + } else { + buf[2] = 1; + buf[3] = pnum++; + } + for (i = 0; i < dl_download_data.num_apps; i++) { ap = &dl_download_data.apps[i]; @@ -421,8 +531,16 @@ int dl_send_data(WatchInfoPtr wi, int type) return ((*dl_error_proc) ("Can't write to tmp file.")); - memcpy(buf, dend, *dend); - buf[2] = 1; + + if (wi->dl_device == DATALINK_50) { + buf[0]=0x4; + buf[1]=0x62; + } else { + memcpy(buf, dend, *dend); + buf[2] = 1; + } + + dl_docrc(buf); if (write(ofd, buf, *buf) != *buf) @@ -558,7 +676,7 @@ int dl_send_data(WatchInfoPtr wi, int type) } /* timezone label packet for IRONMAN watch */ - if (wi->dl_device == DATALINK_IRONMAN) + if ((wi->dl_device == DATALINK_IRONMAN) || (wi->dl_device == DATALINK_50)) for (i = 0; i < dl_download_data.num_times; i++) { p = 0; @@ -621,6 +739,22 @@ int dl_send_data(WatchInfoPtr wi, int type) return ((*dl_error_proc) ("Can't write to tmp file.")); + /* The 50, enables the alarm by default, and you send this packet to disable it */ + + if ((wi->dl_device == DATALINK_50) && (!dl_download_data.alarms[i].audible)) { + buf[0] = 0x07; + buf[1] = 0x70; + buf[2] = 0x00; + buf[3] = 0x60 + dl_download_data.alarms[i].alarm_num; + buf[4] = 0x00; + + dl_docrc(buf); + + if (write(ofd, buf, *buf) != *buf) + return ((*dl_error_proc) + ("Can't write to tmp file.")); + } + } for (i = 0; i < dl_download_data.num_timers; i++) @@ -657,9 +791,9 @@ int dl_send_data(WatchInfoPtr wi, int type) memcpy(buf, dinfo, *dinfo); buf[2] = 2; - buf[3] = wristapp->len / (MAX_PCKT - 6); + buf[3] = wristapp->len / (max_pckt - 6); - if (wristapp->len % (MAX_PCKT - 6)) + if (wristapp->len % (max_pckt - 6)) buf[3]++; buf[4] = 1; @@ -673,7 +807,10 @@ int dl_send_data(WatchInfoPtr wi, int type) memcpy(buf, dspace, *dspace); - if (wi->dl_device == DATALINK_70) + if (wi->dl_device == DATALINK_50) + buf[0] = 0x3; + + if ((wi->dl_device == DATALINK_50) || (wi->dl_device == DATALINK_70)) buf[1] = DATA_70; pnum = 1; @@ -719,9 +856,9 @@ int dl_send_data(WatchInfoPtr wi, int type) memcpy(buf, dinfo, *dinfo); buf[2] = 3; - buf[3] = melody->len / (MAX_PCKT - 6); + buf[3] = melody->len / (max_pckt - 6); - if (melody->len % (MAX_PCKT - 6)) + if (melody->len % (max_pckt - 6)) buf[3]++; buf[4] = 0xff - melody->len; @@ -735,7 +872,10 @@ int dl_send_data(WatchInfoPtr wi, int type) memcpy(buf, dspace, *dspace); - if (wi->dl_device == DATALINK_70) + if (wi->dl_device == DATALINK_50) + buf[0] = 0x3; + + if ((wi->dl_device == DATALINK_50) || (wi->dl_device == DATALINK_70)) buf[1] = DATA_70; pnum = 1; @@ -798,6 +938,7 @@ int dl_send_data(WatchInfoPtr wi, int type) close(ofd); +#if 0 switch (type) { case BLINK_FILE: @@ -892,6 +1033,7 @@ int dl_send_data(WatchInfoPtr wi, int type) break; } +#endif return (ret); } diff --git a/serblink.c b/serblink.c index 9ca9fdc..44751f0 100644 --- a/serblink.c +++ b/serblink.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include @@ -41,7 +41,7 @@ #endif #ifndef PORT -#define PORT "/dev/ttyd1" +#define PORT "/dev/ttyUSB1" #endif void sendbyte(int fil, unsigned char dat) @@ -50,6 +50,7 @@ void sendbyte(int fil, unsigned char dat) #define LEN 6 { static int frame = 0; +#if 0 char buff[1024]; int c = 0; int i; @@ -72,11 +73,21 @@ void sendbyte(int fil, unsigned char dat) /* a single CRT frame (different inter-word pause) */ write(fil, buff, c); +#else + write(fil, &dat, 1); + if (!frame) { + usleep(1492); /*Scanlines 216 to 263 */ + } else { + usleep(6383); /*Scanlines 402 to 78 */ + } + frame = !frame; /* a frame is 2 words, which would have been on */ +#endif } /* For pauses between packets: */ static void __pause(int fil, int count) { +#if 0 char buff[8192]; int i, c; @@ -84,6 +95,9 @@ static void __pause(int fil, int count) for (i = 0; i < (count * LEN); i++) buff[c++] = 0x0; write(fil, buff, c); +#else + usleep(count * 488); // 488 per 2048 baud bit +#endif } #undef ZERO @@ -95,6 +109,7 @@ int main(int argc, char **argv) int port; int data; struct termios old, new; + struct termios2 tios2; int i, j, len, plen; unsigned char buff[4096]; char fil[1024]; @@ -166,13 +181,20 @@ int main(int argc, char **argv) perror("tcgetattr failed:"); exit(1); } - new = old; - cfsetspeed(&new, B115200); + cfmakeraw(&new); + cfsetspeed(&new, B2400); if (tcsetattr(port, TCSANOW, &new) < 0) { perror("tcsetattr failed:"); exit(1); } + + ioctl(port, TCGETS2, &tios2); + tios2.c_cflag &= ~CBAUD; + tios2.c_cflag |= BOTHER; + tios2.c_ispeed = tios2.c_ospeed = 2048; + ioctl(port, TCSETS2, &tios2); + #if 0 while (1) __pause(port, 20); /* used for hardware debugging */ diff --git a/settime.c b/settime.c index 7361599..ab98990 100644 --- a/settime.c +++ b/settime.c @@ -117,6 +117,9 @@ int main( int argc, char ** argv) if(argc==2) { + if(!strcmp("-model50",argv[1])||!strcmp("-50",argv[1])) + wi = dl_init_watch(DATALINK_50); + else if(!strcmp("-model70",argv[1])||!strcmp("-70",argv[1])) wi = dl_init_watch(DATALINK_70); else @@ -130,7 +133,7 @@ int main( int argc, char ** argv) wi = dl_init_watch(DATALINK_IRONMAN); else { - printf("Usage: %s [ -model70 | -70 | -model70 | " + printf("Usage: %s [ -model50 | -50 | -70 | -model70 | " "-150 | -model150 | -model150s | -150s |" " -ironman]\nVersion " "$Id: settime.c,v 1.13 2002/07/10 04:23:23 david Exp $\n", argv[0]); @@ -151,6 +154,6 @@ int main( int argc, char ** argv) /* Send it to the watch */ - dl_send_data(wi, SVGA_BLINK); + dl_send_data(wi, BLINK_FILE); return 0; } diff --git a/setwatch.c b/setwatch.c index 93a9364..eee146b 100644 --- a/setwatch.c +++ b/setwatch.c @@ -120,7 +120,8 @@ void Usage() printf("Usage: datalink [watch type] [options] [datafile]\n"); printf ("watchtype (ironman is default, must be specified before other options)\n"); - printf(" -model70\t use if you have this watch\n"); + printf(" -50\t use if you have this watch\n"); + printf(" -model50\t use if you have this watch\n"); printf(" -70\t use if you have this watch\n"); printf(" -model70\t use if you have this watch\n"); printf(" -150\t use if you have this watch\n"); @@ -199,6 +200,7 @@ void Usage() #define CHRON 0x400 /* All would be 0x755 */ +#define ALL50 0x07F #define ALL70 0x07F #define ALL150 0x1FF #define ALLIRONMAN 0x653 @@ -228,6 +230,8 @@ int main(int argc, char **argv) if (strcmp("-all", argv[1]) == 0) { + if (type == DATALINK_50) + flags = ALL50; if (type == DATALINK_70) flags = ALL70; if (type == DATALINK_150 || type == DATALINK_150S) @@ -300,6 +304,10 @@ int main(int argc, char **argv) output = BLINK_FILE; else if (strcmp("-serial", argv[1]) == 0) output = SER_BLINK; + else if (strcmp("-model50", argv[1]) == 0) + type = DATALINK_50; + else if (strcmp("-50", argv[1]) == 0) + type = DATALINK_50; else if (strcmp("-model70", argv[1]) == 0) type = DATALINK_70; else if (strcmp("-70", argv[1]) == 0) diff --git a/svgablink.c b/svgablink.c index 185a2ca..3e30461 100644 --- a/svgablink.c +++ b/svgablink.c @@ -70,10 +70,14 @@ int main(int argc, char **argv) || strcmp(argv[1], "-model70") == 0) type = DATALINK_70; else + if (strcmp(argv[1], "-50") == 0 + || strcmp(argv[1], "-model50") == 0) + type = DATALINK_50; + else { fprintf(stderr, "Unknown option %s.\n", argv[1]); fprintf(stderr, "Usage: %s [ -ironman | -modelironman | -150 | -model150 | -150s | \n" - "\t-model150s | -70 | -model70 ] datafile\n" + "\t-model150s | -70 | -model70 | -50 | -model50 ] datafile\n" "Version $Id: svgablink.c,v 1.12 2002/07/10 04:27:08 david Exp $\n", argv[0]); exit(-1); }