⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tp.c

📁 关于日本最著名的实时系统T-KERNEL的平台下的AD键盘实现源码
💻 C
字号:
/*""FILE COMMENT""*************************************************************
*       System Name : RENESAS T-Engine, micro T-Engine series
*       File Name   : tp.c
*       Version     : 1.00.00
*       Contents    : Touch Panel
*       Model       : T-Engine/SH7727
*       CPU         : SH7727
*       Compiler    : GNU
*       OS          : T-Kernel
*       note        : The Software is being delivered to you "AS IS" 
*                   : and Renesas,whether explicitly or implicitly makes  
*                   : no warranty as to its Use or performance. 
*                   : RENESAS AND ITS SUPPLIER DO NOT AND CANNOT WARRANT 
*                   : THE PERFORMANCE OR RESULTS YOU MAY OBTAIN  BY USING 
*                   : THE SOFTWARE. AS TO ANY MATTER INCLUDING WITHOUT 
*                   : LIMITATION NONINFRINGEMENT OF THIRD PARTY RIGHTS,
*                   : MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, 
*                   : OR FITNESS FOR ANY PARTICULAR PURPOSE.
*
*       Copyright (c) 2006 RENESAS TECHNOLOGY CORP. All Rights Reserved.
*       AND RENESAS SOLUTIONS CORP. All Rights Reserved.
*       history   : 2006.07.28 ver1.00.00
*""FILE COMMENT END""*********************************************************/
#include <machine.h>
#include <tk/tkernel.h>
#include "tp.h"
#include "sample_main.h"
#include <sys/svc/h8io_svc.h>
#include <device/screen.h>
#include <sys/svc/dp_svc.h>

/* MessageBuffer ID */
LOCAL	ID	mbfid;

/* interrupt enable/disable flag */
BOOL	int_flg;

ID	tp_init(void)
{
	T_CMBF	cmbf;

	writeREG(TPLCR, 1, TP_CR_STR | TP_CR_ONI | TP_CR_OFFI);
	
	cmbf.exinf = NULL;
	cmbf.mbfatr = TA_TFIFO;
	cmbf.bufsz = PD_BUFSZ;
	cmbf.maxmsz = PD_MAXMSZ;
	
	mbfid = tk_cre_mbf (&cmbf);
	tp_ena_int();
	
	writeREG(TPLSCR,1,TP_20MS);
	
	return	mbfid;
}

ER	tp_calibration(void)
{
	UH	onoff,i;
	UH	dxa = 230,dya = 310;
	UH	dxb = 10,dyb = 10;
	UH	txa,tya;
	UH	txb,tyb;
	float	dx,dy,x,y;
	POS	pos;
	ER	ercd;
	
	LCD_RECT	rect;
	
	writeREG(XAPDR, 2, 230); /* A(X,Y)=(230,310) */
	writeREG(YAPDR, 2, 310);
	writeREG(XBPDR, 2, 10); /* B(X,Y)=(10,10) */
	writeREG(YBPDR, 2, 10);
	
	lcd_disp_clear(0xffff); /* WHITE */
	
	rect.Left_top.x = 230;
	rect.Left_top.y = 300;
	rect.Right_bottom.x = 231;
	rect.Right_bottom.y = 319;
	rect.Color = 0x0000; /* BLACK */
	lcd_rect_write( &rect );

	rect.Left_top.x = 220;
	rect.Left_top.y = 310;
	rect.Right_bottom.x = 239;
	rect.Right_bottom.y = 311;
	rect.Color = 0x0000; /* BLACK */
	lcd_rect_write( &rect );


	for(i=0;i<10;i++){ /* position A */
		ercd = tp_tch_pen(&onoff, &pos, TMO_FEVR);
		if(ercd==E_OK){
			if(onoff == TPON){
				txa = readREG(XPAR ,2);
				tya = readREG(YPAR ,2);
				writeREG(XAPAR,2,txa);
				writeREG(YAPAR,2,tya);
				break;
			}
		}
	}
	if(i >= 10){
		return	E_PAR;
	}
	
	lcd_disp_clear(0xffff); /* WHITE */
	
	rect.Left_top.x = 10;
	rect.Left_top.y = 0;
	rect.Right_bottom.x = 11;
	rect.Right_bottom.y = 20;
	rect.Color = 0x0000; /* BLACK */
	lcd_rect_write( &rect );

	rect.Left_top.x = 0;
	rect.Left_top.y = 10;
	rect.Right_bottom.x = 20;
	rect.Right_bottom.y = 11;
	rect.Color = 0x0000; /* BLACK */
	lcd_rect_write( &rect );

	for(i=0;i<10;i++){ /* position B */
		ercd = tp_tch_pen(&onoff, &pos, TMO_FEVR);
		if(ercd==E_OK){
			if(onoff == TPON){
				txb = readREG(XPAR ,2);
				tyb = readREG(YPAR ,2);
				writeREG(XBPAR,2,txb);
				writeREG(YBPAR,2,tyb);
				break;
			}
		}
	}
	if(i >= 10){
		return	E_PAR;
	}

	lcd_disp_clear(0xffff); /* WHITE */

	if(!(txa<txb && dxa>dxb)) {
		return E_PAR;
	}

	if(!(tya<tyb && dya>dyb)) {
		return E_PAR;
	}

	dx = (float)(dxa-dxb)/(float)(txb-txa);
	dy = (float)(dya-dyb)/(float)(tyb-tya);
	
	x = (float)(dx * 1000.0)+0.5;
	y = (float)(dy * 1000.0)+0.5;
	
	writeREG(DXDR, 2, (W)x);
	writeREG(DYDR, 2, (W)y);

	return	E_OK;
}

ER	tp_tch_pen(UH *onoff,POS *pos,TMO tmout)
{
	ER	ercd;
	PdEvt	pdevt;

	ercd = tk_rcv_mbf(mbfid, &pdevt, tmout);
	*onoff = pdevt.stat;
	*pos = pdevt.pos;

	if(ercd>0){
		return	E_OK;
	}
	else{
		return	ercd;
	}
}

void	tp_ena_int(void)
{
	UINT	imask;
	
	DI(imask);
	int_flg = TRUE;
	EI(imask);
}

void	tp_dis_int(void)
{
	UINT	imask;
	
	DI(imask);
	int_flg = FALSE;
	EI(imask);
}

ER	tp_set_cyctime(UB time)
{
	INT	i,cnt = 0;
	UB	timemsk = 0x01;
	
	if(time == 0)	return	E_PAR;
	
	for(i=0;i<8;i++){
		if(time & timemsk){
			cnt++;
			if(cnt>1){
				return	E_PAR;
			}
		}
		timemsk = timemsk << 1;
	}
	writeREG(TPLSCR, 1, time);		/* set sampling interval */

	return	E_OK;
}

void	tp_inthdr(UINT dintno)
{
	UB	reg_tpsr;
	PdEvt	evt;


	reg_tpsr = readREG(TPLSR, 1);

	if(reg_tpsr & 0x04){	/* OFF */
		evt.stat = TPOFF;
		writeREG(TPLSR, 1, reg_tpsr & ~TP_sr_OFFIF);
	}
	else {					/* ON */
		evt.stat = TPON;
		writeREG(TPLSR, 1, reg_tpsr & ~TP_sr_ONIF);
	}

	if(int_flg){
		evt.h.evttyp = TDE_PDBUT;
		evt.pos.x = readREG(XPDR, 2);
		evt.pos.y = readREG(YPDR, 2);
		tk_snd_mbf(mbfid, &evt, PD_MAXMSZ,TMO_POL);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -