- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 Logitech LCD SDK 时遇到问题。一切正常,但 2 个简单的事情不起作用。首先我无法让进度条工作。我每秒更新进度条的值并更新屏幕。什么都没发生。我已经测试了从 0 到 100 和从 0 到 1 的值,没有差异。
第二个问题是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() );
}
最佳答案
在您尝试找出您的代码有什么问题之前,您应该验证 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的要求。
让我知道你的结果。
关于c++ - 罗技 LCD SDK (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976907/
我有一个基于 ARM 的板( http://wiki.friendlyarm.com/wiki/index.php/NanoPi_M1 )并在其上使用 Ubuntu-server 16.04。我有一个
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我对我的第一个 LCD 示例感到疯狂。 我使用Arduino Uno,我想用最简单的例子尝试液晶屏:Hello World液晶示例。 我以与上面示例相同的方式连接引脚,但 LCD 首先在第一行显示 1
我已经非常接近在 LCD 上按预期输出了。问题是,当我从整数中提取数字以将数字作为整数并将余数作为我的分数时,我似乎无法获得正确的输出。 在小数点之前,输出看起来很好,但在小数点之后,则不然。 voi
我已经对 Atmega-16 微 Controller 进行了编程,以连接 LM016L LCD 显示器。程序如下: #include #include #define MrLCDsCrib PO
我正在编写一个在微处理器和 LCD 屏幕上从 3 开始倒数的函数。 void countdown() { _delay_ms(1000); draw_string("3",40,20); _delay
我被要求为 a display like the one in this ad 设计一个 LCD 墙应用程序. 要求是墙可以显示全屏视频或将墙分成不同的部分以显示多个视频或图像和视频。 我想了解可以使
我在这里有一个小问题。我有一个与arduino接口(interface)的16x2 lcd。在下面的闪烁中我可以使光标闪烁,但我想闪烁数字而不是光标。如何在这里使用 arduino。 Keypad s
我为带有 HD44780 Controller 的 LCD 创建了一个库,从数据表中我读到代码 0x18 会将整个显示向左移动一个位置,但是当我这样做时,显示消失了。我还读到 0x1C 将整个显示向右
我正在尝试为 20x2 LCD 制作一些自定义字符。我正在使用 Atmega µController 来控制具有 4 位接口(interface)的 LCD。我对 LCD 的所有命令似乎都能正常工作(
这是我尝试显示湿度传感器数据的代码到我的液晶显示器... 当我运行这个程序时, Traceback(most recent call last): File "lcd.py", line 7 in l
我正在尝试通过 USB 串行端口将整数从 MATLAB 发送到 Ardunio Uno,然后将它们显示在 LCD 上。我的问题是 128 到 159 的数字在 Arduino 显示器上显示为 63。
我用Tiva c驱动LCD,但有些字符和数字显示错误,例如N显示为L,2和3显示为0,但其他字符和字母显示正确。 下面是显示字符的函数: void LCD_voidWriteCharacter(cha
我已将 LCD 显示器连接到我正在从事的项目中。我有很多输入/输出,我想根据输入的状态显示不同的消息。现在,在我开始复杂化/添加更多硬件之前。我需要一些帮助。当没有输入处于事件状态时,我希望 LCD
我有一个带有 I2C 背负式适配器的 2 x 16 LCD 显示器。作为一个简单的开始,我只是显示编码器值。但是,当我转动编码器时,我会在不同区域的液晶显示屏上看到奇怪的文字。有时显示会恢复并仅显示“
我正在用 做一个小项目arduino 以太网 板。我是arduino的新手,想知道是否关注液晶显示器是否与我的 arduino 兼容。如果兼容,我是否需要更多硬件,例如电缆等... 我的 Arduin
我正在尝试使用 Jfxtras 中的 LCD 仪表。这是我必须创建仪表的代码: final Gauge lcd = GaugeBuilder.create() .gau
我有一个数组,其输入是由用户使用键盘给出的。所有输入都存储在名为 storeKeys 的数组中。数组的索引由变量storeKeysIndex保存,初始化为0,当按下一个键时,按下的键的值存储在stor
目前我正在制作一个用于将自定义文本打印到 LCD 的类。 我将 lcd 对象作为构造函数中的参数传递给类。 Display.h #ifndef Display_h #define Display_h
我只想以 LCD 格式显示系统时钟时间。我还希望使用 hh:mm:ss 格式显示时间。我的代码如下。但是当我运行它时,它并不像我预期的那样。谁能解释一下为什么? import sys from PyS
我是一名优秀的程序员,十分优秀!