2012-12-20 35 views
2

我有一个Logitech LCD SDK的问题。一切正常,但两件简单的事情不起作用。首先,我无法获得进度条的工作。我每秒更新一次进度栏的值,并更新屏幕。什么都没有发生。我已经测试了从0到100和从0到1的值,没有不同。Logitech液晶SDk(C++)

第二个问题是VS2012中的图像。我无法在C++ Dll中加载图像。 下面的代码是我的Logitech类,其中包含屏幕的所有数据。 完整的数据来源于BitBucket

我希望有人能帮助我吗?

编辑:问题出在进度条上。其余所有工作的代码例如。它吸引了罗技液晶显示屏上的所有内容,甚至是进度条,时间......但真正的问题在于进度条的进度。这个酒吧背景完美,但进度条不移动,似乎已经固定在15%左右的进度。通常情况下,进度必须与音乐时间相关联,例如,如果音乐文件为3分钟,则意味着180秒必须以100%进度进行传播。但这不起作用!

//----------------------------------------------------------------- 
// Logitech File 
// C++ Source - Logitech.cpp - version 2012 v1.0 
//----------------------------------------------------------------- 

//----------------------------------------------------------------- 
// Include Files 
//----------------------------------------------------------------- 
#include "stdafx.h" 
#include "Logitech.h" 

//----------------------------------------------------------------- 
// Logitech methods 
//----------------------------------------------------------------- 

//This LogitechObject is a instance of the Logitech class for using in the thread 
Logitech * Logitech::LogitechObject; 

Logitech::Logitech(): stopthread(false), firstTime(true), position(0), duration(0) 
{ 
    LogitechObject = this; 
} 

Logitech::~Logitech() 
{ 
    stopthread = true; 
    this->state = StatePlay::Undefined; 
    timerThread.detach(); 
} 

bool Logitech::getFirstTime() 
{ 
    return firstTime; 
} 

//Initialise Logitech LCD 
BOOL Logitech::OnInitDialog() 
{ 
    HRESULT hRes = m_lcd.Initialize(_T("MusicBee"), LG_DUAL_MODE, FALSE, TRUE); 

    if (hRes != S_OK) 
    { 
     return FALSE; 
    } 

    //Create home screen Logitech Color LCD 
    if(m_lcd.IsDeviceAvailable(LG_COLOR)) 
    { 
     m_lcd.ModifyDisplay(LG_COLOR); 
     logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_BW_BMP_WIDTH); 
     m_lcd.SetOrigin(logo, 0, 50); 
     m_lcd.SetText(logo, _T("MusicBee")); 
     m_lcd.Update(); 
    } 

    //Create home screen Logitech Monochrome LCD 
    else if(m_lcd.IsDeviceAvailable(LG_MONOCHROME)) 
    { 
     m_lcd.ModifyDisplay(LG_MONOCHROME); 
     logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_BW_BMP_WIDTH); 
     m_lcd.SetOrigin(logo, 0, 5); 
     m_lcd.SetText(logo, _T("MusicBee")); 
     m_lcd.Update(); 
    } 

    //Start thread 
    timerThread = thread(&Logitech::startThread); 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

//Create playing screen for Logitech Monochrome LCD 
VOID Logitech::createMonochrome() 
{ 
    m_lcd.RemovePage(0); 
    m_lcd.AddNewPage(); 
    m_lcd.ShowPage(0); 

    if (logo != 0) 
    { 
     delete logo; 
     logo = 0; 
    } 

    artist = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_BW_BMP_WIDTH); 
    m_lcd.SetOrigin(artist, 0, 0); 

    title = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_BW_BMP_WIDTH); 
    m_lcd.SetOrigin(title, 0, 13); 

    progressbar = m_lcd.AddProgressBar(LG_FILLED); 
    m_lcd.SetProgressBarSize(progressbar, 136, 5); 
    m_lcd.SetOrigin(progressbar, 12, 38); 

    time = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80); 
    m_lcd.SetOrigin(time, 12, 29); 

    time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80); 
    m_lcd.SetOrigin(time1, 125, 29); 

    /* playIcon = static_cast<HICON>(LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_PNG2), IMAGE_BITMAP, 16, 16, LR_MONOCHROME)); 
    playIconHandle = m_lcd.AddIcon(playIcon, 16, 16); 
    m_lcd.SetOrigin(playIconHandle, 2, 29);*/ 

    firstTime = false; 
    changeArtistTitle(this->artistString, this->albumString, this->titleString, this->durationString, this->position); 
} 

