-- beadsCtl.mesa -- broke off beads user -- buried contacts -- edge to edge constraints (flying wires) DIRECTORY IODefs:FROM"IODefs", InlineDefs:FROM"InlineDefs", BeadsInlines:FROM"BeadsInlines", MiscDefs:FROM"MiscDefs", BeadsDefs:FROM"BeadsDefs"; BeadsCtl:PROGRAM IMPORTS BeadsInlines, InlineDefs, IODefs, MiscDefs, BeadsDefs = BEGIN OPEN BeadsDefs, BeadsInlines; Error:SIGNAL=CODE; cleanup,doWires,scour,drop,bothWays,disp,lookAtBelow:BOOLEAN; -- ////// CONTROL ////// Main:PROCEDURE=BEGIN InitBeadsProgram[]; DO doLocal,doCompression,onePass:BOOLEAN; [cleanup,doWires,doLocal,doCompression,onePass,scour,drop, bothWays,disp,lookAtBelow]_SetUpForRun[]; bendingWires_FALSE; IF doCompression THEN {Push[16]; Push[8]}; IF doCompression OR onePass THEN Push[1]; IF doLocal THEN BEGIN Local[]; Push[1]; CheckBeads[]; ShowTime[0]; END; bendingWires_TRUE; IF doWires THEN Push[1]; FullTest[]; Finalize[]; ENDLOOP; END; Push:PROCEDURE[i:INTEGER]= INLINE BEGIN howMuch_i; Squeeze[FALSE]; Squeeze[TRUE]; END; rot:BOOLEAN; Squeeze:PROCEDURE[rotate:BOOLEAN]=BEGIN IF ~bothWays AND bendingWires AND ~rotate THEN RETURN; rot_rotate; InitSqueeze[]; FixWires[]; PositionBeads[]; FixWires[]; IF fallBack AND bendingWires THEN TrueFall[]; ShowTime[1]; IF cleanup THEN CleanUp[]; IF scour THEN ScourBeads[]; FinalSqueeze["Squeezed: ",howMuch]; WriteOneNumber["Squeezed: ",howMuch]; IF bendingWires AND drop THEN BEGIN InitSqueeze[]; Clean[]; ShowTime[2]; -- IF scour THEN ScourBeads[]; FinalSqueeze["Dropped: ",0]; END; END; NewYGetsY:PROCEDURE[i:Desc]={Getw[i].newY_Bot[i]}; InitSqueeze:PROCEDURE=BEGIN timeV5_timeV6_0; time_MiscDefs.CurrentTime[]; IF rot THEN Reflect[]; FindBoundingBox[]; EnumerateBeads[InitBeadWork]; SortOnY[]; ShowTime[3]; MakeBelow[]; ShowTime[4]; PrintSomeBelowStuff[]; END; FinalSqueeze:PROCEDURE[s:STRING,xx:INTEGER]=BEGIN TurnWiresToBeads[]; ScavageBeads[]; ShowTime[5]; IF rot THEN Reflect[]; FindBoundingBox[]; IF disp THEN Display[]; IF rot THEN WriteOneNumber[" New X: ",maxX] ELSE WriteOneNumber[" New Y: ",maxY]; WriteOneNumber[s,xx]; END; PrintSomeBelowStuff:PROCEDURE=BEGIN IF lookAtBelow THEN ShowBelow[]; IODefs.WriteChar[CR]; IODefs.WriteString["Below Counts "]; PrintLong[timeV6]; PrintLong[timeV5]; END; SortOnY:PROCEDURE=BEGIN FOR i:CARDINAL IN [0..topBead) DO wpi:WorkPtr_GetW[i]; si:Desc_GetDesc[wpi.sort]; yi:INTEGER_Bot[si]; FOR j:CARDINAL IN (i..topBead] DO wpj:WorkPtr_GetW[j]; sj:Desc_GetDesc[wpj.sort]; yj:INTEGER_Bot[sj]; IF yj>yi THEN BEGIN wpj.sort_si.z; wpi.sort_sj.z; si_sj; yi_yj; END; ENDLOOP; ENDLOOP; END; FastSort:PROCEDURE[low,high,bit:CARDINAL]=BEGIN IF ~(low>=high OR bit=0) THEN BEGIN b:CARDINAL_bit/2; i:CARDINAL_ low; wi:WorkPtr_GetW[i]; si:CARDINAL_wi.sort; j:CARDINAL_high; wj:WorkPtr_GetW[j]; sj:CARDINAL_wj.sort; UNTIL i=j DO IF InlineDefs.BITAND[bit,Get[si].y]=1 THEN {wi.sort_si; i_i+1; wi_GetW[i]; si_wi.sort;} ELSE {wj.sort_si; si_sj; wi_wj; j_j-1; wj_GetW[j]; sj_wj.sort;} ENDLOOP; IF InlineDefs.BITAND[bit,Get[si].y]=1 THEN i_i+1; FastSort[low,i-1,b]; FastSort[i,high,b]; END; END; ShowTime:PROCEDURE[c:CARDINAL]= BEGIN s:STRING_SELECT c FROM 0=>"local time = ", 1=>"position time = ", 2=>"drop time = ", 3=>"init time = ", 4=>"below time = ", 5=>"cleanup time = ", ENDCASE=>"unknown time = "; oldTime:LONG CARDINAL_time; time_MiscDefs.CurrentTime[]; WriteOneNumber[s,InlineDefs.LowHalf[time-oldTime]]; END; Finish:PROCEDURE= BEGIN--for debugging AdjustTheBottom[]; FixWires[]; []_ManipulateDisplay[]; END; Main[]; END.. (1792)\3725i15I