diff options
Diffstat (limited to 'spectro/i1disp.c')
-rw-r--r-- | spectro/i1disp.c | 128 |
1 files changed, 78 insertions, 50 deletions
diff --git a/spectro/i1disp.c b/spectro/i1disp.c index 489c6cd..9e4b01f 100644 --- a/spectro/i1disp.c +++ b/spectro/i1disp.c @@ -481,7 +481,7 @@ i1disp_rdexreg_bytes( ) { unsigned char ibuf[16]; unsigned char obuf[16]; - int rsize; + int ooff, rsize; inst_code ev; if (p->dtype != 2) /* Only ColorMunki Smile ? */ @@ -493,7 +493,7 @@ i1disp_rdexreg_bytes( if (len < 0 || (addr + len) > 0x0200) return i1disp_interp_code((inst *)p, I1DISP_BAD_REG_ADDRESS); - for (; len > 0; ) { + for (ooff = 0; len > 0; ) { int rlen = len; if (rlen > 4) rlen = 4; @@ -512,7 +512,8 @@ i1disp_rdexreg_bytes( if (obuf[0] != rlen) /* Number of bytes returned */ return i1disp_interp_code((inst *)p, I1DISP_UNEXPECTED_RET_VAL); - memcpy(outp + addr, obuf + 1, rlen); + memcpy(outp + ooff, obuf + 1, rlen); + ooff += rlen; addr += rlen; len -= rlen; } @@ -643,6 +644,7 @@ i1d1_take_measurement( int i; int edgec[3]; /* Edge count 1..255 for each channel */ inst_code ev; + double edge_aim = p->clk_freq; if (p->inited == 0) return i1disp_interp_code((inst *)p, I1DISP_NOT_INITED); @@ -659,13 +661,18 @@ i1d1_take_measurement( a1logd(p->log, 3, "Initial RGB = %f %f %f\n",rgb[0],rgb[1],rgb[2]); /* Compute adjusted edge count, aiming */ - /* for count values of clk_freq = 1 second (~1e6). */ + /* for count values of clk_freq = 1 second (~1e6), */ + /* or 2 seconds if an older instrument */ + if (p->stype == i1d1_sencoreIV + || p->stype == i1d1_sencoreIII) + edge_aim = 2.0 * p->clk_freq;; + for (i = 0; i < 3; i++) { double ns; - if (p->clk_freq > ((255.0 - 0.5) * rgb[i])) + if (edge_aim > ((255.0 - 0.5) * rgb[i])) ns = 255.0; else { - ns = floor(p->clk_freq/rgb[i]) + 0.5; + ns = floor(edge_aim/rgb[i]) + 0.5; if (ns < 1.0) ns = 1.0; } @@ -1254,12 +1261,13 @@ i1disp_take_XYZ_measurement( for (j = 0; j < 3; j++) { XYZ[i] += mat[i * 3 + j] * rgb[j]; } - XYZ[i] *= CALFACTOR; /* Times magic scale factor */ -#ifdef NEVER - if (p->chroma4) - XYZ[i] *= 4.0/3.0; /* (Not sure about this factor!) */ -#endif + + /* Magic factors for other devices ?? */ + if (p->stype == i1d1_sencoreIV) + XYZ[i] *= CALFACTOR; /* (Not sure about this factor!) */ + else + XYZ[i] *= CALFACTOR; /* Times magic scale factor */ } if (!IMODETST(p->mode, inst_mode_emis_ambient)) { @@ -1402,25 +1410,26 @@ i1disp_check_unlock( struct { unsigned char code[4]; - int *flag; + i1d2_dtype stype; } codes[] = { - { { 'G','r','M','b' }, NULL }, /* "GrMb" i1 Display */ - { { 'L','i','t','e' }, &p->lite }, /* "Lite" i1 Display LT */ - { { 'M','u','n','k' }, &p->munki }, /* "Munk" ColorMunki Create */ - { { 'O','b','i','W' }, &p->hpdream }, /* "ObiW" HP DreamColor */ - { { 'O','b','i','w' }, &p->hpdream }, /* "Obiw" HP DreamColor */ - { { 'C','M','X','2' }, &p->calmanx2 }, /* "CMX2" Calman X2 */ - { { 0x24,0xb6,0xb5,0x13 }, NULL }, /* ColorMunki Smile */ - { { 'S','p','C','3' }, NULL }, /* SpectraCal C3 (Based on Smile) */ - { { 'R','G','B','c' }, NULL }, /* */ - { { 'C','E','C','5' }, NULL }, /* */ - { { 'C','M','C','5' }, NULL }, /* */ - { { 'C','M','G','5' }, NULL }, /* */ - { { 0x00,0x00,0x01,0x00 }, NULL }, /* */ - { { 0x09,0x0b,0x0c,0x0d }, NULL }, /* */ - { { 0x0e,0x0e,0x0e,0x0e }, NULL }, /* */ - { { 0x11,0x02,0xde,0xf0 }, NULL }, /* Barco Chroma 5 ? */ - { { ' ',' ',' ',' ' }, (int *)-1 } + { { 'G','r','M','b' }, i1d2_norm }, /* "GrMb" i1 Display */ + { { 'L','i','t','e' }, i1d2_lite }, /* "Lite" i1 Display LT */ + { { 'M','u','n','k' }, i1d2_munki }, /* "Munk" ColorMunki Create */ + { { 'O','b','i','W' }, i1d2_hpdream }, /* "ObiW" HP DreamColor */ + { { 'O','b','i','w' }, i1d2_hpdream }, /* "Obiw" HP DreamColor */ + { { 'C','M','X','2' }, i1d1_calmanx2 }, /* "CMX2" Calman X2 */ + { { 0x24,0xb6,0xb5,0x13 }, i1d2_norm }, /* ColorMunki Smile */ + { { 'S','p','C','3' }, i1d2_norm }, /* SpectraCal C3 (Based on Smile) */ + { { 'R','G','B','c' }, i1d2_norm }, /* */ + { { 'C','E','C','5' }, i1d2_norm }, /* */ + { { 'C','M','C','5' }, i1d2_norm }, /* */ + { { 'C','M','G','5' }, i1d2_norm }, /* */ + { { 0x00,0x00,0x01,0x00 }, i1d2_norm }, /* */ + { { 0x09,0x0b,0x0c,0x0d }, i1d2_norm }, /* */ + { { 0x0e,0x0e,0x0e,0x0e }, i1d2_norm }, /* */ + { { 0x11,0x02,0xde,0xf0 }, i1d2_norm }, /* Barco Chroma 5 ? */ +// { { 0xff,0xff,0xff,0xff }, i1d2_norm }, /* Chroma 5 isn't locked ? */ + { { ' ',' ',' ',' ' }, -1 } }; a1logd(p->log, 3, "i1disp: about to check response and unlock instrument if needed\n"); @@ -1433,17 +1442,9 @@ i1disp_check_unlock( /* Try and unlock it if it is locked */ if ((ev & inst_imask) == I1DISP_LOCKED) { - /* Reset any flags */ - for (i = 0; ;i++) { - if (codes[i].flag == (int *)-1) - break; - if (codes[i].flag != NULL) - *codes[i].flag = 0; - } - /* Try each code in turn */ for (i = 0; ;i++) { - if (codes[i].flag == (int *)-1) { + if (codes[i].stype == -1) { a1logd(p->log, 3, "Failed to find correct unlock code\n"); return i1disp_interp_code((inst *)p, I1DISP_UNKNOWN_MODEL); } @@ -1461,8 +1462,9 @@ i1disp_check_unlock( return ev; /* An error other than being locked */ if (ev == inst_ok) { /* Correct code */ - if (codes[i].flag != NULL) - *codes[i].flag = 1; + p->stype = codes[i].stype; + a1logd(p->log, 3, "Unlocked with code '%c%c%c%c'\n", + codes[i].code[0], codes[i].code[1], codes[i].code[2], codes[i].code[3]); break; } } @@ -1485,15 +1487,30 @@ i1disp_check_unlock( a1logd(p->log, 3, "Version character = 0x%02x = '%c'\n",vv,vv); - /* Sequel Chroma 4 with vv == 0xff ? */ - /* Barco Chroma 5 with ver = 5.01 and vv = '5' */ - if (ver >= 4.0 && ver < 5.1 - && (vv == 0xff || vv == 0x35)) { + /* Barco Chroma 5 with ver = 5.01 vv = '5' */ + if (ver >= 4.0 && ver < 5.1 && vv == '5') { p->dtype = 0; /* Sequel Chroma 4 ?? */ - p->chroma4 = 1; /* Treat like an Eye-One Display 1 */ - /* !!! Not fully tested !!! */ + p->stype = i1d1_chroma4; /* Treat like an Eye-One Display 1 */ + + /* Sequel Chroma 4 with vv == 0xff ???? */ + /* Sencore ColorPro III with ver = 5.01 and vv = 0xff */ + } else if (ver >= 4.0 && ver < 5.1 && vv == 0xff) { + p->dtype = 0; /* Eye-One Display 1 */ + p->stype = i1d1_sencoreIII; + + /* Sencore ColorPro IV with ver = 5.01 and vv = 'L' */ + } else if (ver >= 4.0 && ver < 5.1 && vv == 'L') { + p->dtype = 0; /* Eye-One Display 1 */ + p->stype = i1d1_sencoreIV; /* Treat like an Eye-One Display 1 */ + + /* Sencore ColorPro V with ver = 5.01 and vv = 'B' */ + } else if (ver >= 4.0 && ver < 5.1 && vv == 'B') { + p->dtype = 0; /* Eye-One Display 1 */ + p->stype = i1d1_sencoreV; /* Treat like an Eye-One Display 1 */ + } else if (ver >= 5.1 && ver <= 5.3 && vv == 'L') { p->dtype = 0; /* Eye-One Display 1 */ + } else if (ver >= 6.0 && ver <= 6.29 && vv == 'L') { p->dtype = 1; /* Eye-One Display 2 */ @@ -1506,7 +1523,7 @@ i1disp_check_unlock( } else { /* Reject any version or model we don't know about */ - a1logv(p->log, 1, "Version string = %3.1f\nID character = 0x%02x = '%c'\n",ver,vv,vv); + a1logd(p->log, 1, "Version string = %5.3f\nID character = 0x%02x = '%c'\n",ver,vv,vv); return i1disp_interp_code((inst *)p, I1DISP_UNKNOWN_VERS_ID); } @@ -1998,6 +2015,7 @@ inst_code i1disp_calibrate( inst *pp, inst_cal_type *calt, /* Calibration type to do/remaining */ inst_cal_cond *calc, /* Current condition/desired condition */ +inst_calc_id_type *idtype, /* Condition identifier type */ char id[CALIDLEN] /* Condition identifier (ie. white reference ID) */ ) { i1disp *p = (i1disp *)pp; @@ -2009,6 +2027,7 @@ char id[CALIDLEN] /* Condition identifier (ie. white reference ID) */ if (!p->inited) return inst_no_init; + *idtype = inst_calc_id_none; id[0] = '\000'; if ((ev = i1disp_get_n_a_cals((inst *)p, &needed, &available)) != inst_ok) @@ -2588,8 +2607,7 @@ int *cbid) { * was assume that all of these can be done before initialisation. */ static inst_code -i1disp_get_set_opt(inst *pp, inst_opt_type m, ...) -{ +i1disp_get_set_opt(inst *pp, inst_opt_type m, ...) { i1disp *p = (i1disp *)pp; inst_code ev; @@ -2600,7 +2618,17 @@ i1disp_get_set_opt(inst *pp, inst_opt_type m, ...) return inst_ok; } - return inst_unsupported; + /* Use default implementation of other inst_opt_type's */ + { + inst_code rv; + va_list args; + + va_start(args, m); + rv = inst_get_set_opt_def(pp, m, args); + va_end(args); + + return rv; + } } /* Constructor */ |