//Create playing screen for Logitech Color LCD 
VOID Logitech::createColor() 
{ 
    m_lcd.RemovePage(0); 
    m_lcd.AddNewPage(); 
    m_lcd.ShowPage(0); 

    if (logo != 0) 
    { 
     delete logo; 
     logo = 0; 
    } 

    artist = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, 320); 
    m_lcd.SetOrigin(artist, 5, 5); 

    album = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, 320); 
    m_lcd.SetOrigin(album, 5, 30); 

    title = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, 320); 
    m_lcd.SetOrigin(title, 5, 55); 

    time = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80); 
    m_lcd.SetOrigin(time, 5, 80); 

    time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80); 
    m_lcd.SetOrigin(time1, 275, 80); 

    progressbar = m_lcd.AddProgressBar(LG_DOT_CURSOR);//320×240 pixel color screen 
    m_lcd.SetProgressBarSize(progressbar, 310, 15); 
    m_lcd.SetOrigin(progressbar, 5, 100); 

    time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80); 
    m_lcd.SetOrigin(time1, 275, 80); 

    /*playIcon = static_cast<HICON>(LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PNG1), IMAGE_ICON, 16, 16, LR_COLOR)); 
    playIconHandle = m_lcd.AddIcon(playIcon, 16, 16); 
    m_lcd.SetOrigin(playIconHandle, 5, 29);*/ 

    firstTime = false; 
    changeArtistTitle(this->artistString, this->albumString, this->titleString, this->durationString, this->position); 
} 

void Logitech::startThread() 
{ 
    while(!LogitechObject->stopthread) 
    { 
     this_thread::sleep_for(chrono::milliseconds(500)); 

     if(!LogitechObject->stopthread && LogitechObject->progressbar != NULL) 
     { 
      //Update progressbar and position time on the screen after 1 second of music. 
      if(LogitechObject->state == StatePlay::Playing) 
      { 
       this_thread::sleep_for(chrono::milliseconds(500)); 
       LogitechObject->position++; 

       LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, static_cast<FLOAT>(((float)LogitechObject->position/LogitechObject->duration)*100)); 
       LogitechObject->m_lcd.SetText(LogitechObject->time, LogitechObject->getPositionString().c_str()); 
      } 

      //If music stopped then the progressbar and time must stop immediately 
      else if(LogitechObject->state == StatePlay::Stopped) 
      { 
       LogitechObject->position = 0; 
       LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 0); 
       LogitechObject->m_lcd.SetText(LogitechObject->time, LogitechObject->getPositionString().c_str()); 
      } 

      LogitechObject->m_lcd.Update(); 
     } 
    } 
} 

void Logitech::changeArtistTitle(wstring artistStr, wstring albumStr, wstring titleStr, wstring duration, int position) 
{ 
    this->artistString = artistStr; 
    this->albumString = albumStr; 
    this->titleString = titleStr; 
    this->durationString = duration; 
    this->position = position; 
    this->duration = getDuration(duration); 

    if(!firstTime) 
    { 
     if(m_lcd.IsDeviceAvailable(LG_COLOR)) 
     { 
      m_lcd.SetText(album, albumStr.c_str()); 
     } 


     m_lcd.SetText(artist, artistStr.c_str()); 
     m_lcd.SetText(title, titleStr.c_str()); 
     m_lcd.SetText(time, getPositionString().c_str()); 

     string s(duration.begin(), duration.end()); 

     if(s.size() < 5) 
     { 
      s = "0" + s; 
     } 

     wstring ws(s.begin(), s.end()); 

     m_lcd.SetText(time1, ws.c_str()); 
     ws.clear(); 

     ///*playIcon = static_cast<HICON>(LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PNG1), IMAGE_ICON, 16, 16, LR_COLOR)); 
     //playIconHandle = m_lcd.AddIcon(playIcon, 16, 16); 
     //m_lcd.SetOrigin(playIconHandle, 5, 29);*/ 

     m_lcd.Update(); 
     artistStr.clear(); 
     albumStr.clear(); 
     titleStr.clear(); 
     duration.clear(); 
    } 
} 

