一. 函数声明
mediatek\platform\mt6572\hardware\camera\hal\adapter\MtkDefault\Preview\PreviewCmdQueThread.cpp !407
+ static inline bool drawTimeStamp(MUINT8 *virAddr, MUINT32 nImgWidth);
即在PreviewCmdQueThread类中声明drawTimeStamp函数
二. 函数调用
mediatek\platform\mt6572\hardware\camera\hal\adapter\MtkDefault\Preview\PreviewCmdQueThread.cpp !1468
+drawTimeStamp((MUINT8*)(vidoNode.getImgBuf()->getVirAddr()), vidoNode.getImgBuf()->getImgWidth());
即在updateOne函数的第二个if (flag & eID_Pass2VIDO)之后,vidoNode.getImgBuf()->setTimestamp(pass1LatestTimeStamp);之前添加
三. 函数实现
/*******************************************************************************/
#include<time.h>
#include<stdio.h>
#define TIME_DIS_Y_START_LINE 5 //屏幕Y轴方向的起始点
#define TIME_DIS_START_PIXEL 36 //屏幕X轴方向的起始点
#define TIME_DIS_CHAC_WIDTH 6 //LED字一格的宽度
#define TIME_DIS_CHAC_SPACE 4 //LED字每个字符之间的间距
#define TIME_DIS_COLOR 0 //LED字的颜色,因为只有八位黑白色,所以要显示反色描边
static char time_stamp[] = "2013-10-30 14:25:00";//时间戳
static time_t utctime;//实例化time_t结构
static struct tm *loctime;//实例化tm结构指针
static MUINT8 TIME_DIS_CHAC_HIGHT = TIME_DIS_CHAC_WIDTH*2;//两部LED字格的宽度
static MUINT8 TIME_DIS_CHAC_HAFWIDTH = TIME_DIS_CHAC_WIDTH/2;//LED字格的半宽
bool PreviewCmdQueThread::drawTimeStamp(MUINT8 *virAddr, MUINT32 nImgWidth)
{
bool bResult = true;
time(&utctime);//读取现在的utc时间
loctime = localtime(&utctime);//localtime函数把从utctime换算成localtime
sprintf(time_stamp,"%04d-%02d-%02d %02d:%02d:%02d",(loctime->tm_year)+1900,(loctime->tm_mon)+1,loctime->tm_mday,loctime->tm_hour,loctime->tm_min,loctime->tm_sec);
MUINT8 *startAddr = virAddr+ nImgWidth*TIME_DIS_Y_START_LINE + TIME_DIS_START_PIXEL;
MUINT8* p = startAddr;
for(MUINT8 i = 0; i < strlen(time_stamp); i++)
{
switch(time_stamp[i])
{
case '0':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画0的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_HIGHT;count++)
{
p += nImgWidth;//移到下一行
memset(p, TIME_DIS_COLOR, 1);//画0的左边的竖线的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画竖线右边的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画0的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '1':
{
p += TIME_DIS_CHAC_HAFWIDTH;//移到1所在范围的中间位置
for(MUINT8 count = 0;count<TIME_DIS_CHAC_HIGHT;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画1的竖线中的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
}
break;
case '2':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画2的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画2的右上半部分的竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画2的中横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画2的左下竖线的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画2的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '3':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画3的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画3的右上部竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画3的中横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画3的右下部竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画3的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '4':
{
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画4的左上边的竖线的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画4右上竖线的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画4的横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画4右下竖线的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
}
break;
case '5':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画5的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画5的左上边的竖线的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画5的中横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画4右下竖线的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画5的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '6':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画6的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画6的左上边的竖线的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画6的中横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画6的左下边的竖线的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画6右下竖线的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画6的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '7':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画7的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_HIGHT;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画7的竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
}
break;
case '8':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画8的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画8的左上竖线中的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画8的右上竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画8的中横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画8的左下竖线中的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画8的右下竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画8的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '9':
{
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画9的上横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);//画9的左上竖线中的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画9的右上竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画9的中横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
for(MUINT8 count = 0;count<TIME_DIS_CHAC_WIDTH;count++)
{
p += nImgWidth;
memset(p+TIME_DIS_CHAC_WIDTH, TIME_DIS_COLOR, 1);//画9的右下竖线中的一点
memset(p+TIME_DIS_CHAC_WIDTH+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画9的下横线
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case '-':
{
p += (nImgWidth*TIME_DIS_CHAC_WIDTH);//移到中横线位置
memset(p, TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画'-'的一点
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, TIME_DIS_CHAC_WIDTH);//画反色的线
}
break;
case ':':
{
p += TIME_DIS_CHAC_HAFWIDTH;//移到Y方向中间位置
p += nImgWidth*TIME_DIS_CHAC_HAFWIDTH;//移到上半部分的中间位置
memset(p, TIME_DIS_COLOR, 1);
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
p += nImgWidth*TIME_DIS_CHAC_WIDTH;//移到下半部分的中间位置
memset(p, TIME_DIS_COLOR, 1);
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
p += nImgWidth;
memset(p, TIME_DIS_COLOR, 1);
memset(p+nImgWidth+1, ~TIME_DIS_COLOR, 1);//反色
}
break;
case ' ':
{//do nothing
}
break;
default:
{
bResult = false;//有不能显示的字符
}
break;
}
startAddr += TIME_DIS_CHAC_WIDTH + TIME_DIS_CHAC_SPACE;//起始点移到下一个字符的左上角
p = startAddr;//指针移到字符的起始点
}
return bResult;
}
/*******************************************************************************/