TmsiAmplifier::TmsiAmplifier(const char * address, int type, const char * r_address, const char* dump_file /* = NULL */) { //printf("TmsiAmplifier writing to: %s\n", address); //if (r_address!=NULL) // printf(" reading from: %s",r_address); //if (dump_file!=NULL) // printf(" dumping amplifier output to: %s",dump_file); //printf("\n"); if (tmsiAmplifierInstance!=NULL) fprintf(stderr,"Warning: multiple tmsiAmplifier instances!!\n"); tmsiAmplifierInstance = this; dev.Channel = NULL; vli.SampDiv = NULL; channel_data = NULL; channel_data_index=0; digi_channels=0; read_errors=0; mode=type; if (type == USB_AMPLIFIER) fd = connect_usb(address); else fd = connect_bluetooth(address); if (r_address != NULL) read_fd = open(r_address, O_RDONLY); else read_fd = fd; if (dump_file!=NULL) dump_fd = open(dump_file, O_WRONLY|O_CREAT|O_TRUNC); else dump_fd=-1; debug("Descriptors: %d %d", fd, read_fd); if (fd <= 0) { perror("DEVICE OPEN ERROR"); exit(-1); return; } refreshInfo(); }
//------------------------------------------------------------------------------ void* pic1_handle_msg(void *) { if(!WANT_PIC1) while(true) usleep(100000); char *_msg; while(true) { if(connect_usb(PIC1)<0) { fprintf(stderr,"Connection failed PIC1, retrying...\n"); sleep(1); continue; } if(callbackOnReconnectPIC1) callbackOnReconnectPIC1(); fprintf(stderr,"Listen to PIC1...\n"); fflush(stdout); while((_msg=read_usb(PIC1))) { if(_msg==NULL) break; //printf("Recv PIC1: %d\n",get_msg_type(_msg)); switch(get_msg_type(_msg)) { case EMPTY_MSG: #ifdef SIMULATION fprintf(stderr,"<picInterface.cpp> PIC1: Connexion réinitialisée.\n"); fflush(stdout); if(callbackRecvReset) callbackRecvReset(); #endif break; case CODER: #ifdef SIMULATION picSendInfo(); #endif if(callbackRecvCoder) { MSG_INT2_t *msg = (MSG_INT2_t *)_msg; #ifdef SIMULATION callbackRecvCoder(msg->value1, msg->value2); #else callbackRecvCoder(msg->value2, -msg->value1); #endif } break; case PRINTF: { MSG_INT1_t *msg = (MSG_INT1_t *)_msg; printf("from pic %d: %d\n",1,msg->value); } break; default: fprintf(stderr,"<picInterface.cpp> PIC1: Unknown message type %d.\n",get_msg_type(_msg)); fflush(stdout); break; } delete _msg; } fprintf(stderr,"Connection closed PIC1...\n"); fflush(stdout); usleep(10000); break; } return NULL; }
//------------------------------------------------------------------------------ void* pic2_handle_msg(void *) { if(!WANT_PIC2) while(true) usleep(100000); char *_msg; while(true) { if(connect_usb(PIC2)<0) { fprintf(stderr,"Connection failed PIC2, retrying...\n"); sleep(1); continue; } picBegin(); if(callbackOnReconnectPIC2) callbackOnReconnectPIC2(); fprintf(stderr,"Listen to PIC2...\n"); fflush(stdout); while((_msg=read_usb(PIC2))) { if(_msg==NULL) break; //printf("Recv PIC2: %d\n",get_msg_type(_msg)); switch(get_msg_type(_msg)) { case EMPTY_MSG: #ifdef SIMULATION fprintf(stderr,"<picInterface.cpp> PIC2: Connexion réinitialisée.\n"); fflush(stdout); if(callbackRecvReset) callbackRecvReset(); #endif break; #ifdef SIMULATION case WEBCAM: { MSG_INT1_t *msg = (MSG_INT1_t *)_msg; int size = msg->value; int *ptr = &msg->value; ptr++; *((char**)webcam_data) = new char[size]; memcpy(*((char**)webcam_data),ptr,size); pthread_mutex_unlock(mut_webcam); mut_webcam = NULL; } break; #endif case BEGIN: break; case JACK: { callbackOnJack(); #ifdef SIMULATION int buf = JACK; if(write_usb(PIC2, &buf, sizeof(int))<0) break; #else unsigned char buf = JACK; if(write_usb(PIC2, &buf, sizeof(buf))<0) break; #endif } break; case PRINTF: { MSG_INT1_t *msg = (MSG_INT1_t *)_msg; printf("from pic %d: %d\n",2,msg->value); } break; case VPOS: if(mut_vpos) { if(true /*msg->msg_id == msg_id_vpos*/) { msg_id_vpos = 0; pthread_mutex_unlock(mut_vpos); mut_vpos = NULL; } } else fprintf(stderr,"<picInterface.cpp> PIC2: Unmatched ACK VPOS.\n"); fflush(stdout); break; case HPOS: if(mut_hpos) { if(true /*msg->msg_id == msg_id_hpos*/) { msg_id_hpos = 0; pthread_mutex_unlock(mut_hpos); mut_hpos = NULL; } } else fprintf(stderr,"<picInterface.cpp> PIC2: Unmatched ACK HPOS.\n"); fflush(stdout); break; case CLAMP: /*if(mut_clamp) { if(msg->msg_id == msg_id_clamp) { msg_id_clamp = 0; pthread_mutex_unlock(mut_clamp); mut_clamp = NULL; } } else printf("<picInterface.cpp> PIC2: Unmatched ACK CLAMP.\n"); fflush(stdout); */ break; case DIST: if(callbackRecvDistCaptors) { MSG_INTn_t *msg = (MSG_INTn_t *)_msg; float *tab; if(msg->n == 0) tab = NULL; else tab = new float[msg->n]; int *values = &msg->n; values++; for(int i=0; i<msg->n; i++) { tab[i] = COEFF_A_DIST * pow(COEFF_B_DIST, ((double)(values[i]>>6))); if(tab[i]<0.) tab[i] = 0.; } #ifdef SIMULATION float tmp = tab[1]; values[1] = tab[2]; values[2] = tmp; #endif callbackRecvDistCaptors(msg->n, tab); if(tab != NULL) delete tab; } break; case COUL: if(callbackRecvCoulCaptors) { MSG_INTn_t *msg = (MSG_INTn_t *)_msg; float *tab = new float[msg->n]; int *values = &msg->n; values++; for(int i=0; i<msg->n; i++) tab[i] = ((float)values[i]); callbackRecvCoulCaptors(msg->n, tab); delete tab; } break; default: fprintf(stderr,"<picInterface.cpp> PIC2: Unknown message type %d.\n",get_msg_type(_msg)); fflush(stdout); break; } delete _msg; } fprintf(stderr,"Connection closed PIC2...\n"); fflush(stdout); usleep(10000); break; } return NULL; }