diff options
Diffstat (limited to 'spectro/icoms.c')
-rw-r--r-- | spectro/icoms.c | 134 |
1 files changed, 105 insertions, 29 deletions
diff --git a/spectro/icoms.c b/spectro/icoms.c index 0dc815c..0166e21 100644 --- a/spectro/icoms.c +++ b/spectro/icoms.c @@ -43,17 +43,64 @@ /* ----------------------------------------------------- */ -/* Fake device */ -icompath icomFakeDevice = { "Fake Display Device" }; +/* Fake display & instrument device */ +icompath icomFakeDevice = { instFakeDisp, "Fake Display Device" }; + + +/* Free an icompath */ +static +void icompath_del_contents(icompath *p) { + + if (p->name != NULL) + free(p->name); +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) + if (p->spath != NULL) + free(p->spath); +#endif /* ENABLE_SERIAL */ +#ifdef ENABLE_USB + usb_del_usb_idevice(p->usbd); + hid_del_hid_idevice(p->hidd); +#endif /* ENABLE_USB */ +} + +/* Free an icompath */ +static void icompath_del(icompath *p) { + + icompath_del_contents(p); + free(p); +} + +/* Delete the last path */ +static void icompaths_del_last_path( + icompaths *p +) { + if (p->npaths == 0) + return; + + icompath_del(p->paths[p->npaths-1]); + p->paths[p->npaths-1] = NULL; + p->npaths--; +} + +/* Return the last path */ +static icompath *icompaths_get_last_path( + icompaths *p +) { + if (p->npaths == 0) + return NULL; + + return p->paths[p->npaths-1]; +} /* Return the path corresponding to the port number, or NULL if out of range */ static icompath *icompaths_get_path( icompaths *p, int port /* Enumerated port number, 1..n */ ) { - if (port == -99) + if (port == FAKE_DEVICE_PORT) return &icomFakeDevice; + if (port <= 0 || port > p->npaths) return NULL; @@ -63,20 +110,10 @@ static icompath *icompaths_get_path( static void icompaths_clear(icompaths *p) { /* Free any old list */ - if (p->paths != NULL) { + if (p != NULL && p->paths != NULL) { int i; for (i = 0; i < p->npaths; i++) { - if (p->paths[i]->name != NULL) - free(p->paths[i]->name); -#ifdef ENABLE_SERIAL - if (p->paths[i]->spath != NULL) - free(p->paths[i]->spath); -#endif /* ENABLE_SERIAL */ -#ifdef ENABLE_USB - usb_del_usb_idevice(p->paths[i]->usbd); - hid_del_hid_idevice(p->paths[i]->hidd); -#endif /* ENABLE_USB */ - free(p->paths[i]); + icompath_del(p->paths[i]); } free(p->paths); p->npaths = 0; @@ -111,11 +148,11 @@ static int icompaths_add_path(icompaths *p) { return ICOM_OK; } -#ifdef ENABLE_SERIAL +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) /* Add a serial path */ /* return icom error */ -static int icompaths_add_serial(icompaths *p, char *name, char *spath) { +static int icompaths_add_serial(icompaths *p, char *name, char *spath, int fast) { int rv; if ((rv = icompaths_add_path(p)) != ICOM_OK) @@ -129,6 +166,28 @@ static int icompaths_add_serial(icompaths *p, char *name, char *spath) { a1loge(p->log, ICOM_SYS, "icompaths: strdup failed!\n"); return ICOM_SYS; } + p->paths[p->npaths-1]->fast = fast; + + return ICOM_OK; +} + +/* Modify a serial path to add the instrument type */ +int icompaths_set_serial_itype(icompath *p, instType itype) { + char pname[400], *cp; + + p->itype = itype; + + /* Strip any existing description in brackets */ + if ((cp = strchr(p->name, '(')) != NULL && cp > p->name) + cp[-1] = '\000'; + sprintf(pname,"%s (%s)", p->name, inst_name(itype)); + cp = p->name; + if ((p->name = strdup(pname)) == NULL) { + p->name = cp; + a1loge(g_log, ICOM_SYS, "icompaths_set_serial_itype: strdup path failed!\n"); + return ICOM_SYS; + } + free(cp); return ICOM_OK; } @@ -138,6 +197,7 @@ static int icompaths_add_serial(icompaths *p, char *name, char *spath) { /* Set an icompath details */ /* return icom error */ +static int icompath_set_usb(a1log *log, icompath *p, char *name, unsigned int vid, unsigned int pid, int nep, struct usb_idevice *usbd, instType itype) { int rv; @@ -195,10 +255,12 @@ static int icompaths_add_hid(icompaths *p, char *name, unsigned int vid, unsigne #endif /* ENABLE_USB */ static void icompaths_del(icompaths *p) { - icompaths_clear(p); - - p->log = del_a1log(p->log); /* Unreference it */ - free(p); + if (p != NULL) { + icompaths_clear(p); + + p->log = del_a1log(p->log); /* Unreference it and set to NULL */ + free(p); + } } int icompaths_refresh_paths(icompaths *p); /* Defined in platform specific */ @@ -216,8 +278,10 @@ icompaths *new_icompaths(a1log *log) { p->clear = icompaths_clear; p->refresh = icompaths_refresh_paths; + p->del_last_path = icompaths_del_last_path; + p->get_last_path = icompaths_get_last_path; p->get_path = icompaths_get_path; -#ifdef ENABLE_SERIAL +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) p->add_serial = icompaths_add_serial; #endif /* ENABLE_SERIAL */ #ifdef ENABLE_USB @@ -228,6 +292,7 @@ icompaths *new_icompaths(a1log *log) { if (icompaths_refresh_paths(p)) { a1loge(log, ICOM_SYS, "new_icompaths: icompaths_refresh_paths failed!\n"); + free(p); return NULL; } @@ -242,16 +307,19 @@ icompaths *new_icompaths(a1log *log) { static int icom_copy_path_to_icom(icoms *p, icompath *pp) { int rv; + if (p->name != NULL) + free(p->name); if ((p->name = strdup(pp->name)) == NULL) { a1loge(p->log, ICOM_SYS, "copy_path_to_icom: malloc name failed\n"); return ICOM_SYS; } -#ifdef ENABLE_SERIAL +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) if (pp->spath != NULL) { if ((p->spath = strdup(pp->spath)) == NULL) { a1loge(p->log, ICOM_SYS, "copy_path_to_icom: malloc spath failed\n"); return ICOM_SYS; } + p->fast = pp->fast; } else { p->spath = NULL; } @@ -274,12 +342,14 @@ static int icom_copy_path_to_icom(icoms *p, icompath *pp) { static icom_type icoms_port_type( icoms *p ) { + #ifdef ENABLE_USB if (p->hidd != NULL) return icomt_hid; if (p->usbd != NULL) return icomt_usb; #endif + return icomt_serial; } @@ -301,8 +371,8 @@ icoms *p, char *wbuf, /* Write puffer */ char *rbuf, /* Read buffer */ int bsize, /* Buffer size */ -char tc, /* Terminating characer */ -int ntc, /* Number of terminating characters */ +char *tc, /* Terminating characers, NULL for none */ +int ntc, /* Number of terminating characters needed to terminate */ double tout ) { int rv = ICOM_OK; @@ -314,10 +384,11 @@ double tout return ICOM_NOTS; } -#ifdef ENABLE_SERIAL +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) /* Flush any stray chars if serial */ if (p->usbd == NULL && p->hidd == NULL) { int debug = p->log->debug; + if (debug < 8) p->log->debug = 0; for (; rv == ICOM_OK;) /* Until we get a timeout */ @@ -364,11 +435,12 @@ icoms *new_icoms( /* Copy ipath info to this icoms */ if (icom_copy_path_to_icom(p, ipath)) { + free(p->name); free(p); return NULL; } -#ifdef ENABLE_SERIAL +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) #ifdef NT p->phandle = NULL; #endif @@ -383,7 +455,7 @@ icoms *new_icoms( #endif /* ENABLE_SERIAL */ p->lserr = 0; - p->tc = -1; +// p->tc = -1; p->log = new_a1log_d(log); p->debug = p->log->debug; /* Legacy code */ @@ -391,7 +463,7 @@ icoms *new_icoms( p->close_port = icoms_close_port; p->port_type = icoms_port_type; -#ifdef ENABLE_SERIAL +#if defined(ENABLE_SERIAL) || defined(ENABLE_FAST_SERIAL) p->set_ser_port = icoms_set_ser_port; #endif /* ENABLE_SERIAL */ @@ -442,6 +514,10 @@ icoms_fix(char *ss) { unsigned char *s = (unsigned char *)ss; if (++ix >= 5) ix = 0; + if (ss == NULL) { + strcpy((char *)buf[ix],"(null)"); + return (char *)buf[ix]; + } for(d = buf[ix]; (d - buf[ix]) < 1000;) { if (*s < ' ' && *s > '\000') { *d++ = '^'; |