示例#1
0
文件: Time.c 项目: Kableado/GameLib
void Time_Pause(int pausa) {
	long long tend, t, diff;

	t = Time_GetTime();
	tend = t + pausa;
	do {
		diff = tend - t;
		if (diff > 1000) {
			Sleep(diff / 1000);
		} else {
			Sleep(0);
		}
		t = Time_GetTime();
	} while (tend >= t);
}
示例#2
0
文件: Draw.c 项目: Kableado/GameLib
void Draw_LoopIterationAux() {
	Draw_LoopIteration();

	// Update time
	_procTime2 = Time_GetTime();
	_accTime += _procTime2 - _procTime1;
	_procTime1 = _procTime2;
}
示例#3
0
文件: Draw.c 项目: Kableado/GameLib
/////////////////////////////
// Draw_Loop
//
// Loops updating the game window.
void Draw_Loop(void (*proc)(void *data), void (*draw)(void *data, float f),
			   void *data) {

	_proc_func = proc;
	_draw_func = draw;
	_data = data;
	if (_draw_looping) {
		return;
	}
	_draw_looping = 1;
#ifndef EMSCRIPTEN
	long long procTime1, procTime2, drawTime1, drawTime2;
	_accTime = proc_t_frame;
	procTime1 = drawTime1 = Time_GetTime();
	while (Draw_LoopIteration()) {

		// Wait to round draw_t_frame
		drawTime2 = Time_GetTime();
		Time_Pause(draw_t_frame - (drawTime2 - drawTime1));
		drawTime2 = Time_GetTime();
		drawTime1 = drawTime2;

		// Update time
		procTime2 = Time_GetTime();
		_accTime += procTime2 - procTime1;
		procTime1 = procTime2;
	}
#else
	_accTime = proc_t_frame;
	_procTime1 = Time_GetTime();
	if (_fps <= 50) {
		emscripten_set_main_loop(Draw_LoopIterationAux, _fps, 1);
	} else {
		emscripten_set_main_loop(Draw_LoopIterationAux, 0, 1);
	}
#endif
}
示例#4
0
/*{{{  void ccsp_safe_pause_timeout (sched_t *sched)*/
void ccsp_safe_pause_timeout (sched_t *sched)
{
	unsigned int sync;
	Time now;

	#ifdef DEBUG_RTS
	fprintf(stderr, "USERPROC: ccsp_safe_pause_timeout() entered\n");
	#endif

	if (sched->tq_fptr == NULL) {
		return;
	} else if (Time_PastTimeout (sched)) {
		return;
	}

	now = Time_GetTime(sched);
	if (Time_AFTER (sched->tq_fptr->time, now)) {
		unsigned int usecs = Time_MINUS (sched->tq_fptr->time, now);

		if (usecs < min_sleep) {
			while (!(sync = att_safe_swap (&(sched->sync), 0))) {
				int i = 10;
				
				while (i--) {
					idle_cpu ();
				}

				if (Time_PastTimeout (sched)) {
					break;
				}

				serialise ();
			}

			if (sync) {
				/* restore detected flags */
				att_safe_or (&(sched->sync), sync);
			}
		} else {
			ccsp_set_next_alarm (sched, usecs);
			ccsp_safe_pause (sched);
		}
	}

	#ifdef DEBUG_RTS
	fprintf(stderr, "USERPROC: ccsp_safe_pause_timeout() about to exit (return 0)\n");
	#endif
}
示例#5
0
task Gyro()
{
	HTGYROstartCal(sensor_gyro);
	float vel_curr = 0.0;
	float vel_prev = 0.0;
	float dt = 0.0;
	int timer_gyro = 0;
	Time_ClearTimer(timer_gyro);

	while (true) {
		vel_prev = vel_curr;
		dt = (float)Time_GetTime(timer_gyro)/(float)1000.0; // msec to sec
		Time_ClearTimer(timer_gyro);
		vel_curr = (float)HTGYROreadRot(sensor_gyro);
		heading += ((float)vel_prev+(float)vel_curr)*(float)0.5*(float)dt;
		Time_Wait(1);
	}
}
示例#6
0
char write_string_to_files(uchar * data)
{
	int waitCnt=0;
	int maxWaitCnt = 100000;


	NORMALTIME time;
	uchar fileName[30];//本来只有13长度,怕越界了
	time = Time_GetTime();
	sprintf(fileName,"%02d%02d%02d%02d.txt",time.tm_year-2000,time.tm_mon,time.tm_mday,time.tm_hour);
	
	
	//①获取系统状态  
	//----------------------------------------------------------------------------
	waitCnt=0;
	while(IS_SD_BUSY)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 7;
		}
	};//先判断SD是否忙

	SD_read_system();//上电后串口第一个字节发不出去
	SD_read_system();
	//等待状态
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt = 0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 1;
		}
	};
	if((SD_cmd_return_byte & 0xCF) == 0x0D)//没有文件打开
	{
	}
	else if((SD_cmd_return_byte & 0xCF) == 0x1D)//已经有文件打开 则关闭
	{
		SD_close_file();
		while(IS_SD_BUSY);
	}
	else
	{
		return SD_cmd_return_byte;
	}

	//②创建文件
	//----------------------------------------------------------------------------
	SD_send_cmd(SD_CREATE,13,fileName);
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;
	
	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 2;
		}
	};

	while(IS_SD_BUSY);
	
	//③打开文件
	//----------------------------------------------------------------------------
	SD_send_cmd(SD_OPEN,13,fileName);
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 3;
		}
	};

	while(IS_SD_BUSY);
	
	//④写入文件
	//----------------------------------------------------------------------------
	SD_send_data(SD_WRITE,strlen(data)+4,0xffffffff,data);
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 4;
		}
	};

	while(IS_SD_BUSY);
	
	//⑤保存文件
	//---------------------------------------------------------------------------- 
	SD_save_file();//保存文件
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;
	
	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 5;
		}
	};
	while(IS_SD_BUSY);

	//⑥关闭文件
	//---------------------------------------------------------------------------- 
	SD_close_file();//关闭文件
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 6;
		}
	};
	while(IS_SD_BUSY);

	return 0;
}
示例#7
0
task PID()
{
	const float kP_up = 0.082;
	const float kI_up = 0.017;
	const float kD_up = 0.00;
	const float kP_down = 0.002;
	const float kI_down = 0.005;
	const float kD_down = 0.00;
	const float I_term_decay_rate = 0.87;
	const int I_term_threshold = 500;

	int timer_loop = 0;
	Time_ClearTimer(timer_loop);
	int dt = Time_GetTime(timer_loop);

	lift_pos = Motor_GetEncoder(encoder_lift);

	float error = 0.0;
	float error_prev = 0.0;
	float error_sum = 0.0;
	float error_rate = 0.0;

	Joystick_WaitForStart();
	Time_ClearTimer(timer_loop);

	while (true) {
		dt = Time_GetTime(timer_loop);
		Time_ClearTimer(timer_loop);
		error_prev = error;
		lift_pos = Motor_GetEncoder(encoder_lift);

		if (is_lift_manual == false) {
			if (lift_target < pos_lift_bottom) {
				lift_target = pos_lift_bottom;
			}
			if (lift_target > pos_lift_top) {
				lift_target = pos_lift_top;
			}
			error = lift_target - lift_pos;
			if (error > 0) {
				isDown = false;
			} else {
				isDown = true;
			}
			error_sum *= I_term_decay_rate;
			if (error < I_term_threshold) {
				error_sum += error * (float)dt;
			}
			error_rate = (error - error_prev) / (float)dt;

			term_P_lift = error;
			term_I_lift = error_sum;
			term_D_lift = error_rate;
			switch (isDown) {
				case true :
					term_P_lift *= kP_down;
					term_I_lift *= kI_down;
					term_D_lift *= kD_down;
					break;
				case false :
					term_P_lift *= kP_up;
					term_I_lift *= kI_up;
					term_D_lift *= kD_up;
					break;
			}
			power_lift = term_P_lift + term_I_lift + term_D_lift;
		} else {
			lift_target = lift_pos;
			power_lift = power_lift_temp;
		}
		if (abs(power_lift)<20) {
			power_lift = 0;
		}

		if (isLiftFrozen) {
			power_lift = 0;
		}

		if (isReset == false) {
			if (power_lift>0 && lift_pos>pos_lift_top) {
				power_lift = 0;
			} else if (power_lift<0 && lift_pos<pos_lift_bottom) {
				power_lift = 0;
			}
		} else {
			Motor_ResetEncoder(encoder_lift);
		}

		Motor_SetPower(power_lift, motor_lift_A);
		Motor_SetPower(power_lift, motor_lift_B);

		Time_Wait(2);
	}
}
示例#8
0
int main(void)
{		

	u16 times=0,i=0; 

	NORMALTIME cur_time; //设置RTC的时间用
	
	//Flash_Write(0x08041000,(u8 *)IndCalib,sizeof(IndCalib));

	Flash_Read(0x08041000,(u8 *)IndCalib,sizeof(IndCalib));



	delay_init();	    	 //延时函数初始化	  
  	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

	uart1_init(115200);	 //上位机通信模块
	uart2_init(9600);	 //风速传感器模块 A2 A3 要转为232
	//uart3_init(19200);	 //SD卡模块	(兼职风向-因为3有重映射功能)
	uart4_init(9600);	 //称重模块
	uart5_init(9600);	 //AD模块

 	LED_Init();			 //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
	SD_init();

	OPEN_SD_POWER;
	CLOSE_SD_POWER;
	OPEN_SD_POWER;
	CLOSE_SD_POWER;
	OPEN_SD_POWER;

	cur_time.tm_year = 2016; //2016-1900
	cur_time.tm_mon = 5;
	cur_time.tm_mday = 29;
	cur_time.tm_hour = 23;
	cur_time.tm_min = 56;
	cur_time.tm_sec = 2;

    RTC_Init(cur_time);//

	while(DS18B20_Init())//初始化DS18B20,兼检测18B20
	{
		printf("DS18B20 Check Failed!"); 
		printf("Please Check!  ");   
	}
	printf("DS18B20 Ready!     ");

 	while(1)
	{		

		if(IS_BUT_DN) 
		{
			BEEP = 0;
		}
		else
		{
			BEEP = 1;
			g_PaOffset= -g_Pa;

			g_IndValOffset[0]= -Volt2Distance(0,g_IndVal[0]);
			g_IndValOffset[1]= -Volt2Distance(1,g_IndVal[1]);
			g_IndValOffset[2]= -Volt2Distance(2,g_IndVal[2]);
			g_IndValOffset[3]= -Volt2Distance(3,g_IndVal[3]);
		}
		
		if(times%60==0) 
		{
			windSpeedDirFlag++;
			sendWindSpeedCmd(); //串口2 带232
			//printf("3\r\n");
			if(5 == windSpeedDirFlag)
			{
				windSpeedDirFlag = 0; 	
			}
			//printf("4\r\n");
			//风速的反应慢 一秒钟最多发一次指令 不然传感器要疯掉
			if(0 == windSpeedDirFlag)
			{
				uart3_init(19200);	 //SD卡模块	(兼职风向-因为3有重映射功能)
				g_uart3_used_for_SD = 1;
								//				日期			时间		  位移1, 2,   3,  4	 |拉力|                    温度 |SD|风速|风向
				sprintf(CmdStr,"#01,%02d-%02d-%02d,%02d:%02d:%02d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%1d,%04d,%04d!\r\n",
												cur_time.tm_year,cur_time.tm_mon,cur_time.tm_mday,
												cur_time.tm_hour,cur_time.tm_min,cur_time.tm_sec,
												dateSendtoPC[0],dateSendtoPC[1],dateSendtoPC[2],dateSendtoPC[3],
												dateSendtoPC[4],
												dateSendtoPC[6],dateSendtoPC[7],dateSendtoPC[8],dateSendtoPC[9],
												g_Temper,lastSDerr,g_WindSpeed,g_WindDir);
				//printf("7\r\n");
				lastSDerr = write_string_to_files(CmdStr);
			}
			else
			{
				//printf("8\r\n");
				uart3_init2(9600);
				//SD卡的usart3 重映射到 PB10 和PB11口 来读风向
				g_uart3_used_for_SD = 0;
				send_byte_to_usart3(0x02);//初始化完后第一个字节会发不成功
				sendWindDirCmd();//串口3
			}
			//printf("11\r\n");
			cur_time = Time_GetTime();
		}  

		if(times%10==0) 
		{			
			//sendWeightLoad1Cmd();
			//称重标定代码
			//printf("12\r\n");
			switch(PC_Wcmd)
			{
				case 0x30:
					//printf("13\r\n");
					BEEP = 1;
					sendWeightZeroCmd();
					BEEP = 0;
					PC_Wcmd = 0;
				break;
	
				case 0x40:
					//printf("14\r\n");
					BEEP = 1;
					sendWeightLoad1Cmd();					
					PC_Wcmd = 0;
					BEEP = 0;
				break;
				case 0x41:
					//printf("15\r\n");
					BEEP = 1;
					sendWeightLoad2Cmd(g_weightCalib[0],g_weightCalib[1]);
					PC_Wcmd = 0;
					BEEP = 0;
				break;
				default:
					//printf("16\r\n");
					//sendWeightLoad2Cmd(0x27,0x10);
					sendWeightCmd(); //串口4
				break;
			}

			BLED3=1;
			sendADCmd(); //串口5
			BLED3=0;
			dateSendtoPC[0] = g_IndVal[0];
			dateSendtoPC[1] = g_IndVal[1];
			dateSendtoPC[2] = g_IndVal[2];
			dateSendtoPC[3] = g_IndVal[3];
			dateSendtoPC[4] = g_PaOffset + g_Pa;

			dateSendtoPC[6] = g_IndValOffset[0] + Volt2Distance(0,g_IndVal[0]);
			dateSendtoPC[7] = g_IndValOffset[1] + Volt2Distance(1,g_IndVal[1]);
			dateSendtoPC[8] = g_IndValOffset[2] + Volt2Distance(2,g_IndVal[2]);
			dateSendtoPC[9] = g_IndValOffset[3] + Volt2Distance(3,g_IndVal[3]);
		}
		switch(PC_cmd)
		{
			case 1:
				BLED2 = 1;
					//				日期			时间		  位移1, 2,   3,  4	 |拉力|                    温度 |SD|风速|风向
				sprintf(CmdStr,"#01,%02d-%02d-%02d,%02d:%02d:%02d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%04d,%d,%04d,%04d!\r\n",
												cur_time.tm_year,cur_time.tm_mon,cur_time.tm_mday,
												cur_time.tm_hour,cur_time.tm_min,cur_time.tm_sec,
												dateSendtoPC[0],dateSendtoPC[1],dateSendtoPC[2],dateSendtoPC[3],
												dateSendtoPC[4],
												dateSendtoPC[6],dateSendtoPC[7],dateSendtoPC[8],dateSendtoPC[9],
												g_Temper,lastSDerr,g_WindSpeed,g_WindDir);
				send_string_to_usart1(CmdStr);
				BLED2 = 0;
				PC_cmd = 0;
			break;
			case 0x10:
			case 0x11:
			case 0x12:
			case 0x13:
			case 0x14:
				BEEP = 1;
				sprintf(CmdStr,"#%02x",PC_cmd);
				for(i=0;i<21;i++)
				{
					sprintf(CmdStr,"%s,%+05d",CmdStr,IndCalib[PC_cmd-0x10][i]);	
				}
				sprintf(CmdStr,"%s!\r\n",CmdStr);
				send_string_to_usart1(CmdStr);
				PC_cmd = 0;
				BEEP = 0;
			break;
			case 0x20:
			case 0x21:
			case 0x22:
			case 0x23:
			case 0x24:
				sprintf(CmdStr,"#%02x",PC_cmd-0x10);
				for(i=0;i<21;i++)
				{
					sprintf(CmdStr,"%s,%+05d",CmdStr,IndCalib[PC_cmd-0x20][i]);	
				}
				sprintf(CmdStr,"%s!\r\n",CmdStr);
				send_string_to_usart1(CmdStr);
				PC_cmd = 0;

			break; 		
		}
		times++;  
		delay_ms(10);  
	}	 
 }