📄 isdtask.c
字号:
#include "isdtask.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#define ISDThresholdNumber 5
const prog_uint16_t isdThreshold[ISDThresholdNumber] = {
150,
300,
500,
700,
900};
extern unsigned long currentTime;
extern unsigned char mainState;
extern unsigned char currentImpactUpdated;
extern unsigned short currentImpact;
void delayReset();
void isdReset()
{
PORTISD &= ~ISDRESET;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
PORTISD |= ISDRESET;
}
void delayDebounce()
{
unsigned long recordTime;
recordTime = currentTime;
while(currentTime-recordTime<=ISDDELAY);
}
void delayReset()
{
unsigned long recordTime;
recordTime = currentTime;
while(currentTime-recordTime<=2);
}
void isdTaskInit()
{
isdReset();
}
void isdTask()
{
unsigned char i;
unsigned short isdImpact;
unsigned short progImpact;
if(mainState!=1)
return;
if(isdBusy())
return;
if( !(currentImpactUpdated & 0x02) )
return;
//Fetch the current impact
CLI();
currentImpactUpdated &= ~0x02;
isdImpact = currentImpact;
SEI();
//Classify
progImpact = __LPM_word_enhanced__(isdThreshold);
if(isdImpact<progImpact)
return;
//reset
isdReset();
delayReset();
//Classify & forward
for(i=1;i<ISDThresholdNumber;i++)
{
progImpact = __LPM_word_enhanced__(isdThreshold+i);
if(isdImpact>progImpact)
{ //forward
while(isdBusy());
PORTISD &= ~ISDFWD;
delayDebounce();
PORTISD |= ISDFWD;
}
}
//play
while(isdBusy());
PORTISD &= ~ISDPLAY;
delayDebounce();
PORTISD |= ISDPLAY;
}
unsigned char isdBusy()
{
if (PINISD & ISDRDY)
return 0;
else
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -