?? main_pre.c
字號:
/****************************************Copyright (c)**************************************************
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
void TaskStart(void *pdata);
//void Task2(void *pdata);
#define TASK_STK_SIZE 128
#define total_bit 15
#define capture_info_len 3
#define capture_info_gene 3
OS_STK TaskStartStk[TASK_STK_SIZE];
typedef struct {
INT32U irda_time[capture_info_gene];//每幀數(shù)據(jù)的間隔
INT32U irda_tc_time; //每位數(shù)據(jù)相對于TC的時間
INT16U irda_data[capture_info_gene];//一幀數(shù)據(jù)的數(shù)據(jù)碼
INT16U bit_count;//每幀數(shù)據(jù)的位計數(shù)
INT16U total_frame;
INT16U frame_use;
INT32U irda_gene;
INT32U irda_mark;
}irda_struct_t;
irda_struct_t capture_info[capture_info_len];
INT16U cap;
INT8U tm[24],*tmp;
static OS_EVENT *IRDA_Mbox;
typedef struct sla {
INT32U *next;
INT32U *prev;
INT32U cnt;
}slab_t;
INT32U rece[2];
static void Timer1Exception(void);
/*********************************************************************************************************
** 函數(shù)名稱: main
** 功能描述: c語言的主函數(shù),由它啟動多任務(wù)環(huán)境
********************************************************************************************************/
int main (void){
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
//OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 5);
OSStart();
return 0;
}
/*********************************************************************************************************
** 函數(shù)名稱: Task2
** 功能描述: μCOS-II的第2個任務(wù)。等待TaskUart0Revice接收一到幀數(shù)據(jù),
** 然后將數(shù)據(jù)進(jìn)行轉(zhuǎn)換,再從UART0發(fā)出。
** 輸 入: pdata 任務(wù)附加參數(shù)pdata = pdata;
** 輸 出: 無
********************************************************************************************************
void Task2(void *pdata){
INT8U *cpx;
INT8U px;
pdata = pdata;
while (1) {
do
{
px = 0;
cpx = &px;
UART_read(1, cpx, 1, 0);
} while (*cpx != 0xfa);
//UART_write(1, cpx, 1, 2);
cpx=(INT8U *)sectors[0].addr;
UART_write(1, cpx, iap_info.total_len, 0);
}
}
/*********************************************************************************************************
** 函數(shù)名稱: TaskStart
** 功能描述: μCOS-II的第一個任務(wù)。等待TaskUart0Revice接收一到幀數(shù)據(jù),
** 然后將數(shù)據(jù)進(jìn)行轉(zhuǎn)換,再從UART0發(fā)出。
** 輸 入: pdata 任務(wù)附加參數(shù)pdata = pdata;
** 輸 出: 無
********************************************************************************************************/
void TaskStart(void *pdata){
INT8U err,i,*cpx;
INT8U cmd_byte[4],*cmd;
slab_t slab,*slabp;
INT32U **slax,stemp;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
TargetInit();
UART_Init(0);
UART_open(0, 19200, 8, 'n', 0);
UART_Init(1);
UART_open(1, 19200, 8, 'n', 0);
slabp = &slab;
stemp = 0xfe;
slabp->next = &stemp;
slabp->cnt = 0xff00ff00;
slax = &slabp->next;
*slax =rece;
PINSEL1 |= 3<<10; //Pin0.21 used as cap1.3
T1CCR = 0X0C00; //下降沿,中斷
T1PR = 1459;
T1TC = 0;
T1CTCR = 0X0C;
T1IR = 0XFF;
T1TCR = 1;
VICVectAddr1 = (uint32)Timer1Exception;
VICVectCntl1 = (0x20 | 0x05);
VICIntEnable = 1<<5;
cap = 0;
memset(capture_info,0,sizeof(irda_struct_t)*4);
IRDA_Mbox=OSMboxCreate(NULL);
if (IRDA_Mbox == NULL) while(1);
while (1)
{
cpx = OSMboxPend(IRDA_Mbox,0,&err);
//UART_write(0, cpx, 6, 3);
if (cpx)
{
for (i=0;i<capture_info_len;i++)
{
switch(cpx[2*i+1])
{
case 0x40 : cmd_byte[i] = 0x0b; break;
case 0x80 : cmd_byte[i] = 0x0c; break;
case 0x08 : cmd_byte[i] = 0x01; break;
case 0x88 : cmd_byte[i] = 0x02; break;
case 0x48 : cmd_byte[i] = 0x03; break;
case 0xc8 : cmd_byte[i] = 0x04; break;
case 0x28 : cmd_byte[i] = 0x05; break;
case 0xa8 : cmd_byte[i] = 0x06; break;
case 0x68 : cmd_byte[i] = 0x07; break;
case 0xe8 : cmd_byte[i] = 0x08; break;
case 0x18 : cmd_byte[i] = 0x09; break;
case 0x98 : cmd_byte[i] = 0x00; break;
default : break;
}
}
cmd = cmd_byte;
if ((*cmd == 0x0c) || (*cmd == 0x0b))
{
UART_write(0, cmd_byte, 3, 3);
cmd_byte[0] = 0xff;
cmd_byte[1] = 0xff;
cmd_byte[2] = 0xff;
cmd_byte[3] = 0xff;
}
cpx = NULL;
}
}
}
/*********************************************************************************************************
** 函數(shù)名稱: Timer1Exception
** 功能描述: timer1中斷處理程序
** 輸 入: 無
** 輸 出: 無
********************************************************************************************************/
static void Timer1Exception(void)
{
irda_struct_t *ptr;
INT32U time1,time;
INT8U i;
T1IR = 1<<7;
ptr = &capture_info[cap];
time1 = OSTimeGet();
time = T1CR3;
if (ptr->bit_count == 16)
{
ptr->irda_mark = 0;
ptr->bit_count = 0;
//*tmp++ = 0xee;
//UART_write(1, tm, 20, 13);
if (ptr->total_frame == 2) //3中取1
{
ptr->frame_use=(ptr->irda_data[0]==ptr->irda_data[1])? 1: (capture_info_len+5);
ptr->frame_use=(ptr->irda_data[0]==ptr->irda_data[2])? 2: ptr->frame_use;
ptr->frame_use=(ptr->irda_data[1]==ptr->irda_data[2])? 2: ptr->frame_use;
if (ptr->frame_use > (capture_info_len-1))
{ //誤碼
ptr->total_frame = 0;
goto err;
}
cap++;
}
else
{
ptr->total_frame++;
}
if ((cap > 0) &&((capture_info[cap].irda_time[capture_info[cap].frame_use] - \
capture_info[cap-1].irda_time[capture_info[cap-1].total_frame - 1]) > 200*5))
{ //判斷連續(xù)2次按鍵時間是否超過5s,若是則忽略該組按鍵
for (i=0; i<cap; i++)
{
capture_info[i].irda_mark = 0;
capture_info[i].bit_count = 0;
capture_info[i].total_frame = 0;
}
cap = 0;
}
if (cap == capture_info_len)
{ //按鍵完畢
INT8U temp[8],*cp;
INT16U tem;
capture_info[0].irda_gene = capture_info[capture_info_len-1].irda_gene;
cp = (INT8U *)rece;
for (i=0;i<capture_info_len;i++)
{
tem = capture_info[i].irda_data[ptr->frame_use];
*cp++ = (tem & 0xff00) >> 8;
*cp++ = tem & 0x00ff;
capture_info[i].irda_mark = 0;
capture_info[i].bit_count = 0;
capture_info[i].total_frame = 0;
}
cap = 0;
OSMboxPost(IRDA_Mbox,(void *)rece);
goto err;
}
}
if (!ptr->irda_mark)
{
if (ptr->total_frame == 0)
{
ptr->irda_data[0] = 0;
ptr->irda_data[1] = 0;
ptr->irda_data[2] = 0;
}
if ((cap==0) && (ptr->total_frame==0) && (time1-ptr->irda_gene < 600))
{
goto err;
}
ptr->irda_gene = time1;
if ((ptr->total_frame>0) && (ptr->total_frame<capture_info_gene) \
&&((ptr->irda_gene - ptr->irda_time[ptr->total_frame-1]) > 40))
{ //誤觸發(fā)
ptr->total_frame = 0;
goto err;
}
if ((cap > 0)&&((ptr->irda_gene - capture_info[cap-1].irda_gene) < 80))
{ //判斷按鍵間隔
ptr->total_frame = 0;
capture_info[cap-1].irda_gene = ptr->irda_gene;
goto err;
}
ptr->irda_tc_time = time;
ptr->irda_mark = 1;
ptr->irda_time[ptr->total_frame] = ptr->irda_gene;
//tmp = tm;
//*tmp++ = 0xff;
}
else
{
INT8U x;
time1 = time;
x = time - ptr->irda_tc_time;
ptr->irda_tc_time = time1;
if ((x < 100)&&(x > 85))
{
ptr->irda_mark |= 1<<1;
//*tmp++ = x;
}
else if((x < 44)&&(x> 24))
{
ptr->irda_mark |= 1<<2;
if (ptr->bit_count != 8) ptr->bit_count=8;
//*tmp++ = x;
}
else if((x < 20)&&(x > 14))
{
ptr->irda_data[ptr->total_frame] |= 1 << (total_bit-ptr->bit_count);
ptr->bit_count++;
//*tmp++ = x;
}
else if ((x < 11) && (x>4))
{
ptr->bit_count++;
//*tmp++ = x;
}
}
err :
VICVectAddr=0x00;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -