Logitech LCD SDk (C++)
Logitech LCD SDk (C++)
我有一个问题与罗技液晶SDK。一切都行得通,但有两件简单的事行不通。首先我不能让进度条工作。我每秒更新进度条的值并更新屏幕。没事发生。我已经测试了从0到100和从0到1的值,没有任何不同。
第二个问题是VS2012中的图像。我无法在c++ Dll中加载图像。下面的代码是我的罗技类,其中包含屏幕的所有数据。完整的源代码可以在BitBucket找到。
我希望有人能帮我一下。编辑:问题出在进度条上。其余的代码都可以运行。它可以在罗技LCD屏幕上显示所有内容,甚至是进度条、时间……但真正的问题在于进度条的进度。这意味着条形背景画得很完美,但进度条没有移动,它似乎固定在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() );
}
在您尝试找出代码的问题之前,您应该验证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的要求不匹配。
让我知道你的结果
相关文章:
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 升级到 Windows 10 版本 1809 SDK 后,我无法编译使用 C++/WinRT 的项目
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- Eventloop 卡住:NAO C++ SDK OnFaceDetection 示例
- 构建失败错误:无法使用 qibuild 构建C++ SDK Helloworld
- Microsoft C++ 用于图形 API 的 Rest SDK
- 如何检索 Steamwork SDK 的当前版本
- 佳能SDK无法从相机下载图片
- 如何使用 CPP REST SDK 实现 CAS(中央认证服务)?
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- 关于 API 文档和设备操作 在助手-sdk-cpp 上
- C++标准视窗 SDK 文件中的编译错误
- DLL:当 SDK 头文件不使用 __declspec(dllexport) 时,我可以使用它吗
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- "byte":使用Crypto++和Windows SDK时出现不明确的符号错误
- FBX SDK 在预期 3 个顶点时返回 4 个顶点
- Qt & Firebase C++ SDK 在 iOS 上的链接问题
- Yocto-bitbake与SDK系统根冲突
- Canon SDK初始化崩溃