/* * 毫秒级延时,误差±1ms */ void Delay_ms(unsigned int ms) { SysTick_t t = GetSystemTick(); t += ms; while(GetSystemTick() < t){ SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPONEXIT); // Reset SLEEPONEXIT SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); // Clear SLEEPDEEP bit __WFI(); // Request Wait For Interrupt } }
void LimitSwitch_Task() { SysTick_t now = GetSystemTick(); for (int i = 0; i < NUM_SWITCHS; ++i) { bool cur_state; cur_state = LimitSwitch_Pressed(i); //状态改变 if(cur_state != bSwitchPressed[i]) { //有效的按键变化 if(now - lastInterrupt[i] >= LIMIT_SWITCH_MIN_TOGGLE_PERIOD){ lastInterrupt[i] = now; bSwitchPressed[i] = cur_state; bEventSent[i] = false; } }else{ //超过阈值,按下有效 if(cur_state && !bEventSent[i] && now - lastInterrupt[i] >= LIMIT_SWITCH_VALID_TIME) { bEventSent[i] = true; Move_LimitReached(i); } } } }
void ExtruderTask(void) { SysTick_t now = GetSystemTick(); if(bHeating && now - lastUpdatingTime > EXTRUDER_UPDATE_PERIOD) { int output; #if EXTRUDER_THERMO_USING_ADC uint16_t adc_val = Analog_GetChannelValue(Extruder1Therm_ADC_Ch); currentTemp = EXTRUDER_ADC_TO_TEMP(adc_val); // DBG_MSG("ADC Val: %d %d", adc_val, currentTemp); #else currentTemp = MAX6675_Read_Value(); #endif lastUpdatingTime = now; if(currentTemp < 0) { ERR_MSG("Thermcouple not connected!", 0); return; } output = PID_Update(&pid, targetTemp - currentTemp); //转为百分比 output /= 400; Extruder_SetOutput(output); } }
HRESULT CCSRIRadar::Run(void* pvParam) { BYTE8* pbData = new BYTE8[100]; BYTE8* buf = pbData; BYTE8* bEventId = buf; *bEventId = 0; buf++; BYTE8* bType = buf; *bType = 0x08; buf++; BYTE8* bEventDeviceType = buf; *bEventDeviceType = 0x01; buf++; BYTE8* dwTimePos = buf; buf += 4; BYTE8* rgbData = buf; DWORD32 dwTime, dwSize = buf - pbData + 1; DWORD32 dwLastTimeTick = GetSystemTick(); while (!m_fExit) { if (1 == CSerialBase::Recv(&rgbData[0], 1, 3000)) { if (rgbData[0] > 0) { HV_Trace(5, "receive a speed from CSR-I Radar, value=%d\n", rgbData[0]); dwTime = GetSystemTick(); memcpy(dwTimePos, &dwTime, sizeof(DWORD32)); //send to slave. g_cHvPciLinkApi.SendData(PCILINK_PCIIPT, pbData, dwSize); } } if(GetSystemTick() - dwLastTimeTick >= 3000) { dwLastTimeTick = GetSystemTick(); HV_Trace(5, "CCSRIRadar working....\n"); } } delete []pbData; return S_OK; }
void Extruder_Init() { bHeating = false; currentTemp = -1; currentOutput = 0; #if EXTRUDER_THERMO_USING_ADC Analog_SetChannel(Extruder1Therm_ADC_Ch, true); #else MAX6675_Config(); #endif lastUpdatingTime = GetSystemTick(); }
// 注:仅支持单板模式 // 必须打开单板模式编译宏“SINGLE_BOARD_PLATFORM”才能编译通过!!! int main(int argc, char** argv) { HV_Trace(5, "Begin...\n"); HV_Trace(5, "%s %s\n", __TIME__, __DATE__); LinuxSystemInit(); CUserExitThread e; e.Start(NULL); // 使能看门狗。 // 注:使能之前必须喂狗,防止遇到“打开看门狗的同时发生喂狗超时而导致设备复位”这样的情况。 WdtHandshake(); CPLD_Write(CPLD_WTD_ENABLE, 1); WdtHandshake(); // 载入各模块参数 ModuleParams cModuleParams; if ( S_OK != LoadModuleParam(cModuleParams) ) { HV_Trace(5, "LoadModuleParam failed!\n"); HV_Exit(HEC_FAIL|HEC_RESET_DEV, "LoadModuleParam failed!"); } WdtHandshake(); // 判断是否恢复出厂设置 if (IsRecoverFactorySettings()) { RecoverFactorySettings(); HV_Exit(HEC_SUCC, "RecoverFactorySettings!"); } WdtHandshake(); // 初始化共享内存 if (S_OK != InitDspLinkMemBlocks(LPRAPP_SINGLE_BOARD_PLATFORM)) { HV_Trace(5, "Memory blocks initialize failed!\n"); HV_Exit(HEC_RESET_DEV|HEC_FAIL, "Memory blocks initialize failed!"); } WdtHandshake(); BOOL fIsIP1Correct = FALSE; // 判断是否测试相机口(生产测试时使用) if (!IsTestCamLanPort()) { // 正常工作,非测试,设置LAN1和LAN2口 // 确保LAN1和LAN2不在同一网段内,如果在同一网段内,LAN1将会被强行关闭 if (CheckIPAddr(cModuleParams.cTcpipCfgParam_1, cModuleParams.cTcpipCfgParam_2) == S_OK) { fIsIP1Correct = TRUE; SetTcpipAddr_1(&cModuleParams.cTcpipCfgParam_1); } // 设置设备IP SetTcpipAddr_2(&cModuleParams.cTcpipCfgParam_2); } else { // 进行测试相机口,只设置LAN1口为通信息端口 fIsIP1Correct = TRUE; SetTcpipAddr_1(&cModuleParams.cTcpipCfgParam_2); } if (S_OK == StartCamTransmit(0, "", cModuleParams.cTcpipCfgParam_1, cModuleParams.cTcpipCfgParam_2)) { HV_Trace(5, "StartCamTransmit...\n"); } WdtHandshake(); CSafeSaverDm6467Impl* pcSafeSaver = NULL; if (1 == cModuleParams.cResultSenderParam.fInitHdd) { SetAllLightOn(); g_cHddOpThread.SetHddOpType(HOT_FULL_INIT); g_cHddOpThread.Start(NULL); HV_Trace(5, "Hdd init...\n"); } if (cModuleParams.cResultSenderParam.fIsSafeSaver) { if (!cModuleParams.cResultSenderParam.fInitHdd) { SetAllLightOn(); g_cHddOpThread.SetHddOpType(HOT_INIT); g_cHddOpThread.Start(NULL); HV_Trace(5, "Hdd check...\n"); } WdtHandshake(); while (1 != g_nHddCheckStatus) { HV_Trace(5, "等待硬盘初始化完成...\n"); HV_Sleep(1000); WdtHandshake(); } pcSafeSaver = new CSafeSaverDm6467Impl(); SSafeSaveParam sParam; sParam.fCoverCtrl = true; sParam.fSaveRecord = true; pcSafeSaver->Init(&sParam); } SEND_RECORD_PARAM cParam; cParam.pcSafeSaver = pcSafeSaver; CCameraRecordLinkCtrl cCameraRecordLinkCtrl; cCameraRecordLinkCtrl.SetParam(&cParam); if ( S_OK != cCameraRecordLinkCtrl.Start(NULL) ) { HV_Trace(5, "CCameraRecordLinkCtrl Start failed!\n"); HV_Exit(HEC_FAIL, "CCameraRecordLinkCtrl Start failed!"); } WdtHandshake(); ICameraCmdProcess* pICameraCmdProcess = NULL; if ( S_OK != CCameraCmdProcess::CreateICameraCmdProcess(&pICameraCmdProcess) ) { HV_Trace(5, "CreateICameraCmdProcess failed!\n"); HV_Exit(HEC_FAIL, "CreateICameraCmdProcess failed!"); } CCameraCmdLinkCtrl cCameraCmdLinkCtrl(pICameraCmdProcess); if ( S_OK != cCameraCmdLinkCtrl.Start(NULL) ) { HV_Trace(5, "CCameraCmdLinkCtrl Start failed!\n"); HV_Exit(HEC_FAIL, "CCameraCmdLinkCtrl Start failed!"); } WdtHandshake(); CHvBoxHolder cHvBoxHolder; cHvBoxHolder.Init(&cModuleParams, pcSafeSaver); HV_Sleep(300); // 启动设备搜索响应线程 CIPSearchThread cDevSearch; if ( S_OK != cDevSearch.Create() ) { HV_Trace(5, "IP search thread create failed!\n"); HV_Exit(HEC_FAIL, "IP search thread create failed!"); } // 初始化HvTelnet服务 if ( -1 == TelnetInit() ) { HV_Trace(5, "TelnetInit is Failed!\n"); HV_Exit(HEC_FAIL, "TelnetInit is Failed!"); } WdtHandshake(); /* SetBuzzerOn(); HV_Sleep(200); SetBuzzerOff(); */ SetLan1LedOff(); SetLan2LedOff(); SetHddLedOff(); SetStatLedOff(); HV_Trace(5, "Running...\n"); // 定时对网关进行ARPPing CPingThread cPingThread; cPingThread.SetIPAddress(cModuleParams.cTcpipCfgParam_1.szIp, cModuleParams.cTcpipCfgParam_1.szNetmask, cModuleParams.cTcpipCfgParam_1.szGateway); cPingThread.Start(NULL); WdtHandshake(); DWORD32 dwIPTick = 0; DWORD32 dwBoxTick = 0; DWORD32 dwDotTick = 0; DWORD32 dwMemTick = GetSystemTick(); while (1) { if (!fIsIP1Correct && (GetSystemTick() - dwIPTick >= 5000)) { HV_Trace(5, "LAN1和LAN2的IP不能设置为同一网段,请更改!\n"); dwIPTick = GetSystemTick(); } HV_Sleep(500); if (GetSystemTick() - dwBoxTick >= 10000) { cHvBoxHolder.ShowStatus(); dwBoxTick = GetSystemTick(); } if (GetSystemTick() - dwMemTick >= 20000) { ShareMemPoolStatusShow(); dwMemTick = GetSystemTick(); } WdtHandshake(); WorkLedLight(); if (GetSystemTick() - dwDotTick >= 1000) { HV_Trace(5,"."); fflush(stdout); dwDotTick = GetSystemTick(); } } HV_Exit(HEC_FAIL, "MainExit"); }
HRESULT CTrafficLightImpl::RecognizeTrafficLight(HV_COMPONENT_IMAGE* pSceneImage, int* iCurrentStatus, int* iLastStatus, bool fNight) { if (m_tlpTrafficLightParam.iLightGroupCount <= 0) return S_FALSE; HRESULT hResult = S_FALSE; static int nSceneStatusPos= 0; LIGHT_TEAM_STATUS ltsInfo; ltsInfo.nTeamCount = m_tlpTrafficLightParam.iLightGroupCount; bool fDynamic = false; static int iSkipFrameNo = m_tlpTrafficLightParam.iSkipFrameNo; for(int i = 0; i<m_tlpTrafficLightParam.iLightGroupCount; i++) { if (m_tlpTrafficLightParam.iCheckType == 0) { //红绿灯识别 if (iSkipFrameNo == 0 && m_tlpTrafficLightParam.iAutoScanLight == 1) { m_rgLightInfo[i].UpdateStatus3( pSceneImage , fNight); m_rgLightRect[i] = m_rgLightInfo[i].GetRect(); m_rgLightStatus[i] = m_rgLightInfo[i].GetLastStatus(); fDynamic = true; } else { m_rgLightInfo[i].UpdateStatus( pSceneImage ); m_rgLightRect[i] = m_rgLightInfo[i].GetRect(); m_rgLightStatus[i] = m_rgLightInfo[i].GetLastStatus(); } sv::utTrace("<123dsp light>status:%08x.", m_rgLightStatus[i]); } else { if (m_pCallback == NULL) { return E_FAIL; } m_rgLightRect[i] = m_rgLightInfo[i].GetRect(); BYTE8 bLevel = 0; if (S_OK != m_pCallback->GetTrafficLightStatus(&bLevel)) { return E_FAIL; } m_rgLightStatus[i] = GetIOStatus(i, bLevel); } m_rgLightInfo[i].m_iRedLightCountFinded = 0; m_rgLightInfo[i].m_iGreenLightCountFinded = 0; ltsInfo.pdwStatus[i] = m_rgLightStatus[i]; ltsInfo.pnLightCount[i] = m_rgLightInfo[i].GetPosCount(); //传检测到的灯传出去显示 if(m_pCallback) { m_pCallback->TrafficLightStatusEx( i, m_rgLightInfo[i].m_iRedLightCountFinded, m_rgLightInfo[i].m_rcRedLightPosFinded, m_rgLightInfo[i].m_iGreenLightCountFinded, m_rgLightInfo[i].m_rcGreenLightPosFinded ); } } if (iSkipFrameNo <= 0) { iSkipFrameNo = m_tlpTrafficLightParam.iSkipFrameNo; } else { iSkipFrameNo--; } //取得当前场景 bool fFlag = (m_tlpTrafficLightParam.iSceneCheckMode == 0); int nCurScene = TransitionScene(ltsInfo, m_tlpTrafficLightParam.iSceneCount, m_iLastOkLightStatus, fFlag); sv::utTrace("<123dsp light>CurScene:%08x.", nCurScene); //调整发送出去的红灯的坐标 if (m_tlpTrafficLightParam.iAutoScanLight == 1 && fDynamic) { ////更新最后可正常识别的灯组的位置 if (nCurScene != -1) { for (int i = 0; i < m_tlpTrafficLightParam.iLightGroupCount; i++) { m_rgLightInfo[i].UpdateLastSureLight(m_rgLightInfo[i].GetRect()); } } else { //处于中间状态时,则将灯红坐标还原回最后可识别出的状态 for (int i = 0; i < m_tlpTrafficLightParam.iLightGroupCount; i++) { m_rgLightInfo[i].SetRect(m_rgLightInfo[i].GetLastSureLight(), m_rgLightInfo[i].GetPosCount(), m_rgLightInfo[i].GetLightDirection()); } } //更新红灯的坐标 UpdateRedLightPos(); } if( m_pCallback ) { int nSceneStatus = -1; if( m_pCallback != NULL) { //把红灯的位置传出去 m_pCallback->TrafficLightStatus( m_tlpTrafficLightParam.iLightGroupCount, m_rgLightStatus, &nSceneStatus, m_rgLightRect, m_iRedLightCount, m_rgRedLightRect, pSceneImage ); } nSceneStatus = nCurScene; #if 0 //新增输出红绿灯灯组信息 lixh 2011-09-19 static char pLightStatus[64] = "", pLastStatus[64] = ""; memset(pLightStatus, 0, 64); PrintLightStatus(ltsInfo , pLightStatus , 64); if(0 != strcmp(pLightStatus, pLastStatus)) { strcpy(pLastStatus, pLightStatus); sprintf(g_szDebugInfo, "rg status = %s", pLastStatus); for(int i = 0; i < m_tlpTrafficLightParam.iLightGroupCount; i++) { CRect rc = m_rgLightInfo[i].GetRect(); sprintf(g_szDebugInfo + strlen(g_szDebugInfo), "(%d,%d,%d,%d)", rc.left, rc.top, rc.right, rc.bottom); } } #endif m_iCurLightStatus = nSceneStatus; //如果用户设置了场景状态则加入场景状态队列 //if(hr == S_OK && nSceneStatus != -1) if( nSceneStatus != -1 ) { m_iErrorSceneCount = 0; SetSceneStatus(nSceneStatusPos, nSceneStatus); nSceneStatusPos++; //下一个存储位置,同时也是计数 int iRelayTimeMs = m_tlpTrafficLightParam.iValidSceneStatusCount * 100; //加入场景状态后判断是否输出 if(m_tlpTrafficLightParam.iValidSceneStatusCount > 0 && nSceneStatusPos >= m_tlpTrafficLightParam.iValidSceneStatusCount) { int nLastPos = nSceneStatusPos - 1; int nLastStatus = GetSceneStatus(nLastPos); BOOL fValid = TRUE; for( int i = nLastPos - 1; i > (nLastPos - m_tlpTrafficLightParam.iValidSceneStatusCount); i--) { if( GetSceneStatus(i) != nLastStatus) { fValid = FALSE; break; } } //如果是快速模式,则有一帧判断为下一场景就跳变. if( m_fCheckSpeed && !fValid && m_iLastOkLightStatus != -1 && m_iLastOkLightStatus != nSceneStatus) { int iNextStatus = (m_iLastOkLightStatus + 1) % m_tlpTrafficLightParam.iSceneCount; if( iNextStatus == nSceneStatus ) { fValid = true; iRelayTimeMs = 100; nLastStatus = nSceneStatus; } } if( fValid && nLastStatus != m_iLastLightStatus) { //如果有绿灯变成红灯且设有黄灯延迟 TRAFFICLIGHT_SCENE tsLast, tsRelay; GetLightScene(m_iLastOkLightStatus, &tsLast); GetLightScene(nLastStatus, &tsRelay); DWORD32 dwTick = GetSystemTick(); bool fRelayTimeOut = true; if( m_tlpTrafficLightParam.iRedLightDelay > 0 ) { if( tsLast.lsLeft == TLS_GREEN && tsRelay.lsLeft == TLS_RED ) { if( m_ltRedRelay.dwLeft == 0 ) m_ltRedRelay.dwLeft = dwTick; if( int(dwTick - m_ltRedRelay.dwLeft) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } if( tsLast.lsForward == TLS_GREEN && tsRelay.lsForward == TLS_RED ) { if( m_ltRedRelay.dwForward == 0 ) m_ltRedRelay.dwForward = dwTick; if( int(dwTick - m_ltRedRelay.dwForward) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } if( tsLast.lsRight == TLS_GREEN && tsRelay.lsRight == TLS_RED ) { if( m_ltRedRelay.dwRight == 0 ) m_ltRedRelay.dwRight = dwTick; if( int(dwTick - m_ltRedRelay.dwRight) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } if( tsLast.lsTurn == TLS_GREEN && tsRelay.lsTurn == TLS_RED ) { if( m_ltRedRelay.dwTurn == 0 ) m_ltRedRelay.dwTurn = dwTick; if( int(dwTick - m_ltRedRelay.dwTurn) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } } if( fRelayTimeOut ) { m_ltRedRelay.Reset(); m_iLastLightStatus = nLastStatus; TRAFFICLIGHT_SCENE tsSceneStatus, tsNow; GetLightScene(m_iLastLightStatus, &tsSceneStatus); GetLightScene(m_iLastLightStatus, &tsNow); int iGreenRelayMs = 1000; //新增输出红绿灯灯组信息 lixh 2011-09-19 char pLightStatus[64]; memset(pLightStatus, 0, 64); PrintLightStatus(ltsInfo , pLightStatus , 64); if( m_pCallback != NULL ) { m_pCallback->TrafficSceneStatus(tsSceneStatus,pLightStatus); } //更新红灯开始时间 if( nLastStatus != -1 ) { m_iLastOkLightStatus = nLastStatus; } //DWORD32 dwTimeLow, dwTimeHigh; //ConvertTickToSystemTime((GetSystemTick() - iRelayTimeMs), dwTimeLow, dwTimeHigh); //一体机代码,红绿灯时间只有L,没有H,在ARM端在通过ConvertTickToSystemTime进行转换,黄国超修改,2011-07-21 DWORD32 dwTimeLow = GetSystemTick() - iRelayTimeMs, dwTimeHigh = 0; if( tsNow.lsLeft == TLS_RED && tsLast.lsLeft != TLS_RED ) { m_redrealtime.dwLeftL = dwTimeLow; m_redrealtime.dwLeftH = dwTimeHigh; } if( tsNow.lsLeft == TLS_GREEN && tsLast.lsLeft != TLS_GREEN ) { m_greentick.dwLeft = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsLeft != TLS_GREEN ) { m_greentick.dwLeft = 0; } if( tsNow.lsForward == TLS_RED && tsLast.lsForward != TLS_RED ) { m_redrealtime.dwForwardL = dwTimeLow; m_redrealtime.dwForwardH = dwTimeHigh; } if( tsNow.lsForward == TLS_GREEN && tsLast.lsForward != TLS_GREEN ) { m_greentick.dwForward = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsForward != TLS_GREEN ) { m_greentick.dwForward = 0; } if( tsNow.lsRight == TLS_RED && tsLast.lsRight != TLS_RED ) { m_redrealtime.dwRightL = dwTimeLow; m_redrealtime.dwRightH = dwTimeHigh; } if( tsNow.lsRight == TLS_GREEN && tsLast.lsRight != TLS_GREEN ) { m_greentick.dwRight = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsRight != TLS_GREEN ) { m_greentick.dwRight = 0; } if( tsNow.lsTurn == TLS_RED && tsLast.lsTurn != TLS_RED ) { m_redrealtime.dwTurnL = dwTimeLow; m_redrealtime.dwTurnH = dwTimeHigh; } if( tsNow.lsTurn == TLS_GREEN && tsLast.lsTurn != TLS_GREEN ) { m_greentick.dwTurn = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsTurn != TLS_GREEN ) { m_greentick.dwTurn = 0; } } } } } else { //如果无效场景数大于设定的值,则把当前的场景设成-1. m_iErrorSceneCount++; if( m_iErrorSceneCount >= (m_tlpTrafficLightParam.iValidSceneStatusCount * 2)) { m_iLastLightStatus = -1; TRAFFICLIGHT_SCENE tsSceneStatus; GetLightScene(m_iLastLightStatus, &tsSceneStatus); //新增输出红绿灯灯组信息 lixh 2011-09-19 char pLightStatus[64]; memset(pLightStatus, 0, 64); PrintLightStatus(ltsInfo , pLightStatus , 64); if( m_pCallback != NULL ) { m_pCallback->TrafficSceneStatus(tsSceneStatus,pLightStatus); } //无效场景有可能是中间状态,红灯时间不能重置。 } //如果无效场景帧数大过设定的值,则重置红绿灯框位置,红灯时间重置 if( m_iErrorSceneCount > MAX_ERROR_COUNT ) { m_iErrorSceneCount = 0; m_iLastOkLightStatus = -1; for(int i = 0; i < 4; ++i) { m_redrealtime.Reset(); m_greentick.Reset(); } if( m_tlpTrafficLightParam.iAutoScanLight == 1 ) { for(int i = 0; i <m_tlpTrafficLightParam.iLightGroupCount; ++i) { if( S_OK == m_rgLightInfo[i].ReScan() ) { HV_Trace(5, "TrafficLight ReScan ...\n"); } } } } } } *iCurrentStatus = m_iCurLightStatus; *iLastStatus = m_iLastLightStatus; return hResult; }
int main(void) { Init(); DBG_MSG("----- Power On -----"); if(USBDevice_PlugIn()) { DBG_MSG( "Usb Init Started"); USB_Init(); }else{ DBG_MSG("FileSystem_Init"); FileSystem_Init(); fileTest(); } while(true);//Stop here char color[] = {0xff, 0xff, 0x00}; WS2812_Set(0, 3, color); color[0] = 0x00; color[2] = 0xff; WS2812_Set(3, 3, color); color[0] = 0xff; color[1] = 0x00; WS2812_Set(6, 3, color); LED_RED(true); Delay_ms(200); LED_GREEN(true); Delay_ms(200); LED_BLUE(true); DBG_MSG("Temperature: %f", TMP102_GetTemp()); DBG_MSG("Temperature: %f", TMP102_GetTemp()); // WavePlayer_Init(); // WavePlayerMenu_Start("/", "teq.wav"); // WavePlayer_Start(); // Reflective_Start(); // Analog_SetChannel(PHOTOTRANS_1_CH, true); // Analog_SetChannel(PHOTOTRANS_2_CH, true); // Analog_SetChannel(PHOTOTRANS_3_CH, true); // Analog_SetChannel(PHOTOTRANS_4_CH, true); // Analog_SetChannel(PHOTOTRANS_5_CH, true); Delay_ms(2000); MPU9250_InitProcedure(); SysTick_t tick = 0; while(true) { float accel[3], gyro[3], mag[3]; float yaw, pitch, roll; if(GetSystemTick() - tick > 1000){ if(MPU9250_CheckNewSample()){ MPU9250_Get9AxisData(accel, gyro, mag); MPU9250_CalcOrientation(&yaw, &pitch, &roll); } DBG_MSG("Temperature: %f", TMP102_GetTemp()); // DBG_MSG("ADC: %d %d %d %d %d", // Analog_GetChannelValue(PHOTOTRANS_1_CH), // Analog_GetChannelValue(PHOTOTRANS_2_CH), // Analog_GetChannelValue(PHOTOTRANS_3_CH), // Analog_GetChannelValue(PHOTOTRANS_4_CH), // Analog_GetChannelValue(PHOTOTRANS_5_CH) // ); for (int i = 0; i < 3; ++i) { DBG_MSG("MPU-Accel-%c: %f", i+'X', accel[i]); } for (int i = 0; i < 3; ++i) { DBG_MSG("MPU-Gyro-%c: %f", i+'X', gyro[i]); } for (int i = 0; i < 3; ++i) { DBG_MSG("MPU-Mag-%c: %f", i+'X', mag[i]); } DBG_MSG("MPU-Temp: %f", MPU9250_GetTemperature()); DBG_MSG("yaw: %f, pitch: %f, roll: %f", yaw, pitch, roll); tick = GetSystemTick(); } } }
static bool DHT_read(void) { uint8_t laststate = 1; uint8_t counter = 0; uint8_t j = 0, i; SysTick_t currenttime; // Check if sensor was read less than two seconds ago and return early // to use last reading. currenttime = GetSystemTick(); if (currenttime < _lastreadtime) { // ie there was a rollover _lastreadtime = 0; } if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { return true; // return last correct measurement //delay(2000 - (currenttime - _lastreadtime)); } firstreading = false; /* Serial.print("Currtime: "); Serial.print(currenttime); Serial.print(" Lasttime: "); Serial.print(_lastreadtime); */ _lastreadtime = GetSystemTick(); data[0] = data[1] = data[2] = data[3] = data[4] = 0; // pull the pin high and wait 250 milliseconds // DHT_pinMode(GPIO_Mode_IPU); // Delay_ms(250); // now pull it low for ~20 milliseconds DHT_pinMode(GPIO_Mode_Out_PP); GPIO_ResetBits(DHT11_PORT, DHT11_PIN); Delay_ms(20); __disable_irq(); // GPIO_SetBits(DHT11_PORT, DHT11_PIN); // Delay_us(40); DHT_pinMode(GPIO_Mode_IPU); // uint8_t max_counter = 0, min_counter = 200; // read in timings for ( i = 0; i < MAXTIMINGS; i++) { counter = 0; while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == laststate) { counter++; Delay_us(3); if (counter == 255) { break; } } laststate = GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN); if (counter == 255) break; // ignore first 3 transitions if ((i >= 4) && ((i & 1) == 0)) { // shove each bit into the storage bytes data[j / 8] <<= 1; if (counter > 8) data[j / 8] |= 1; j++; // if(counter > max_counter) // max_counter = counter; // if(counter < min_counter) // min_counter = counter; } } __enable_irq(); // DBG_MSG("Counter: %d %d", min_counter, max_counter); /* Serial.println(j, DEC); Serial.print(data[0], HEX); Serial.print(", "); Serial.print(data[1], HEX); Serial.print(", "); Serial.print(data[2], HEX); Serial.print(", "); Serial.print(data[3], HEX); Serial.print(", "); Serial.print(data[4], HEX); Serial.print(" =? "); Serial.println(data[0] + data[1] + data[2] + data[3], HEX); */ // check we read 40 bits and that the checksum matches if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { return true; } return false; }