void ecg_algorithm_handler(void) { if (false == g_ecg_algo_sw) return; u32 u32Tick = 0; char pace = 0; s32 s32I = 0, s32II = 0, s32V = 0; #ifdef _ALG_ECG_RUN_TIME_ u32 u32curtick; #endif s32 s32Len = ECG_PopAlgoResult(&u32Tick, &s32I, &s32II, &s32V, &pace); if (s32Len)//有数据更新 { #ifdef _ALG_ECG_RUN_TIME_ u32curtick = SysTick_Get(); #endif g_Is_ecg_algo_run = true; l_ecg_PushAlgorithmData(&u32Tick, &s32I, &s32II, &s32V, &pace); ecg_algorithm_result(); g_Is_ecg_algo_run = false; #ifdef _ALG_ECG_RUN_TIME_ AIO_printf("\r\nECG ALGO RUN TICK =\t%d\tHR=%d", SysTick_Get()-u32curtick, (u16)p_ecg_algorithm_out->stResult.u32HeartRate); #endif } }
static int ecg_algorithm_result(void) { int i32CECGOutItemNum = 0; static u32 u32QuickQRSTick = 0; i32CECGOutItemNum = l_ecg_PopAlgorithmData((void *)p_ecg_algorithm_out, 1); if (i32CECGOutItemNum)//获取到有结果 { ecg_algorithm_PushFilterResult(); //保存滤波后数据 ecg_algo_refreshAlertType(); if ((0 != p_ecg_algorithm_out->stResult.u32QuickQRSTick) \ && (u32QuickQRSTick != p_ecg_algorithm_out->stResult.u32QuickQRSTick)) { ALG_ECG_DBG("QRS:%d,CUR:%d", p_ecg_algorithm_out->stResult.u32QuickQRSTick, SysTick_Get()); u32QuickQRSTick = p_ecg_algorithm_out->stResult.u32QuickQRSTick; ECG_SetDefibrillate(); } ALG_ECG_DBG("BR(%d)ST(%d)C(%d)", p_ecg_algorithm_out->stResult.u32HeartRate, p_ecg_algorithm_out->stResult.nSTAmpDif, p_ecg_algorithm_out->stResult.nHRConfidence); } return i32CECGOutItemNum; }
bool IsOnTime(const unsigned long ulTarget) // 0: less than target time 1: on time or over time with target { if(SysTick_Compare(SysTick_Get(), ulTarget) == -1) // < { return false; } return true; }
void AT_ComnandParser(char c) { static uint32_t RingBuffInit = 0; if(RingBuffInit == 0)// int ring buff { RingBuffInit = 1; AT_CmdProcessInit(); } StrComnandParser(SysTick_Get(),AT_ProcessCmd,&AT_CmdParser,cmdCnt,c); }
bool IsOverTime(const unsigned long ulBase, unsigned long ulDuration) // 0: less than target time 1: over the target time { unsigned long u32Target; u32Target = ulBase + ulDuration; if(SysTick_Compare(SysTick_Get(), u32Target) == 1) // > { return true; } return false; }
int gps_parse() { unsigned char buf[100]; unsigned char ch; uint32_t t0; unsigned int sum, pow10, div10; int i1, i2, ilast, ix; int latdeg, londeg, latmin, lonmin; i1 = i2 = ilast = 0; // to get rid of compiler warnings t0 = SysTick_Get(); while (1) { // if ( SysTick_DeltaTime_ms(t0) > 100) { // check for timeout at 100 msec intervals return 0; } ch = read_ublox(); if (ch == 0xff) continue; if (ch != '$') // look for "$GPGGA," header continue; for (i1=0; i1<6; i1++) { buf[i1] = read_ublox(); } if ((buf[2] != 'G') || (buf[3] != 'G') || (buf[4] != 'A')) continue; for (i1=0; i1<100; i1++) { buf[i1] = read_ublox(); if (buf[i1] == '\r') { buf[i1] = 0; ilast = i1; break; } } //printf("$GPGGA,%s\r\n", buf); // i1 = start of search, i2 = end of search (comma), ilast = end of buffer // parse utc i1 = 0; sum = 0; pow10 = 1; div10 = 0; for (ix=0; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } for (ix=(i2-1); ix>=i1; ix--) { if (buf[ix] == '.') { div10 = 1; continue; } sum += pow10 * (buf[ix] & 0x0F); pow10 *= 10; div10 *= 10; } div10 = pow10 / div10; gps_gga.utc = sum / div10; // parse lat i1 = i2+1; sum = 0; pow10 = 1; div10 = 0; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } for (ix=(i2-1); ix>=i1; ix--) { if (buf[ix] == '.') { div10 = 1; continue; } sum += pow10 * (buf[ix] & 0x0F); if (ix>i1) { // to prevent overflow pow10 *= 10; div10 *= 10; } } div10 = pow10 / div10; latdeg = sum / (div10*100); latmin = sum - (latdeg*div10*100); latmin = (latmin * 100) / 60; // convert to decimal minutes gps_gga.lat = (latdeg*div10*100) + latmin; if (div10 > 10000) gps_gga.lat /= (div10 / 10000); // normalize lat minutes to 6 decimal places // skip N/S field i1 = i2+1; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == 'S') gps_gga.lat = -gps_gga.lat; if (buf[ix] == ',') { i2 = ix; break; } } // parse lon i1 = i2+1; sum = 0; pow10 = 1; div10 = 0; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } for (ix=(i2-1); ix>=i1; ix--) { if (buf[ix] == '.') { div10 = 1; continue; } sum += pow10 * (buf[ix] & 0x0F); if (ix>i1) { // to prevent overflow pow10 *= 10; div10 *= 10; } } div10 = pow10 / div10; londeg = sum / (div10*100); lonmin = sum - (londeg*div10*100); lonmin = (lonmin * 100) / 60; // convert to decimal minutes gps_gga.lon = (londeg*div10*100) + lonmin; if (div10 > 10000) gps_gga.lon /= (div10 / 10000); // normalize lon minutes to 6 decimal places // skip E/W field i1 = i2+1; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == 'W') gps_gga.lon = -gps_gga.lon; if (buf[ix] == ',') { i2 = ix; break; } } // parse fix i1 = i2+1; sum = 0; pow10 = 1; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } gps_gga.fix = buf[i2-1] & 0x0F; // parse satellites i1 = i2+1; sum = 0; pow10 = 1; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } for (ix=(i2-1); ix>=i1; ix--) { sum += pow10 * (buf[ix] & 0x0F); pow10 *= 10; } gps_gga.sat = sum; // skip horz-precision field i1 = i2+1; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } // parse alt i1 = i2+1; sum = 0; pow10 = 1; for (ix=i1; ix<ilast; ix++) { if (buf[ix] == ',') { i2 = ix; break; } } for (ix=(i2-1); ix>=i1; ix--) { if (buf[ix] == '.') continue; sum += pow10 * (buf[ix] & 0x0F); pow10 *= 10; } gps_gga.alt = sum / 10; gps_gga.latitude = (float) gps_gga.lat / 1000000.0; //Scale to float gps_gga.longitude = (float) gps_gga.lon / 1000000.0; //Scale to float gps_gga.altitude = (float) gps_gga.alt; //Scale to float return 1; } }
void ECG_SetDefibrillate(void) { defibrillate_pulse_tick = SysTick_Get() + getTickNumberByMS(100); is_defibrillate_run = 1; *pPORTFIO_SET = PF0; }