#define ANTFSHEADERSIZE 16
#define ANTFSDIRSIZE 16
+/* Debug print */
+static void D(const char *fmt, ...) {
+ va_list ap;
+
+ if (!dbg)
+ return;
+
+ va_start(ap, fmt);
+ vprintf(fmt, ap);
+ va_end(ap);
+}
+
void
usage(void)
{
}
++antfsdir_used;
}
- if (dbg) printf("%d entries in directory\n", antfsdir_used);
+ D("%d entries in directory\n", antfsdir_used);
}
void
char filename[256];
int nw;
- if (dbg) printf("received ant-fs file %d\n", antfsdir[downloadingfilenum].fileno);
+ D("received ant-fs file %d\n", antfsdir[downloadingfilenum].fileno);
if (blsize < 24) {
- if (dbg) printf("didn't receive full ant-fs header\n");
+ fprintf(stderr, "didn't receive full ant-fs header\n");
exit(1);
}
size = blast[12] + blast[13]*256 + blast[14]*256*256 + blast[15]*256*256*256;
uint id;
int i;
uint cid;
- if (dbg) printf("chevent %02x %02x\n", chan, event);
+ D("chevent %02x %02x\n", chan, event);
if (event == EVENT_RX_BROADCAST) {
}
cid = cbuf[4]+cbuf[5]*256+cbuf[6]*256*256+cbuf[7]*256*256*256;
memcpy((void *)&id, cbuf+4, 4);
- if (dbg)
- fprintf(stderr, "cid %08x myid %08x\n", cid, myid);
+ D("cid %08x myid %08x\n", cid, myid);
if (dbg && event != EVENT_RX_BURST_PACKET) {
fprintf(stderr, "chan %d event %02x channel open: ", chan, event);
for (i = 0; i < 8; i++)
break;
}
lastphase = phase; // store the last phase we see the watch broadcast
- if (dbg) printf("lastphase %d\n", lastphase);
+ D("lastphase %d\n", lastphase);
if (!pairing && !nopairing)
pairing = cbuf[1] & 8;
- if (dbg)
- printf("watch status %02x phase %d id %08x\n", status, phase, id);
+ D("watch status %02x phase %d id %08x\n", status, phase, id);
if (!sentid) {
sentid = 1;
newfreq = 0;
}
if (0 && !newdata) {
- if (dbg) printf("device has no new data, not downloading\n");
+ D("device has no new data, not downloading\n");
break;
}
// phase 0 seen after reset at end of download
memcpy((void *)&myauth4, authdata+28, 4);
memcpy((void *)&mydev, authdata+12, 4);
memcpy((void *)&myid, authdata+4, 4);
- if (dbg)
- fprintf(stderr, "dev %d auth %08x %08x %08x %08x id %08x\n",
- mydev, myauth1, myauth2, myauth3, myauth4, myid);
+ D("dev %d auth %08x %08x %08x %08x id %08x\n",
+ mydev, myauth1, myauth2, myauth3, myauth4, myid);
}
// bind to watch
if (!donebind && devid) {
ack.id = myid;
ANT_SendAcknowledgedData(chan, (void *)&ack); // bind
} else {
- if (dbg) printf("donebind %d devid %x\n", donebind, devid);
+ D("donebind %d devid %x\n", donebind, devid);
}
break;
case 1:
- if (dbg) printf("case 1 %x\n", peerdev);
+ D("case 1 %x\n", peerdev);
if (peerdev) {
- if (dbg) printf("case 1 peerdev\n");
+ D("case 1 peerdev\n");
// if watch has sent id
if (mydev != 0 && peerdev != mydev) {
fprintf(stderr, "Don't know this device %08x != %08x\n", peerdev, mydev);
} else if (!sentauth && !waitauth) {
- if (dbg) printf("case 1 diffdev\n");
+ D("case 1 diffdev\n");
assert(sizeof auth == AUTHSIZE);
auth.code = 0x44; auth.atype = 4; auth.phase = 3; auth.u1 = 12;
auth.id = myid; auth.auth1 = myauth1; auth.auth2 = myauth2;
ANT_SendBurstTransfer(chan, (void *)&auth, (sizeof auth)/8); // send our auth data
}
}
- if (dbg) printf("case 1 cid %x myid %x\n", cid, myid);
+ D("case 1 cid %x myid %x\n", cid, myid);
if (!sentack2 && cid == myid && !waitauth) {
sentack2 = 1;
- if (dbg) printf("sending ack2\n");
+ D("sending ack2\n");
// if it did bind to me before someone else
ack.code = 0x44; ack.atype = 4; ack.c1 = 0x01; ack.c2 = 0x00;
ack.id = myid;
if (!downloadstarted) {
downloadstarted = 1;
downloadingfilenum = -1;
- if (dbg) printf("downloading directory\n");
+ D("downloading directory\n");
start_download(chan, 0);
}
if (downloadfinished) {
- if (dbg) printf("finished download\n");
+ D("finished download\n");
ack.code = 0x44; ack.atype = 3; ack.c1 = 0x00; ack.c2 = 0x00; ack.id = 0;
if (!passive) ANT_SendAcknowledgedData(chan, (void *)&ack); // tell garmin we're finished
}
printf("Please confirm pairing on watch\n");
waitauth = 2; // next burst data is auth data
} else {
- if (dbg) printf("not sure why in phase 3\n");
+ D("not sure why in phase 3\n");
if (!sentgetv) {
sentgetv = 1;
//ANT_SendBurstTransferA(chan, getversion, strlen(getversion)/16);
}
break;
default:
- if (dbg) fprintf(stderr, "Unknown phase %d\n", phase);
+ D("Unknown phase %d\n", phase);
break;
}
break;
}
case EVENT_RX_BURST_PACKET:
// now handled in coalesced burst below
- if (dbg) printf("burst\n");
+ D("burst 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", cbuf[0], cbuf[1], cbuf[2], cbuf[3], cbuf[4], cbuf[5], cbuf[6], cbuf[7], cbuf[8], cbuf[9], cbuf[10]);
+ if (cbuf[10] == 0x80) {
+ printf("\t=> channel id bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n", cbuf[11], cbuf[12], cbuf[13], cbuf[14]);
+ }
break;
case EVENT_RX_FAKE_BURST:
- if (dbg) printf("rxfake burst pairing %d waitauth %d\n", pairing, waitauth);
+ D("rxfake burst pairing %d waitauth %d\n", pairing, waitauth);
blsize = *(int *)(cbuf+4); // FIXME: not endian-safe
memcpy(&blast, cbuf+8, 4); // FIXME: not endian-safe
- if (dbg) {
+ if (dbg > 2) {
printf("fake burst %d %lx ", blsize, (long)blast);
for (i = 0; i < blsize && i < 64; i++)
printf("%02x", blast[i]);
if (sentauth) {
} else if (!nopairing && pairing && blast) {
memcpy(&peerdev, blast+12, 4);
- if (dbg)
- printf("watch id %08x waitauth %d\n", peerdev, waitauth);
+ D("watch id %08x waitauth %d\n", peerdev, waitauth);
if (mydev != 0 && peerdev != mydev) {
fprintf(stderr, "Don't know this device %08x != %08x\n", peerdev, mydev);
exit(1);
waitauth = 1;
ANT_SendBurstTransfer(chan, (void *)&pair, (sizeof pair)/8) ; // send pair data
} else {
- if (dbg) printf("not pairing\n");
+ D("not pairing\n");
}
} else if (!gotwatchid && (lastphase == 1)) {
static int once = 0;
// garmin sending authentication/identification data
if (!once) {
once = 1;
- if (dbg)
- fprintf(stderr, "id data: ");
+ D("id data: ");
}
- if (dbg)
+ if (dbg) {
for (i = 0; i < blsize; i++)
fprintf(stderr, "%02x", blast[i]);
- if (dbg)
- fprintf(stderr, "\n");
+ fprintf(stderr, "\n");
+ }
memcpy(&peerdev, blast+12, 4);
- if (dbg)
- printf("watch id %08x\n", peerdev);
+ D("watch id %08x\n", peerdev);
if (mydev != 0 && peerdev != mydev) {
fprintf(stderr, "Don't know this device %08x != %08x\n", peerdev, mydev);
exit(1);
}
}
- if (dbg) printf("continuing after burst\n");
+ D("continuing after burst\n");
break;
}
return 1;
{
int i;
- if (dbg) printf("revent %02x %02x\n", chan, event);
+ D("revent %02x %02x\n", chan, event);
switch (event) {
case EVENT_TRANSFER_TX_COMPLETED:
- if (dbg) printf("Transfer complete %02x\n", ebuf[1]);
+ D("Transfer complete %02x\n", ebuf[1]);
break;
case TRANSFER_SEQUENCE_NUMBER_ERROR:
- if (dbg) printf("Transfer sequence number error %02x\n", ebuf[1]);
+ D("Transfer sequence number error %02x\n", ebuf[1]);
break;
case EVENT_TRANSFER_RX_FAILED:
- case EVENT_TRANSFER_TX_FAILED:
- if (dbg) printf("Transfer failed %d\n", ebuf[1]);
-
+ D("RX Transfer failed %d\n", ebuf[1]);
// this may not be the best idea in all cases...
if (downloadingfilenum >= 0) {
start_download(chan, antfsdir[downloadingfilenum].fileno);
case RESPONSE_NO_ERROR:
switch (ebuf[1]) {
case MESG_ASSIGN_CHANNEL_ID:
- ANT_AssignChannelEventFunction(chan, chevent, cbuf);
+ ANT_AssignChannelEventFunction(chevent, cbuf);
break;
case MESG_OPEN_CHANNEL_ID:
printf("channel open, waiting for broadcast...\n");
break;
default:
- if (dbg) printf("Message %02x NO_ERROR\n", ebuf[1]);
+ D("Message %02x NO_ERROR\n", ebuf[1]);
break;
}
break;
case MESG_CHANNEL_ID_ID:
devid = ebuf[1]+ebuf[2]*256;
if (mydev == 0 || devid == mydev%65536) {
- if (dbg)
- printf("devid %08x myid %08x\n", devid, myid);
+ D("devid %08x myid %08x\n", devid, myid);
} else {
printf("Ignoring unknown device %08x, mydev %08x\n", devid, mydev);
devid = sentid = 0; // reset
ANT_SetChannelId(chan, devno, devtype, manid);
ANT_OpenChannel(chan);
ANT_RequestMessage(chan, MESG_CHANNEL_STATUS_ID); //informative
-
- if (dbg) printf("waiting...\n");
+
+ D("waiting...\n");
// everything handled in event functions
for(;;)