INTEGER isigsettime_(INTEGER *time) { return (isigsettime((WFDB_Time)(*time))); }
int fetchsignals(void) { int first = 1, framelen, i, imax, imin, j, *m, *mp, n; WFDB_Calinfo cal; WFDB_Sample **sb, **sp, *sbo, *spo, *v; WFDB_Time t, ts0, tsf; /* Do nothing if no samples were requested. */ if (nosig < 1 || t0 >= tf) return (0); /* Open the signal calibration database. */ (void)calopen("wfdbcal"); if (tfreq != ffreq) { ts0 = (WFDB_Time)(t0*tfreq/ffreq + 0.5); tsf = (WFDB_Time)(tf*tfreq/ffreq + 0.5); } else { ts0 = t0; tsf = tf; } /* Allocate buffers and buffer pointers for each selected signal. */ SUALLOC(sb, nsig, sizeof(WFDB_Sample *)); SUALLOC(sp, nsig, sizeof(WFDB_Sample *)); for (n = framelen = 0; n < nsig; framelen += s[n++].spf) if (sigmap[n] >= 0) { SUALLOC(sb[n], (int)((tf-t0)*s[n].spf + 0.5), sizeof(WFDB_Sample)); sp[n] = sb[n]; } /* Allocate a frame buffer and construct the frame map. */ SUALLOC(v, framelen, sizeof(WFDB_Sample)); /* frame buffer */ SUALLOC(m, framelen, sizeof(int)); /* frame map */ for (i = n = 0; n < nsig; n++) { for (j = 0; j < s[n].spf; j++) m[i++] = sigmap[n]; } for (imax = framelen-1; imax > 0 && m[imax] < 0; imax--) ; for (imin = 0; imin < imax && m[imin] < 0; imin++) ; /* Fill the buffers. */ isigsettime(t0); for (t = t0; t < tf && getframe(v) > 0; t++) for (i = imin, mp = m + imin; i <= imax; i++, mp++) if ((n = *mp) >= 0) *(sp[n]++) = v[i]; /* Generate output. */ printf(" { \"signal\":\n [\n"); for (n = 0; n < nsig; n++) { if (sigmap[n] >= 0) { char *p; int delta, prev; if (!first) printf(",\n"); else first = 0; printf(" { \"name\": %s,\n", p = strjson(sname[n])); SFREE(p); if (s[n].units) { printf(" \"units\": %s,\n", p = strjson(s[n].units)); SFREE(p); } else printf(" \"units\": \"mV\",\n"); printf(" \"t0\": %ld,\n", (long)ts0); printf(" \"tf\": %ld,\n", (long)tsf); printf(" \"gain\": %g,\n", s[n].gain ? s[n].gain : WFDB_DEFGAIN); printf(" \"base\": %d,\n", s[n].baseline); printf(" \"tps\": %d,\n", (int)(tfreq/(ffreq*s[n].spf)+0.5)); if (getcal(sname[n], s[n].units, &cal) == 0) printf(" \"scale\": %g,\n", cal.scale); else printf(" \"scale\": 1,\n"); printf(" \"samp\": [ "); for (sbo = sb[n], prev = 0, spo = sp[n]-1; sbo < spo; sbo++) { delta = *sbo - prev; printf("%d,", delta); prev = *sbo; } printf("%d ]\n }", *sbo - prev); } } printf("\n ]%s", nann ? ",\n" : "\n }\n"); flushcal(); for (n = 0; n < nsig; n++) SFREE(sb[n]); SFREE(sb); SFREE(sp); SFREE(v); SFREE(m); return (1); /* output was written */ }