void SolicitedChannel::OnRequest(APDU& arAPDU) { AppControlField acf = arAPDU.GetControl(); SequenceInfo seq = SI_OTHER; if (acf.SEQ == this->Sequence()) { LOG_BLOCK(LEV_WARNING, "Received previous sequence"); seq = SI_PREV; } else if (acf.SEQ == NextSeq(this->Sequence())) { seq = SI_CORRECT; } mSequence = acf.SEQ; mpAppLayer->mpUser->OnRequest(arAPDU, seq); }
void Place(int S) { LevelCount[S]++; Count++; if (S >= 81) { Succeed(); return; } int S2 = NextSeq(S); SwapSeqEntries(S, S2); int Square = Sequence[S]; int BlockIndex = InBlock[Square], RowIndex = InRow[Square], ColIndex = InCol[Square]; int Possibles = Block[BlockIndex] & Row[RowIndex] & Col[ColIndex]; while (Possibles) { int valbit = Possibles & (-Possibles); // Lowest 1 bit in Possibles Possibles &= ~valbit; Entry[Square] = valbit; Block[BlockIndex] &= ~valbit; Row[RowIndex] &= ~valbit; Col[ColIndex] &= ~valbit; Place(S + 1); Entry[Square] = BLANK; // Could be moved out of the loop Block[BlockIndex] |= valbit; Row[RowIndex] |= valbit; Col[ColIndex] |= valbit; } SwapSeqEntries(S, S2); }