📄 osd.c
字号:
// U8 _t1_;
U8 _t2_, _t3_;
#if defined(__EN_ISR__)
// EA = 0;
#endif
// U8 _t1_;
WriteAsicByteOSD(_dvc,0x00,0xff); //... 1st pixel
WriteAsicByteOSD(_dvc,0x01,0xff); //... 2nd pixel
WriteAsicByteOSD(_dvc,0x02,0xff); //... 3rd pixel
WriteAsicByteOSD(_dvc,0x03,0xff); //... 4th pixel
//... acceleration 阑 荤侩且 版快 buffer write 苞沥 积帆啊瓷.
// WriteAsicByteOSD(_dvc,0x04,0x80); //... write to buffer
//... start position
// _pos_x <<= 2; //... (_pos_x)*4 -> 4 pixel * 4 -> 16 pixel char
_pos_y = (_pos_y<<1)+(_pos_y<<3); //... (_pos_y)*(2+8)
// WriteAsicByteOSD(_dvc,0x05,_pos_x);
WriteAsicByteOSD(_dvc,0x07,_pos_y&0xff);
//... end position
// _pos_x += _wdth<<2;
_hght = _pos_y+((_hght<<1)+(_hght<<3));
// WriteAsicByteOSD(_dvc,0x06,--_pos_x);
WriteAsicByteOSD(_dvc,0x08,(--_hght)&0xff);
// WriteAsicByteOSD(_dvc,0x09,((_pos_y>>8)<<2)+(_hght>>8)); //... odd field
// WriteAsicByteOSD(_dvc,0x0a,0xc0); //... acceleration|x path
//
// while(ReadAsicOSDMemWr(_dvc)&BIT7); //... wait finishing write for odd field
////Delay(1);
WriteAsicByteOSD(_dvc,0x09,0x02|((_pos_y>>8)<<2)+(_hght>>8)); //... ~ even field
// WriteAsicByteOSD(_dvc,0x0a,0xc0); //... acceleration|x path
//
// while(ReadAsicOSDMemWr(_dvc)&BIT7); //... wait finishing write for even field
////Delay(1);
_pos_x <<= 2;
_wdth <<= 2;
_t2_ = _wdth>>4;
_t3_ = _wdth&0x0f;
// for(_t1_=0;_t1_<=_t2_;_t1_++){
// if(_t1_<_t2_){
// WriteAsicByteOSD(0,0x05,_pos_x+(_t1_<<4));//_t1_);
// WriteAsicByteOSD(0,0x06,_pos_x+((_t1_+1)<<4));//79);
// }
// else{
// WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
// WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+(--_t3_)));//79);
// }
// WriteAsicByteOSD(0,0x0a,0xc0); //... acceleration|x path
// while(ReadAsicOSDMemWr(_dvc)&BIT7){} //... wait finishing write for even field
// }
if (_t2_ != 0) {
WriteAsicByteOSD(0,0x05,_pos_x);
WriteAsicByteOSD(0,0x06,_pos_x+(_t2_<<4));//79);
WriteAsicByteOSD(0,0x0a,0xc0); //... acceleration|x path
while(ReadAsicOSDMemWr(_dvc)&BIT7){} //... wait finishing write for even field
}
if (_t3_ != 0){
WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+_t3_-1));//79);
WriteAsicByteOSD(0,0x0a,0xc0); //... acceleration|x path
while(ReadAsicOSDMemWr(_dvc)&BIT7){} //... wait finishing write for even field
}
#if defined(__EN_ISR__)
// EA = 1;
#endif
}
//==================================================================================
void WriteOSDClrY(U8 _dvc, U8 _pos_x, U16 _pos_y, U8 _wdth, U16 _hght) //... only one _pth at once
{
// U8 _t1_;
U8 _t2_, _t3_;
#if defined(__EN_ISR__)
// EA = 0;
#endif
// U8 _t1_;
WriteAsicByteOSD(_dvc,0x00,0xff); //... 1st pixel
WriteAsicByteOSD(_dvc,0x01,0xff); //... 2nd pixel
WriteAsicByteOSD(_dvc,0x02,0xff); //... 3rd pixel
WriteAsicByteOSD(_dvc,0x03,0xff); //... 4th pixel
//... acceleration 阑 荤侩且 版快 buffer write 苞沥 积帆啊瓷.
// WriteAsicByteOSD(_dvc,0x04,0x80); //... write to buffer
//... start position
// _pos_x <<= 1; //... (_pos_x)*2 -> 8 pixel * 2 -> 16 pixel char
_pos_y = (_pos_y<<1)+(_pos_y<<3); //... (_pos_y)*(2+8)
// WriteAsicByteOSD(_dvc,0x05,_pos_x);
WriteAsicByteOSD(_dvc,0x07,_pos_y&0xff);
//... end position
// _pos_x += _wdth<<1;
_hght = _pos_y+((_hght<<1)+(_hght<<3));
// WriteAsicByteOSD(_dvc,0x06,--_pos_x);
WriteAsicByteOSD(_dvc,0x08,(--_hght)&0xff);
// WriteAsicByteOSD(_dvc,0x09,((_pos_y>>8)<<2)+(_hght>>8)); //... odd field
// WriteAsicByteOSD(_dvc,0x0a,0xe0); //... acceleration|y path
//
// while(ReadAsicOSDMemWr(_dvc)&BIT7); //... wait finishing write for odd field
////Delay(1);
WriteAsicByteOSD(_dvc,0x09,0x02|((_pos_y>>8)<<2)+(_hght>>8)); //... ~ even field
// WriteAsicByteOSD(_dvc,0x0a,0xe0); //... acceleration|y path
//
// while(ReadAsicOSDMemWr(_dvc)&BIT7); //... wait finishing write for even field
////Delay(1);
_pos_x <<= 1; //... (_pos_x)*2 -> 8 pixel * 2 -> 16 pixel char
_wdth <<= 1;
_t2_ = _wdth>>4;
_t3_ = _wdth&0x0f;
// for(_t1_=0;_t1_<=_t2_;_t1_++){
// if(_t1_<_t2_){
// WriteAsicByteOSD(0,0x05,_pos_x+(_t1_<<4));//_t1_);
// WriteAsicByteOSD(0,0x06,_pos_x+((_t1_+1)<<4));//79);
// }
// else{
// WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
// WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+(--_t3_)));//79);
// }
// WriteAsicByteOSD(0,0x0a,0xe0); //... acceleration|y path
// while(ReadAsicOSDMemWr(_dvc)&BIT7){} //... wait finishing write for even field
// }
if (_t2_ != 0) {
WriteAsicByteOSD(0,0x05,_pos_x);
WriteAsicByteOSD(0,0x06,_pos_x+(_t2_<<4));//79);
WriteAsicByteOSD(0,0x0a,0xe0); //... acceleration|y path
while(ReadAsicOSDMemWr(_dvc)&BIT7){} //... wait finishing write for even field
}
if (_t3_ != 0){
WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+_t3_-1));//79);
WriteAsicByteOSD(0,0x0a,0xe0); //... acceleration|y path
while(ReadAsicOSDMemWr(_dvc)&BIT7){} //... wait finishing write for even field
}
#if defined(__EN_ISR__)
// EA = 1;
#endif
}
//==================================================================================
void WriteOSDClr(U8 _pth, U8 _dvc, U8 _pos_x, U16 _pos_y, U8 _wdth, U16 _hght) //... 16x20 font 扁霖.
{
if(BitSet(_pth,PTH_X)) WriteOSDClrX(_dvc,_pos_x,_pos_y,_wdth,_hght);
if(BitSet(_pth,PTH_Y)) WriteOSDClrY(_dvc,_pos_x,_pos_y,_wdth,_hght);
}
//==================================================================================
/*
U8 DsplyOSDDatHexX(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
U8 _rdat_;
// U8 _pg=0, _addr=0;
U8 _t3_;
// _pg = _addr>>16;
// _addr = _addr&0xff;
if(_pg == 0xff) _rdat_ = _addr;
// else if((_dvc == TW9901)||(_dvc == SAA7121)) _rdat_ = ReadI2CByte(_dvc,_addr);
// else if(_dvc == TW9901) _rdat_ = ReadI2CByte(_dvc,_addr);
else _rdat_ = ReadAsicByte(_dvc,_pg,_addr);
for(_t3_=0;_t3_<2;_t3_++){
_pg = _rdat_&(0x0f<<(_t3_<<2));
_pg >>= _t3_<<2;
if(_pg < 0x0a) _addr = 0x10;//0x30;
else _addr = 0x17;//0x37;
// if(_size < 2) WriteOSDFntX(MASTER,_pos_x,_pos_y,0x00,_pg+_addr); // _size(1: bit[3-0]) -> __pos_x_
// else WriteAsic1Font(MASTER,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr); // _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
WriteOSDFntX(_dvc,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr); // _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
}
return _rdat_;
}
// */
//==================================================================================
U8 DsplyOSDDatHexY(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
U8 _rdat_;
// U8 _pg=0, _addr=0;
U8 _t3_;
// _pg = _addr>>16;
// _addr = _addr&0xff;
if(_pg == 0xff) _rdat_ = _addr;
// else if((_dvc == TW9901)||(_dvc == SAA7121)) _rdat_ = ReadI2CByte(_dvc,_addr);
// else if(_dvc == TW9901) _rdat_ = ReadI2CByte(_dvc,_addr);
else _rdat_ = ReadAsicByte(_dvc,_pg,_addr);
for(_t3_=0;_t3_<2;_t3_++){
_pg = _rdat_&(0x0f<<(_t3_<<2));
_pg >>= _t3_<<2;
if(_pg < 0x0a) _addr = 0x10;//0x30;
else _addr = 0x17;//0x37;
// if(_size < 2) WriteOSDFntX(MASTER,_pos_x,_pos_y,0x00,_pg+_addr); // _size(1: bit[3-0]) -> __pos_x_
// else WriteAsic1Font(MASTER,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr); // _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
WriteOSDFntY(_dvc,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr); // _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
}
return _rdat_;
}
//==================================================================================
/*
U8 DsplyOSDDatBinX(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
U8 _rdat_;
// U8 _pg,_addr=0;
// _pg = _addr>>16;
// _addr = _addr&0xff;
if(_pg == 0xff) _rdat_ = _addr;
// else if((_dvc == TW9901)||(_dvc == SAA7121)) _rdat_ = ReadI2CByte(_dvc,_addr);
// else if(_dvc == TW9901) _rdat_ = ReadI2CByte(_dvc,_addr);
else _rdat_ = ReadAsicByte(_dvc,_pg,_addr);
for(_pg=0;_pg<8;_pg++){
if(BitSet(_rdat_,BIT7>>_pg)) _addr = 0x11;
else _addr = 0x10;
WriteOSDFntX(_dvc,_pos_x+_pg,_pos_y,0x00,_addr);
}
return _rdat_;
}
//==================================================================================
U8 DsplyOSDDatBinY(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
U8 _rdat_;
// U8 _pg,_addr=0;
// _pg = _addr>>16;
// _addr = _addr&0xff;
if(_pg == 0xff) _rdat_ = _addr;
// else if((_dvc == TW9901)||(_dvc == SAA7121)) _rdat_ = ReadI2CByte(_dvc,_addr);
// else if(_dvc == TW9901) _rdat_ = ReadI2CByte(_dvc,_addr);
else _rdat_ = ReadAsicByte(_dvc,_pg,_addr);
for(_pg=0;_pg<8;_pg++){
if(BitSet(_rdat_,BIT7>>_pg)) _addr = 0x11;
else _addr = 0x10;
WriteOSDFntY(_dvc,_pos_x+_pg,_pos_y,0x00,_addr);
}
return _rdat_;
}
// */
//==================================================================================
void SetOSDCol(U8 _pth, U8 _col_num, U8 _y, U8 _cb, U8 _cr)
{
WriteAsicByte(MASTER,DVC_PG2,0x0b,_y); //... Y
WriteAsicByte(MASTER,DVC_PG2,0x0c,_cb); //... Cb
WriteAsicByte(MASTER,DVC_PG2,0x0d,_cr); //... Cr
if(BitSet(_pth,PTH_X))
WriteAsicByte(MASTER,DVC_PG2,0x0e,BIT7|_col_num); //... address
else
WriteAsicByte(MASTER,DVC_PG2,0x0e,BIT7|BIT6|_col_num); //... address
}
//==================================================================================
void InitOSDCol(void)
{
SetOSDCol(PTH_Y,OSD_COL_BLK,0x00,0x80,0x80);
SetOSDCol(PTH_Y,OSD_COL_50WHT,0x7f,0x80,0x80);
SetOSDCol(PTH_Y,OSD_COL_75WHT,0xc0,0x80,0x80);
SetOSDCol(PTH_X,OSD_COL_BLK,0x00,0x80,0x80);
SetOSDCol(PTH_X,OSD_COL_50WHT,0x7f,0x80,0x80);
SetOSDCol(PTH_X,OSD_COL_75WHT,0xc0,0x80,0x80);
SetOSDCol(PTH_X,OSD_COL_25WHT,0x3f,0x80,0x80);
SetOSDCol(PTH_X,OSD_COL_100WHT,0xf0,0x80,0x80);
SetOSDCol(PTH_X,OSD_COL_BLU,0x1d,0xff,0x6b);
SetOSDCol(PTH_X,OSD_COL_RED,0x4c,0x54,0xff);
SetOSDCol(PTH_X,OSD_COL_ORNG,0x95,0x4f,0xb5);
SetOSDCol(PTH_X,OSD_COL_CYN,0xb2,0xaa,0x00);
SetOSDCol(PTH_X,OSD_COL_MGN,0x69,0xd4,0xea);
SetOSDCol(PTH_X,OSD_COL_GRN,0x4b,0x55,0x4a);
SetOSDCol(PTH_X,OSD_COL_OCN,0x61,0xb5,0x3a);
SetOSDCol(PTH_X,OSD_COL_YLW,0xe1,0x00,0x94);
}
//==================================================================================
void SetOSDMn(void)
{
//// WriteAsicByte(MASTER,DVC_PG2,0x38,0x0f); //... OSD overlay : inverse OSD path with OSD overlay function
// WriteAsicByte(MASTER,DVC_PG2,0x38,0x0c); //... overlay Y path OSD on X path //... 060307:temporal
// if(b_mse_stts_pth == MSE_PTH_X)
// WriteAsicByte(MASTER,DVC_PG2,0x38,0x09); //... overlay Y path OSD on X path with high priority than X path
// else
// WriteAsicByte(MASTER,DVC_PG2,0x38,0x06); //... overlay X path OSD on Y path with low priority than Y path
WriteOSDClrX(MASTER,0,0,45,31); //... max line num is 310 line for OSD
#if defined(__4CH__)
if(wndw_ds_sc_fmt == SC_FMT_8CH)
WriteOSDClrY(MASTER,WNDW_DS_SC_CNT_X,WNDW_DS_SC_CNT_Y,11,1);
#endif
WriteAsicByte(MASTER,DVC_PG2,0x38,0x09); //... overlay Y path OSD on X path with high priority than X path
}
//==================================================================================
void SetOSDNoMn(void)
{
if(wndw_ds_sc_fmt == SC_FMT_4CH){
// WriteAsicByte(MASTER,DVC_PG2,0x38,0x00); //... OSD overlay : default
WriteAsicByte(MASTER,DVC_PG2,0x38,0x08); //... overlay Y path OSD on X path with high priority than X path
GetAsicFlgType(MASTER,DVC_PG1,0x7c,0x0f); //... user must read 0x7c to release IRQ line. ***********************
}
#if defined(__4CH__)
else if(wndw_ds_sc_fmt == SC_FMT_8CH){
Run8ChOSDRto();
}
#endif
}
//==================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -