int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo)
{
// sanity check
+ if (*size < 64) return -3;
if (BitStream[1] > 1) return -1;
uint8_t fmtlen;
// preamble 0111111111
// include 0 in front to help get start pos
uint8_t preamble[] = {0,1,1,1,1,1,1,1,1,1};
- if (!preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx))
+ if (!preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx))
return -2;
- if (*size < 64) return -3;
+
+ //XL and normal size.
+ if (*size != 64 && *size != 128) return -3;
- fmtlen = (*size == 110) ? 22 : 10;
+ fmtlen = (*size == 128) ? 22 : 10;
//skip last 4bit parity row for simplicity
*size = removeParity(BitStream, *startIdx + sizeof(preamble), 5, 0, fmtlen * 5);
return errCnt;
}
+bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
+ size_t ststart = 0, stend = 0;
+ return DetectST_ext(buffer, size, foundclock, &ststart, &stend);
+}
+
//by marshmellow
//attempt to identify a Sequence Terminator in ASK modulated raw wave
-bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
+bool DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend) {
size_t bufsize = *size;
//need to loop through all samples and identify our clock, look for the ST pattern
uint8_t fndClk[] = {8,16,32,40,50,64,128};
size_t newloc = 0;
i=0;
if (g_debugMode==2) prnt("DEBUG STT: Starting STT trim - start: %d, datalen: %d ",dataloc, datalen);
-
+ bool firstrun = true;
// warning - overwriting buffer given with raw wave data with ST removed...
while ( dataloc < bufsize-(clk/2) ) {
//compensate for long high at end of ST not being high due to signal loss... (and we cut out the start of wave high part)
for(i=0; i < clk/2-tol; ++i) {
buffer[dataloc+i] = high+5;
}
+ } //test for single sample outlier (high between two lows) in the case of very strong waves
+ if (buffer[dataloc] >= high && buffer[dataloc+2] <= low) {
+ buffer[dataloc] = buffer[dataloc+2];
+ buffer[dataloc+1] = buffer[dataloc+2];
+ }
+ if (firstrun) {
+ *stend = dataloc;
+ *ststart = dataloc-(clk*4);
+ firstrun=false;
}
for (i=0; i<datalen; ++i) {
if (i+newloc < bufsize) {