-
-//by marshmellow
-//attempts to demodulate ask modulations, askType == 0 for ask/raw, askType==1 for ask/manchester
-int askdemod_ext(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType, int *startIdx) {
- if (*size==0) return -1;
- int start = DetectASKClock(BinStream, *size, clk, maxErr); //clock default
- if (*clk==0 || start < 0) return -3;
- if (*invert != 1) *invert = 0;
- if (amp==1) askAmp(BinStream, *size);
- if (g_debugMode==2) prnt("DEBUG ASK: clk %d, beststart %d, amp %d", *clk, start, amp);
-
- //start pos from detect ask clock is 1/2 clock offset
- // NOTE: can be negative (demod assumes rest of wave was there)
- *startIdx = start - (*clk/2);
- uint8_t initLoopMax = 255;
- if (initLoopMax > *size) initLoopMax = *size;
- // Detect high and lows
- //25% clip in case highs and lows aren't clipped [marshmellow]
- int high, low;
- if (getHiLo(BinStream, initLoopMax, &high, &low, 75, 75) < 1)
- return -2; //just noise
-
- size_t errCnt = 0;
- // if clean clipped waves detected run alternate demod
- if (DetectCleanAskWave(BinStream, *size, high, low)) {
- if (g_debugMode==2) prnt("DEBUG ASK: Clean Wave Detected - using clean wave demod");
- errCnt = cleanAskRawDemod(BinStream, size, *clk, *invert, high, low, startIdx);
- if (askType) { //askman
- uint8_t alignPos = 0;
- errCnt = manrawdecode(BinStream, size, 0, &alignPos);
- *startIdx += *clk/2 * alignPos;
- if (g_debugMode) prnt("DEBUG ASK CLEAN: startIdx %i, alignPos %u", *startIdx, alignPos);
- return errCnt;
- } else { //askraw
- return errCnt;
- }
- }
- if (g_debugMode) prnt("DEBUG ASK WEAK: startIdx %i", *startIdx);
- if (g_debugMode==2) prnt("DEBUG ASK: Weak Wave Detected - using weak wave demod");
-
- int lastBit; //set first clock check - can go negative
- size_t i, bitnum = 0; //output counter
- uint8_t midBit = 0;
- uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave
- if (*clk <= 32) tol = 1; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely
- size_t MaxBits = 3072; //max bits to collect
- lastBit = start - *clk;
-
- for (i = start; i < *size; ++i) {
- if (i-lastBit >= *clk-tol){
- if (BinStream[i] >= high) {
- BinStream[bitnum++] = *invert;
- } else if (BinStream[i] <= low) {
- BinStream[bitnum++] = *invert ^ 1;
- } else if (i-lastBit >= *clk+tol) {
- if (bitnum > 0) {
- if (g_debugMode==2) prnt("DEBUG ASK: Modulation Error at: %u", i);
- BinStream[bitnum++]=7;
- errCnt++;
- }
- } else { //in tolerance - looking for peak
- continue;
- }
- midBit = 0;
- lastBit += *clk;
- } else if (i-lastBit >= (*clk/2-tol) && !midBit && !askType){
- if (BinStream[i] >= high) {
- BinStream[bitnum++] = *invert;
- } else if (BinStream[i] <= low) {
- BinStream[bitnum++] = *invert ^ 1;
- } else if (i-lastBit >= *clk/2+tol) {
- BinStream[bitnum] = BinStream[bitnum-1];
- bitnum++;
- } else { //in tolerance - looking for peak
- continue;
- }
- midBit = 1;
- }
- if (bitnum >= MaxBits) break;
- }
- *size = bitnum;
- return errCnt;
-}
-
-int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType) {
- int start = 0;
- return askdemod_ext(BinStream, size, clk, invert, maxErr, amp, askType, &start);
-}
-//by marshmellow
-//take 10 and 01 and manchester decode
-//run through 2 times and take least errCnt
-int manrawdecode(uint8_t * BitStream, size_t *size, uint8_t invert, uint8_t *alignPos)
-{
- uint16_t bitnum=0, MaxBits = 512, errCnt = 0;
- size_t i, ii;
- uint16_t bestErr = 1000, bestRun = 0;
- if (*size < 16) return -1;
- //find correct start position [alignment]
- for (ii=0;ii<2;++ii){
- for (i=ii; i<*size-3; i+=2)
- if (BitStream[i]==BitStream[i+1])
- errCnt++;
-
- if (bestErr>errCnt){
- bestErr=errCnt;
- bestRun=ii;
- }
- errCnt=0;
- }
- *alignPos=bestRun;
- //decode
- for (i=bestRun; i < *size-3; i+=2){
- if(BitStream[i] == 1 && (BitStream[i+1] == 0)){
- BitStream[bitnum++]=invert;
- } else if((BitStream[i] == 0) && BitStream[i+1] == 1){
- BitStream[bitnum++]=invert^1;
- } else {
- BitStream[bitnum++]=7;
- }
- if(bitnum>MaxBits) break;
- }
- *size=bitnum;
- return bestErr;
-}