class//BkNits

對於亮度指定量測的背景,在這設計了自動追縱。
電腦只知道0~255的背景色,儀器知道這樣的背景色是多少ntis(亮度單位),我們可以指定我們要多少量nits的亮度,讓電腦調整背景色,並且同時量測,就可以做到自動調整。
在此追縱亮度量測的規格,會制定兩種
  1. 接近該亮度,未滿該亮度
  2. 接近該亮度,超過該亮度
以20nits為例:
  1. 就是19.9、19.8、19.7...的量測最大值
  2. 就是20.1、20.2、20.3...的量測最小值
因為背景色並不能精準的指定發光的亮度值,只能找一個近似的值,而這個近似值就有大於和小於兩種,但是都是找最接近的。

BkNits.h

#ifndef BKNITS_H
#define BKNITS_H

#include "BkMaker.h"

class BkNits : public BkMaker
{
    //m_pCA210
    void n2cPos(ColorRef&);
    void n2cNeg(ColorRef&);
public:
     BkNits(const NitsDirect&);
    BkNits(const BkNits& bkN);

    void NT_SetWnd(CWnd* cWnd){ m_pdlgcWnd = cWnd; };
    void NT_SetCa(Ca210* pCa){ m_pCa210 = pCa; };

    void NT_colorReviseByNits(ColorRef&);

    void NT_SetNitsLv(const int&);
    const int  NT_GetNitsLv()const;

};

#endif

BkNits.cpp

如何自動追縱亮度的實作?

在此若不設計自動追縱,而是靠手動追縱的話,還是一次使用兩個IO設備,不是Probe+Mouse就是Probe+Keyboard,不管哪一種組合都會降低人類操作的愉悅程度 以及增加手忙腳亂的程度。(我曾經是苦主)
所以,設計了自動追縱,但是,在程式碼的介面設計上,也是有用心著墨。
  • 可設定目標nits值,要追縱到什麼ntis就寫入什麼值。
  • 初始化時,立即設定要指定值以上,還是以下。
追縱的兩個函數,內容不一樣,初始化的背景值是hard coding每次都一樣。
要注意的是,兩個迴圈的累加計數不一樣。

BkNits::BkNits(const NitsDirect& nt)
{
    BkMaker::BkMaker();
    m_NitsDirect = nt;
};

void BkNits::NT_SetNitsLv(const int& _N)
{ m_NitsLv = _N*100; };

inline void BkNits::NT_colorReviseByNits(ColorRef& Bkclr)
{
    switch(m_NitsDirect)
    {
    case ND_Pos: n2cPos(Bkclr); break;
    case ND_Neg: n2cNeg(Bkclr); break;
    default:     ASSERT(0);
    }
};

void BkNits::n2cPos(ColorRef& Bkclr)
{
    int _gl= 60;
    int fLv = 100*100;
    while(fLv > m_NitsLv)  //若亮度還沒有到xx以下,就減少
    {
        _gl -= 2;
        Bkclr.iGray(_gl);
        m_pdlgcWnd->Invalidate();
        m_pdlgcWnd->UpdateWindow();
        //量測抓值
        if (m_pCa210->Measure() == CA_ZeroCalMode)
            AfxMessageBox("警告:Probe請轉到MEAS");
        fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
    }
    
    while(fLv < m_NitsLv)   //若亮度還在xx以下,就...變亮
    {
        ++_gl;
        Bkclr.iGray(_gl);
        m_pdlgcWnd->Invalidate();
        m_pdlgcWnd->UpdateWindow();
        Sleep(60);
        //抓值
        m_pCa210->Measure();
        fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
    }
    _SetBkColor(Bkclr);
}

void BkNits::n2cNeg(ColorRef& Bkclr)
{
    int fLv = 0;
    int _gl = 55;
    
    while(fLv < m_NitsLv)  //若亮度還沒有到xx以下,就減少
    {
        _gl += 2;
        Bkclr.iGray(_gl);
        m_pdlgcWnd->Invalidate();
        m_pdlgcWnd->UpdateWindow();
        //抓值
        if (m_pCa210->Measure() == CA_ZeroCalMode)
            AfxMessageBox("警告:Probe請轉到MEAS");
        fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
    }
    
    while(fLv > m_NitsLv)   //若亮度還在xx以下,就...變亮
    {
        --_gl;
        Bkclr.iGray(_gl);
        m_pdlgcWnd->Invalidate();
        m_pdlgcWnd->UpdateWindow();
        Sleep(60);
        //量測抓值
        m_pCa210->Measure();
        fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
    }
    _SetBkColor(Bkclr);
}

沒有留言:

張貼留言

文章分類維度