BOOL CGretagScan::MoveToPatch(int patchnum, int ref) { char command[200]; char data[200]; int datalen = 200; int code[5]; int32 dx_i,dy_i; int32 table[2]; //turn online if(!TurnOnLine()) return FALSE; m_table.translateToTable(patchnum,table); sprintf(command,"; 208 0 %d %ld %ld\r\n",ref,(long)table[0],(long)table[1]); // dx_i = table[0]-current_x; // dy_i = table[1]-current_y; if(!Command(command, strlen(command), data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_MOVE_HEAD); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; return TRUE; }
BOOL CGretagScan::GetDensity(CCommRequest *pRequest, double *data) { int code[5]; int i; double temp; BOOL status = FALSE; if(!sscanf_n_i(pRequest->m_lpszResult, 1, 1, code)) { ErrorMessage(ERR_MEASUREMENT_DATA); goto bail; } if(code[0] != 189) { ErrorMessage(ERR_MEASUREMENT_DATA); goto bail; } //convert to data sscanf_n(pRequest->m_lpszResult ,3 ,4, data); //resequence temp = data[0]; for(i = 0; i < 3; i++) data[i] = data[i+1]; data[3] = temp; status = TRUE; bail: return status; }
int SpectroChart::checkOnLine(void) { char st[5000]; int status; char *c; if (sp == 0L) return MCO_SERIAL_ERROR; sp->clearInputBuf(); sp->sendData("; 208 36\r\n",10); sp->getNextLine(st,5000,thermd); if ((st[0] != ';') && (st[0] != ':')) { last_error = -4; } c = sscanf_n_i(st,3,1,&status); if (c == 0L) { last_error = -5; } if (status != 209) { last_error = -6; error_code = status; } if (status & 0x10) return 1; return 0; }
McoStatus SpectroChart::Initialize(void) { McoStatus state = MCO_SUCCESS; char st[5000]; int dum,type,error; if (sp == 0L) return MCO_SERIAL_ERROR; // set baud state = setBaud(GT_DEFALUT_BAUD); if (state != MCO_SUCCESS) goto bail; // check device type sp->sendData("; 43\r\n",6); sp->getNextLine(st,5000,thermd); sscanf_n_i(st,27,1,&type); if (type !=2) goto bail; //reset sp->sendData("; 90 1 4 5\r\n",12); state = CheckError(); if (state != MCO_SUCCESS) goto bail; //set measurment type sp->sendData("; 77 155\r\n",10); state = CheckError(); if (state != MCO_SUCCESS) goto bail; // set the illuminante, angle sp->sendData("; 22 1 1 3 0\r\n",14); state = CheckError(); if (state != MCO_SUCCESS) goto bail; // set the type of output desired (Cie Lab) //sp->sendData("; 177 2 2\r\n",11); //state = CheckError(); //if (state != MCO_SUCCESS) goto bail; bail: if (thermd != 0L) { thermd->DisplayTherm(4,4,0L); thermd->RemoveTherm(); delete thermd; } thermd = 0L; return state; }
BOOL CGretagScan::GetLab(CCommRequest *pRequest, double *data) { int code[5]; if(!sscanf_n_i(pRequest->m_lpszResult, 1, 1, code)) { ErrorMessage(ERR_MEASUREMENT_DATA); return FALSE; } if(code[0] != 187) { ErrorMessage(ERR_MEASUREMENT_DATA); return FALSE; } //convert to data sscanf_n(pRequest->m_lpszResult ,4 ,3, data); return TRUE; }
BOOL CGretagScan::PutHeadUp() { char data[200]; int datalen = 200; int code[5]; // put head down if(!Command("; 208 3\r\n", 9, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_HEAD_DOWN); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; return TRUE; }
BOOL CGretagScan::TurnOffLine(void) { char data[200]; int datalen = 200; int code[5]; //turn online if(!Command("; 208 17\r\n", 10, data, datalen) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_TURN_OFFLINE); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; return TRUE; }
McoStatus SpectroChart::CheckErrorChart(void) { char *c; int code_error[3]; char st[5000]; if (sp == 0L) return MCO_SERIAL_ERROR; sp->getNextLine(st,5000,thermd); if ((st[0] != ';') && (st[0] != ':')) { last_error = -4; return MCO_FAILURE; } c = sscanf_n_i(st,1,3,code_error); if (c == 0L) { last_error = -5; return MCO_FAILURE; } if (code_error[0] != 209) { last_error = -6; error_code = code_error[0]; return MCO_FAILURE; } if (code_error[1] != 128) { last_error = -7; error_code = code_error[0]; return MCO_FAILURE; } if (code_error[2] != 0) { last_error = code_error[2]; return MCO_FAILURE; } return MCO_SUCCESS; }
// get the current location of the head on the table BOOL CGretagScan::GetHeadLocation(int *position, int refrence) { char command[100]; char data[200]; int datalen = 200; int code[5]; sprintf(command,"; 208 5 %d\r\n",refrence); if(!Command(command, strlen(command), data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,5,2,code)) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } position[0] = code[0]; position[1] = code[1]; return TRUE; }
BOOL CGretagScan::SendRequest(long whichpatch, CWnd *wnd) { char data[200]; int datalen = 200; int code[5]; //put head up if(!Command("; 208 3\r\n", 9, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_HEAD_UP); return FALSE; } // if( !CheckErrorChart(code) ) // return FALSE; // move to the patch if(!MoveToPatch(whichpatch,0)) return FALSE; // put head down if(!Command("; 208 4\r\n", 9, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; // make a measurment if(!Command("; 32\r\n", 6, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,2,code)) { ErrorMessage(ERR_DEVICE_MEASUREMENT); return FALSE; } if( !CheckError(code) ) return FALSE; //send a request to read the data in if(m_type == 1) //LAB { if(!RequestCommand("; 186 9 1\r\n", datalen, wnd)) { ErrorMessage(ERR_SEND_REQUEST); return FALSE; } } else { if(!RequestCommand("; 188 9\r\n", datalen, wnd)) { ErrorMessage(ERR_SEND_REQUEST); return FALSE; } } return TRUE; }
BOOL CGretagScan::StartComm(void) { char data[200]; int datalen = 200; int code[5]; // check device type if(!Command("; 43\r\n", 6, data, datalen, 5) ) { ErrorMessage(ERR_NODEVICE); return FALSE; } if(!sscanf_n_i(data, 27, 1, &code[0]) || code[0] != 2) { ErrorMessage(ERR_NODEVICE); return FALSE; } //reset if(!Command("; 90 1 4 5\r\n", 12, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,2,code)) { ErrorMessage(ERR_DEVICE_RESET); return FALSE; } if( !CheckError(code) ) return FALSE; //set measurment type if(!Command("; 77 155\r\n", 10, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,2,code)) { ErrorMessage(ERR_DEVICE_MEASUREMENT_TYPE); return FALSE; } if( !CheckError(code) ) return FALSE; // set the illuminante, angle if(!Command("; 22 1 1 3 0\r\n", 14, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,2,code)) { ErrorMessage(ERR_DEVICE_ILLUMINATION); return FALSE; } if( !CheckError(code) ) return FALSE; //calibrate before reading if( !Calibrate() ) return FALSE; //align table with patch target if( !AlignTable() ) return FALSE; return TRUE; }
BOOL CGretagScan::Calibrate() { char data[200]; int datalen = 200; int code[5]; static int first = 5; //turn online if(!TurnOnLine()) return FALSE; //initialization if(!Command("; 208 6 0\r\n", 11, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_INITIALIZATION); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; // put head down if(!Command("; 208 4\r\n", 9, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_HEAD_DOWN); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; //warm it up for (int i = 0; i < first; i++) { if( !Command("; 32\r\n", 6, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,2,code)) { ErrorMessage(ERR_DEVICE_WARM_UP); return FALSE; } if( !CheckError(code) ) return FALSE; } // calibrate if( !Command("; 34 9 7\r\n", 10, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,2,code)) { ErrorMessage(ERR_CALIBRATE); return FALSE; } if( !CheckError(code) ) return FALSE; // move the head up if( !Command("; 208 3\r\n", 9, data, datalen, 5) ) { ErrorMessage(ERR_DEVICE_READ); return FALSE; } if(!sscanf_n_i(data,1,3,code)) { ErrorMessage(ERR_HEAD_UP); return FALSE; } if( !CheckErrorChart(code) ) return FALSE; return TRUE; }
McoStatus SpectroChart::getNextPatch(long patchnum,double *lab) { char j1[255],j2[255],j3[255]; char st[5000]; char *p; int32 tc; double xyz[3]; int32 X,Y,Z; McoStatus status = MCO_SUCCESS; int code; double t; int i; if (sp == 0L) return MCO_SERIAL_ERROR; // do a calibration if 100 patches have been read so far if (patchCount >= 100) status = Calibrate(); if (status != MCO_SUCCESS) return status; // move to the patch status = moveToPatch(patchnum,0); if (status != MCO_SUCCESS) return status; // send read command status = sendReadCommand(st); if (status != MCO_SUCCESS) return status; if (mode == ReadLabMode) { // now read the data in sp->sendData("; 186 9 1\r\n",11); sp->getNextLine(st,5000,thermd); // check for an error sscanf_n_i(st,1,1,&code); if (code != 187) return MCO_FAILURE; // read in the data sscanf_n(st,2,3,lab); // check for an error again sscanf_n_i(st,6,1,&code); if (code != 0) return MCO_FAILURE; // now apply the tweak if it exist if (tweak != NULL) tweak->eval(lab,lab,1); } else if (mode == ReadDensityMode) { // now read the data in sp->sendData("; 188 9\r\n",9); sp->getNextLine(st,5000,thermd); // check for an error sscanf_n_i(st,1,1,&code); if (code != 189) return MCO_FAILURE; // read in the black sscanf_n(st,1,4,lab); // check for an error again sscanf_n_i(st,6,1,&code); if (code != 0) return MCO_FAILURE; t = lab[0]; lab[0] = lab[1]; lab[1] = lab[2]; lab[2] = lab[3]; lab[3] = t; if (lab != paperDensity) for (i=0; i<4; i++) { lab[i] -= paperDensity[i]; if (lab[i] < 0) lab[i] = 0; } } patchCount++; return MCO_SUCCESS; }