DIRECTORY IODefs: FROM "IODefs", JasmineDefs: FROM "JasmineDefs", MiscDefs: FROM "MiscDefs" USING [Zero,SetBlock], SystemDefs: FROM "SystemDefs"; JasmineCalibrate: PROGRAM IMPORTS IODefs, MiscDefs, JasmineDefs, SystemDefs EXPORTS JasmineDefs = BEGIN OPEN JasmineDefs; JasmineRam: TYPE = RECORD [ blank: [0..17B], Offset: [0..77B], Gain: [0..77B] ]; A: INTEGER _ 4; B: INTEGER _ 3; p420: POINTER TO UNSPECIFIED = LOOPHOLE[420B]; nAverages: CARDINAL _ 8; JasmineCalibrate: PUBLIC PROCEDURE = BEGIN saved420: POINTER TO POINTER _ p420^; targetGain,targetOffset: CARDINAL _ 0; scanHead: POINTER TO ScanHead; scanLine: POINTER TO PACKED ARRAY OF [0..377B]; x: CARDINAL; ramVal: JasmineRam _ [0,64-10,0]; ramvals: POINTER TO ARRAY [0..1024) OF JasmineRam _ SystemDefs.AllocateSegment[1024]; inputArray: POINTER TO ARRAY [0..1024) OF CARDINAL _ SystemDefs.AllocateSegment[1024]; min,max,lastCorrection,newCorrection: CARDINAL; currentVal: CARDINAL; correction,newVal: INTEGER; --turn off display p420^ _ saved420^; --first, initialize MiscDefs.SetBlock[ramvals,ramVal,1024]; JasmineLoadRam[LOOPHOLE[ramvals]]; --JasmineSetDelay[14]; JasmineSetResolution[0]; --JasmineSetTime[656]; lastCorrection_0; JasmineSetWindow[0,1024,100,300]; JasmineSetReadMode[3]; --read, step, and delay [for constant integration time] DO --white repeat loop scanHead _ JasmineScanInit[]; MiscDefs.Zero[inputArray,1024]; THROUGH[1..nAverages] DO scanLine _ JasmineReadLine[scanHead]; FOR x IN [0..1024) DO inputArray[x] _ inputArray[x] + scanLine[x]; ENDLOOP; ENDLOOP; JasmineScanClose[scanHead]; max_0;min_256; FOR x IN [1..1024) DO inputArray[x] _ inputArray[x]/nAverages; IF inputArray[x] < min THEN min _ inputArray[x]; IF inputArray[x] > max THEN max _ inputArray[x]; ENDLOOP; IODefs.WriteString["Min: "];IODefs.WriteDecimal[min]; IODefs.WriteString[" Max: "];IODefs.WriteDecimal[max]; IF targetGain = 0 THEN targetGain _ max; IF ABS[INTEGER[targetGain-max]] > 3 THEN A _ MAX[1,A-1]; newCorrection _ 0; FOR x IN [1..1024) DO currentVal _ ramvals[x].Gain; correction _ targetGain - inputArray[x]; IF inputArray[x] < 10 THEN correction _ correction-256; IF correction < 100 THEN newCorrection _ newCorrection+ABS[correction]; IF correction<0 THEN newVal_currentVal+correction ELSE newVal_currentVal + (correction*A)/B; IF newVal < 0 THEN newVal_0; IF newVal > 63 THEN newVal_63; ramvals[x].Gain_newVal; ENDLOOP; IODefs.WriteString[" ["];IODefs.WriteDecimal[newCorrection]; IODefs.WriteString["] "]; IF (lastCorrection # 0) AND (newCorrection > lastCorrection) THEN EXIT; JasmineLoadRam[LOOPHOLE[ramvals]]; lastCorrection _ newCorrection; ENDLOOP; --white repeat loop JasmineSetReadMode[2]; p420^ _ saved420; END; END. (635)\f1 361b33B386f0 37f1 58f0 27f1 233f0 317f1 59f0 1f1 7f0 10f1 6f0 10f1 18f0 2f1 9f0 2f1 8f0 2f1 27f0 18f1 17f0 1f1 3f0 2f1 1f0 10f1 6f0 10f1 14f0 2f1 49f0 2f1 49f0 2f1 8f0 155b58B31f1 1f0 88b56B74b55B22b1B10b5B195f1 1f0 18f1 1f0 5f1 1f0 30f1 1f0