Beispiel #1
0
/*
 * 毫秒级延时,误差±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);
	}
}
Beispiel #4
0
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();
}
Beispiel #6
0
// 注:仅支持单板模式
// 必须打开单板模式编译宏“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;
}
Beispiel #8
0
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();
		}
	}
}
Beispiel #9
0
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;

}