2023-04-02 22:47:50 -04:00
|
|
|
/*
|
|
|
|
widget.cpp
|
|
|
|
|
|
|
|
Copyright (c) 2023 Kevin Matz (kevin.matz@gmail.com)
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
SOFTWARE.
|
|
|
|
*/
|
|
|
|
#include "widget.h"
|
|
|
|
|
2023-04-03 09:58:26 -04:00
|
|
|
namespace ENTTEC {
|
2023-04-02 22:47:50 -04:00
|
|
|
|
|
|
|
Widget::Widget()
|
2023-04-03 16:43:37 -04:00
|
|
|
: serial_number(0) // SN# 0 for emulated devices
|
|
|
|
, firmware_version(2<<8) // emulated devices support RDM
|
|
|
|
, tx_break_intervals(9) // 96.06 us (fastest) by default
|
|
|
|
, tx_mab_intervals(1) // 10.67 us (fastest) by default
|
|
|
|
, tx_rate(0) // 0 for fastest rate possible, by default
|
|
|
|
, usb_mode_(USBunknown)
|
2023-04-02 22:47:50 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget::~Widget()
|
|
|
|
{
|
|
|
|
switch (usb_mode_) {
|
|
|
|
case USBdevice:
|
|
|
|
Widget::halt();
|
|
|
|
break;
|
|
|
|
case USBhost:
|
|
|
|
Widget::disconnect();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Begin operating as a USB Device
|
2023-04-03 16:43:37 -04:00
|
|
|
*
|
|
|
|
* The base class method should be called from all inheriting overrides.
|
2023-04-02 22:47:50 -04:00
|
|
|
*/
|
|
|
|
void Widget::init()
|
|
|
|
{
|
|
|
|
usb_mode_ = USBdevice;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Stop operating as a USB Device
|
2023-04-03 16:43:37 -04:00
|
|
|
*
|
|
|
|
* The base class method should be called from all inheriting overrides.
|
2023-04-02 22:47:50 -04:00
|
|
|
*/
|
|
|
|
void Widget::halt()
|
|
|
|
{
|
|
|
|
usb_mode_ = USBunknown;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Begin operating on the USB Host
|
2023-04-03 16:43:37 -04:00
|
|
|
*
|
|
|
|
* The base class method should be called from all inheriting overrides.
|
2023-04-02 22:47:50 -04:00
|
|
|
*/
|
|
|
|
void Widget::connect()
|
|
|
|
{
|
|
|
|
usb_mode_ = USBhost;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Stop operating on the USB Host
|
2023-04-03 16:43:37 -04:00
|
|
|
*
|
|
|
|
* The base class method should be called from all inheriting overrides.
|
2023-04-02 22:47:50 -04:00
|
|
|
*/
|
|
|
|
void Widget::disconnect()
|
|
|
|
{
|
|
|
|
usb_mode_ = USBunknown;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::routeRxMessage
|
|
|
|
* @param msg
|
|
|
|
*/
|
2023-04-03 16:42:48 -04:00
|
|
|
void Widget::routeRxMessage(std::shared_ptr<Pro::MessageData> msg)
|
2023-04-02 22:47:50 -04:00
|
|
|
{
|
|
|
|
switch (msg->label) {
|
|
|
|
case Pro::OpReprogramFirmware:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgReprogramFirmware>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgReprogramFirmware(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpProgramFlashPage:
|
|
|
|
{
|
|
|
|
switch (usb_mode_) {
|
|
|
|
case USBdevice:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgProgramFlashPageRequest>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgProgramFlashPageRequest(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case USBhost:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgProgramFlashPageReply>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgProgramFlashPageReply(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpGetWidgetParameters:
|
|
|
|
{
|
|
|
|
switch (usb_mode_) {
|
|
|
|
case USBdevice:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgGetWidgetParametersRequest>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgGetWidgetParametersRequest(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case USBhost:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgGetWidgetParametersReply>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgGetWidgetParametersReply(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpSetWidgetParameters:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgSetWidgetParametersRequest>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgSetWidgetParametersRequest(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpRecievedDmxPacket:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgRecievedDmxPacket>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgRecievedDmxPacket(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpOutputOnlySendDMX:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgOutputOnlySendDMX>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgOutputOnlySendDMX(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpSendRDMData:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgSendRDMData>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgSendRDMData(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpRecieveDMXOnChange:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgRecieveDMXOnChange>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgRecieveDMXOnChange(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpRecievedDMXChanged:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgRecievedDMXChanged>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgRecievedDMXChanged(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpGetWidgetSerial:
|
|
|
|
{
|
|
|
|
switch (usb_mode_) {
|
|
|
|
case USBdevice:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgGetWidgetSerialRequest>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgGetWidgetSerialRequest(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case USBhost:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgGetWidgetSerialReply>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgGetWidgetSerialReply(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Pro::OpSendRDMDiscovery:
|
|
|
|
{
|
2023-04-03 16:42:48 -04:00
|
|
|
auto data = std::static_pointer_cast<Pro::MsgSendRDMDiscovery>(msg);
|
2023-04-02 22:47:50 -04:00
|
|
|
rxMsgSendRDMDiscovery(data);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::sendMessage
|
|
|
|
* @param msg
|
2023-04-03 16:43:37 -04:00
|
|
|
*
|
|
|
|
* The base class method is to discard the message.
|
2023-04-02 22:47:50 -04:00
|
|
|
*/
|
2023-04-03 16:42:48 -04:00
|
|
|
void Widget::sendMessage(std::shared_ptr<Pro::MessageData> msg) const
|
2023-04-02 22:47:50 -04:00
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgReprogramFirmware
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgReprogramFirmware(std::shared_ptr<Pro::MsgReprogramFirmware> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgProgramFlashPageRequest
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgProgramFlashPageRequest(std::shared_ptr<Pro::MsgProgramFlashPageRequest> msg)
|
|
|
|
{
|
2023-04-03 20:09:55 -04:00
|
|
|
auto reply = std::make_shared<Pro::MsgProgramFlashPageReply>();
|
2023-04-05 06:56:23 -04:00
|
|
|
reply->success = writeFwPage(msg->page);
|
2023-04-03 20:09:55 -04:00
|
|
|
sendMessage(reply);
|
2023-04-02 22:47:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgProgramFlashPageReply
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgProgramFlashPageReply(std::shared_ptr<Pro::MsgProgramFlashPageReply> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgGetWidgetParametersRequest
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgGetWidgetParametersRequest(std::shared_ptr<Pro::MsgGetWidgetParametersRequest> msg)
|
|
|
|
{
|
2023-04-03 20:12:01 -04:00
|
|
|
auto reply = std::make_shared<Pro::MsgGetWidgetParametersReply>();
|
|
|
|
|
|
|
|
reply->break_time = tx_break_intervals;
|
|
|
|
reply->mab_time = tx_mab_intervals;
|
|
|
|
reply->rate = tx_rate;
|
|
|
|
reply->user_data = std::vector<uint8_t>(user_configuration);
|
|
|
|
reply->user_data.resize(msg->size, 0);
|
|
|
|
|
|
|
|
sendMessage(reply);
|
2023-04-02 22:47:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgGetWidgetParametersReply
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgGetWidgetParametersReply(std::shared_ptr<Pro::MsgGetWidgetParametersReply> msg)
|
|
|
|
{
|
2023-04-03 20:12:01 -04:00
|
|
|
firmware_version = msg->version;
|
|
|
|
tx_break_intervals = msg->break_time;
|
|
|
|
tx_mab_intervals = msg->mab_time;
|
|
|
|
tx_rate = msg->rate;
|
|
|
|
user_configuration = std::vector<uint8_t>(msg->user_data);
|
2023-04-02 22:47:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgSetWidgetParametersRequest
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgSetWidgetParametersRequest(std::shared_ptr<Pro::MsgSetWidgetParametersRequest> msg)
|
|
|
|
{
|
2023-04-03 20:12:01 -04:00
|
|
|
tx_break_intervals = msg->break_time;
|
|
|
|
tx_mab_intervals = msg->mab_time;
|
|
|
|
tx_rate = msg->rate;
|
|
|
|
user_configuration = std::vector<uint8_t>(msg->user_data);
|
2023-04-02 22:47:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgRecievedDmxPacket
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgRecievedDmxPacket(std::shared_ptr<Pro::MsgRecievedDmxPacket> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgOutputOnlySendDMX
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgOutputOnlySendDMX(std::shared_ptr<Pro::MsgOutputOnlySendDMX> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgSendRDMData
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgSendRDMData(std::shared_ptr<Pro::MsgSendRDMData> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgRecieveDMXOnChange
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgRecieveDMXOnChange(std::shared_ptr<Pro::MsgRecieveDMXOnChange> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgRecievedDMXChanged
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgRecievedDMXChanged(std::shared_ptr<Pro::MsgRecievedDMXChanged> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgGetWidgetSerialRequest
|
|
|
|
* @param msg
|
|
|
|
*/
|
2023-04-03 20:11:25 -04:00
|
|
|
void Widget::rxMsgGetWidgetSerialRequest(std::shared_ptr<Pro::MsgGetWidgetSerialRequest>)
|
2023-04-02 22:47:50 -04:00
|
|
|
{
|
2023-04-03 20:11:25 -04:00
|
|
|
auto reply = std::make_shared<Pro::MsgGetWidgetSerialReply>();
|
|
|
|
reply->serial = serial_number;
|
|
|
|
sendMessage(reply);
|
2023-04-02 22:47:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgGetWidgetSerialReply
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgGetWidgetSerialReply(std::shared_ptr<Pro::MsgGetWidgetSerialReply> msg)
|
|
|
|
{
|
2023-04-03 20:11:25 -04:00
|
|
|
serial_number = msg->serial;
|
2023-04-02 22:47:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Widget::rxMsgSendRDMDiscovery
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
void Widget::rxMsgSendRDMDiscovery(std::shared_ptr<Pro::MsgSendRDMDiscovery> msg)
|
|
|
|
{
|
|
|
|
(void)msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-04-03 09:58:26 -04:00
|
|
|
} // namespace ENTTEC
|