📄 sdtask.c
字号:
#include "sdTask.h"
#include "lcd.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
//==========Vars=================================
//Signals
unsigned char sdCardInserted;
//Queue
#define SDQUEUE_LENGTH 10 //9 records
unsigned char sdQueueFront = 0;
unsigned char sdQueueEnd = 0;
unsigned long sdQueueTime[SDQUEUE_LENGTH];
unsigned short sdQueueImpact[SDQUEUE_LENGTH];
//SDCard Interface
unsigned short sdBufferLength = 0;
extern unsigned char sdBuffer[512];
//SDCard name
//必须大写
const char filenamePrefix[] = "BOX";
const unsigned char fileIndexLength = 5;
const char filenameExt[] = "DAT";
//Error Strings
const prog_char errorInfo[4][9]={
"Unformat",
"DiskFull",
"RootFull",
"IdxFull"};
//===========================================
void sdTaskInit()
{
unsigned char ucTemp;
unsigned char strBuffer[9];
ucTemp = fatInit();
if(!ucTemp)
ucTemp = fileCreateSequential(filenamePrefix,fileIndexLength,filenameExt);
// ucTemp = 1;//test
if(!ucTemp)
{ //successful: display an arrow
lcdWriteChar(1,1,0x7C);//Line 2 col 2
sdCardInserted = 1;
}
else if(ucTemp<=4)
{
//LCD display error info
strlcpy_P (strBuffer,errorInfo[ucTemp-1],9);
lcdWriteString(0,0,8,strBuffer); //Line 1 col 0
//wait for key pressed
while(!((~PINB)&0x0F));
lcdClearScreen();
}
return;
}
void sdTask()
{
if(!sdCardInserted)
return;
//if buffer not full deque
if(sdBufferLength<512)
while(sdDeQueue((unsigned long*)(sdBuffer+sdBufferLength),(unsigned long*)(sdBuffer+sdBufferLength+4))
&& sdBufferLength<512)
sdBufferLength+=8;
if(sdBufferLength>=512)
{
sdBufferLength = 0;
if(fileWriteBuffer())
{
sdCardInserted = 0;
lcdWriteChar(1,1,' ');
}
}
}
void sdTaskFinish()
{
if(!sdCardInserted)
return;
fileClose(sdBufferLength);
sdCardInserted = 0;
}
void sdEnQueue(unsigned long *pTime, unsigned short *pImpact)
{
//check queue full
if(sdQueueFront==sdQueueEnd+1)
return;
if(sdQueueFront==0 && sdQueueEnd==SDQUEUE_LENGTH-1)
return;
//Fill item
sdQueueTime[sdQueueEnd] = *pTime;
sdQueueImpact[sdQueueEnd] = *pImpact;
//move pointer
sdQueueEnd++;
if(sdQueueEnd>=SDQUEUE_LENGTH)
sdQueueEnd = 0;
}
unsigned char sdDeQueue(unsigned long *pTime, unsigned long *pImpact)
{
if(sdQueueFront==sdQueueEnd)
return 0; //QueueEmpty
*pTime = sdQueueTime[sdQueueFront];
*pImpact = sdQueueImpact[sdQueueFront];
sdQueueFront++;
if(sdQueueFront>=SDQUEUE_LENGTH)
sdQueueFront = 0;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -