bool Signal::processHumaxAtoms(int bitStart, float* pFr, int maxBursts)   
{
	int atomIdx,i;
	float one = 105.0;
	float four = 4* one;
	float delta = one * 0.5;
	float edge, used = 0.0;
	float first[4];
	first[0] = 2*one; first[1] = 3*one; first[2] = one; first[3] = 2*one;
	int burstIdx = 0;
	int bitIdx=bitStart;
	do {	
		atomIdx=2 * (1 - burstIdx&1); //odd burstIdx is "off" signal, which can only be the beginning of bits value 0 or 1
		for (i=0; i<2; i++) { //<-2,2|-3,1|1,-3|2,-2>
			edge = first[atomIdx + i ]; 
			if (abs(pFr[burstIdx]- used - edge) < delta) {
				cBits[bitIdx >> 2] |= (atomIdx + i) << (6- 2*(bitIdx&3));
				burstIdx++;
				if (abs(pFr[burstIdx] - (four - edge)) < delta) {
					used = 0.0;
					burstIdx++;
				}
				else
					used = four - edge;
				break;
			}
		}
		if (i > 1) 
			return false;  //arrive here if no match found
		bitIdx++;
		if (bitIdx >= sizeof(cBits)*4) 
			return false;  //not enough room in cBits
		if (bitIdx % 12 == 0) {
			used = 0.0;
			burstIdx++;
		}
	} while (burstIdx < maxBursts );
	if (bitIdx % 12 != 0)
		return false;  // wrong frame length
	int cIdx = (bitIdx - 1) >> 2;
	if ((cBits[cIdx] & 2) == (cBits[cIdx] & 1)) 
		return false;  // failed check bit
	return true;
}

void Signal::tryHumax()   //  {56k,105, msb}<-2,2|-3,1|1,-3|2,-2>(T=0,(2,-2,D:7, S:5,T:2,F:6:1,(F:1+1):2),^95m,T=1)+) DAR 2012 
{
	static int M = 0;	// toggle mask or previous T	
	int T;
	static int FC = 0;	// count of bypassed frames
	bool success;
	if (( nFrameL < 7 ) || !framed(420*12) )
		return;
	if (sortOff.max1 > 1.5 * 630) 
		return;
    //if ( sortOn.min1 * 3.6 < sortOff.min1 )
        //return;
	 //if ( sortOff.min1 * 2.5 < sortBurst.min1  || sortOff.min1 * 1.8 > sortBurst.max3)
        //return;
	cleanup();
	success = processHumaxAtoms(0, pFrame, pFrameEnd - pFrame);
	if (!success)
		return;
	float* pFrameEnd2 = pFrameEnd + 1;
	for ( ; pFrameEnd2 < pMainLimit; pFrameEnd2++ ) {
		if ( *pFrameEnd2 > 2000. ) break; // about 3 time the max duration
	};
	success = processHumaxAtoms(12, pFrameEnd + 1, pFrameEnd2 - pFrameEnd); //check for second signal
	setPreempt(prAsync	);  // avoid an Async decode
	makeMsb();
	if (success)  {
		T = getMsb(14,2) ^ getMsb(38,2);				// difference between the toggle values
		if	(( (M == 0) ^ (T == 0) )					// exactly one of M and T must be zero
			&&	getMsb(0,13) == getMsb(24,13)			// all bits other than toggle must be equal
			&&	getMsb(16,8) == getMsb(40,8) )
		{
			M = 1;										// next frame is valid repeat
			if ( FC == 0 ) setzContext();				// save the context value
			FC++;										// increment count of bypassed frames
			return;										// wait for repeat to come round
		}
	}
	strcpy(pProtocol,"Humax 4Phase"); 
    *pDevice = getMsb(2,6);
	*pSubDevice = getMsb(8,6);
	int tog = getMsb(14,2);
	sprintf(pMisc, "T=%d", tog);
	*pOBC = getMsb(16,7);
	nNote_out = 4;
	strcpy( pMisc, M == 0 ? (nNote_out = 1, nAuxNote_out = 1, "no start frame") : "");
	nFrameCount = FC;
	FC = 0;		// reset static variables
	M = 0;	
}  // tryHumax