//Set current playing position 
void Logitech::setPosition(int pos) 
{ 
    this->position = pos/1000; 
    m_lcd.SetText(time, getPositionString().c_str()); 
    m_lcd.Update(); 
} 

//Change play state of the current playing song 
void Logitech::changeState(StatePlay state) 
{ 
    this->state = state; 

    if(state == StatePlay::Playing && firstTime) 
    { 
     if(m_lcd.IsDeviceAvailable(LG_COLOR)) 
     { 
      createColor(); 
     } 

     else if(m_lcd.IsDeviceAvailable(LG_MONOCHROME)) 
     { 
      createMonochrome(); 
     } 
    } 
} 

//Gets the music duration 
int Logitech::getDuration(wstring duration) 
{ 
    string s(duration.begin(), duration.end()); 

    int position = s.find(":"); 
    string minutes = s.substr(0, s.size() -position); 
    string seconds = s.substr(position); 
    int minutesInt = atoi(minutes.c_str()); 
    int secondsInt = atoi(seconds.c_str()); 

    return (minutesInt *60) + secondsInt; 
} 

//Change current position in string 
wstring Logitech::getPositionString() 
{ 
    string minutes = to_string((int)position /60); 
    string seconds = to_string((int)position%60); 

    if(minutes.size() < 2) 
    { 
     minutes = "0" + minutes; 
    } 

    if(seconds.size() < 2) 
    { 
     seconds = "0" + seconds; 
    } 

    string time = minutes + ":" + seconds; 

    return wstring(time.begin(), time.end()); 
} 
+0

你发布的内容并不会给任何人太多的帮助。你说“一切正常,但两件简单的事情不起作用”,但不清楚它的作用是什么“一切”。你有什么可以在显示屏上打印吗?您的进度条是否第一次打印,但不是随后打印?如果您需要帮助,您需要更好地解释问题。 – phonetagger

+0

更好地解释了我的问题(请参阅编辑的第一篇文章) –

+0

你的代码中有几个地方像'if(object-> state == 7)',但没有解释'7'是什么意思。添加一个描述英文有效状态的枚举,并使'object-> state'成为枚举类型。然后,或者将'object'重命名为有意义的东西,或者在注释中描述'object'是什么。相应地在您的文章中编辑代码,然后再看一下。而且,如果通过枚举名称不清楚,我很好奇Logitech :: startThread()为什么'object-> state == 3'有额外的半秒睡眠,而'object-> state == 7'不。一般来说,添加评论。 – phonetagger

回答

2

在您试图找出代码出现问题之前,您应该验证SDK是否按预期运行。

请您Logitech::startThread()的顶部添加以下代码,让我知道会发生什么:

LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST SEQUENCE"); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 0%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 0); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 10%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 10); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 20%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 20); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 30%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 30); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 40%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 40); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 50%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 50); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 60%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 60); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 70%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 70); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 80%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 80); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 90%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 90); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST 100%"); 
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 100); 
this_thread::sleep_for(chrono::milliseconds(2000)); 
LogitechObject->m_lcd.SetText(LogitechObject->time, "ProgressBar TEST COMPLETE"); 
this_thread::sleep_for(chrono::milliseconds(2000)); 

理想的情况下,将设置进度条到每个百分比两秒钟的时间,让你来验证进度条按照您的预期运行。如果这不起作用,试图找出你自己的代码有什么问题没有多大意义;无论是某些SDK的错误,还是对其控制参数的理解都不符合SDK的要求。

让我知道你的结果。

+0

Tnx为您提供帮助。我们发现了这个问题。感谢您的测试代码,我们已将问题追踪到Logitech SDK中的文件。问题现在已解决。 –

+0

@TestJef - 太棒了!那么,实际问题是什么? – phonetagger

+0

Logitech SDK中SetProgressBarPosition的一些代码在注释中。我们已经取消了该代码的注释,现在它可以工作。 –