2021-01-06 06:36:42 +00:00
# include "OpenRGBE131ReceiverDialog.h"
# include "ui_OpenRGBE131ReceiverDialog.h"
2024-09-06 21:48:47 +00:00
# include <QDir>
2021-01-09 03:12:41 +00:00
# include <QLineEdit>
2021-01-18 19:46:05 +00:00
# include <QMessageBox>
2021-01-09 03:12:41 +00:00
# include <QSignalMapper>
2023-01-19 10:22:38 +00:00
# include "filesystem.h"
2025-02-07 02:35:12 +00:00
# include "RGBController.h"
2024-09-06 21:48:47 +00:00
# include <e131.h>
# include <fstream>
2025-07-21 05:16:48 +00:00
# include <nlohmann/json.hpp>
2021-01-18 00:16:49 +00:00
2021-01-11 19:06:45 +00:00
# ifndef _WIN32
# include <unistd.h>
# define closesocket ::close
# endif
2021-01-06 06:36:42 +00:00
# define MAX_LEDS_PER_UNIVERSE 170
2025-02-07 02:35:12 +00:00
using json = nlohmann : : json ;
2021-01-06 06:36:42 +00:00
void DeviceListChanged_Callback ( void * this_ptr )
{
2021-01-09 03:12:41 +00:00
OpenRGBE131ReceiverDialog * this_obj = ( OpenRGBE131ReceiverDialog * ) this_ptr ;
QMetaObject : : invokeMethod ( this_obj , " DeviceListChanged " , Qt : : QueuedConnection ) ;
2021-01-06 06:36:42 +00:00
}
typedef struct
{
RGBController * controller ;
unsigned int start_channel ;
unsigned int start_led ;
unsigned int num_leds ;
bool update ;
} universe_member ;
typedef struct
{
unsigned int universe ;
std : : vector < universe_member > members ;
} universe_entry ;
static std : : vector < universe_entry > universe_list ;
2021-01-09 03:12:41 +00:00
typedef unsigned int LineEditParameter ;
enum
{
LINEEDIT_PARAMETER_START_CHANNEL ,
LINEEDIT_PARAMETER_START_LED ,
LINEEDIT_PARAMETER_NUM_LEDS
} ;
class LineEditArgument : public QObject
{
public :
QWidget * widget ;
unsigned int universe_idx ;
unsigned int member_idx ;
LineEditParameter parameter ;
} ;
typedef unsigned int CheckBoxParameter ;
enum
{
CHECKBOX_PARAMETER_UPDATE
} ;
class CheckBoxArgument : public QObject
{
public :
QWidget * widget ;
unsigned int universe_idx ;
unsigned int member_idx ;
CheckBoxParameter parameter ;
} ;
2025-02-07 02:35:12 +00:00
OpenRGBE131ReceiverDialog : : OpenRGBE131ReceiverDialog ( ResourceManagerInterface * manager , QWidget * parent ) : QWidget ( parent ) , ui ( new Ui : : OpenRGBE131ReceiverDialog )
2021-01-06 06:36:42 +00:00
{
ui - > setupUi ( this ) ;
resource_manager = manager ;
/*-------------------------------------------------*\
| Register device list change callback |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
resource_manager - > RegisterDeviceListChangeCallback ( DeviceListChanged_Callback , this ) ;
resource_manager - > RegisterDetectionProgressCallback ( DeviceListChanged_Callback , this ) ;
2021-01-06 18:54:33 +00:00
online = false ;
2024-09-06 21:48:47 +00:00
initialized = false ;
2021-01-06 18:54:33 +00:00
received_count = 0 ;
UpdateOnlineStatus ( ) ;
2021-01-06 06:36:42 +00:00
}
OpenRGBE131ReceiverDialog : : ~ OpenRGBE131ReceiverDialog ( )
{
2021-12-30 05:22:15 +00:00
/*-------------------------------------------------*\
| Register device list change callback |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
resource_manager - > UnregisterDeviceListChangeCallback ( DeviceListChanged_Callback , this ) ;
resource_manager - > UnregisterDetectionProgressCallback ( DeviceListChanged_Callback , this ) ;
2021-01-06 06:36:42 +00:00
delete ui ;
}
void OpenRGBE131ReceiverDialog : : DeviceListChanged ( )
{
if ( resource_manager - > GetDetectionPercent ( ) = = 100 )
{
2021-01-17 23:00:54 +00:00
ui - > ControllersTreeView - > clear ( ) ;
2021-01-09 03:12:41 +00:00
ui - > E131TreeView - > clear ( ) ;
2021-01-06 06:36:42 +00:00
universe_list . clear ( ) ;
2021-01-17 23:00:54 +00:00
UpdateControllersTreeView ( ) ;
2024-09-06 21:48:47 +00:00
LoadMap ( ) ;
if ( ! initialized )
{
if ( ui - > EnableAutoStartBox - > checkState ( ) = = Qt : : Checked )
{
this - > StartReceiver ( ) ;
}
initialized = true ;
}
2021-01-09 03:12:41 +00:00
}
else
{
2021-01-06 06:36:42 +00:00
ui - > E131TreeView - > clear ( ) ;
2021-01-09 03:12:41 +00:00
universe_list . clear ( ) ;
}
}
2021-01-17 23:00:54 +00:00
void OpenRGBE131ReceiverDialog : : UpdateControllersTreeView ( )
{
ui - > ControllersTreeView - > clear ( ) ;
ui - > ControllersTreeView - > setColumnCount ( 1 ) ;
ui - > ControllersTreeView - > setHeaderLabels ( QStringList ( ) < < " Controller " ) ;
for ( unsigned int controller_idx = 0 ; controller_idx < resource_manager - > GetRGBControllers ( ) . size ( ) ; controller_idx + + )
{
RGBController * controller = resource_manager - > GetRGBControllers ( ) [ controller_idx ] ;
QTreeWidgetItem * new_controller_entry = new QTreeWidgetItem ( ui - > ControllersTreeView ) ;
2025-08-20 16:44:35 +00:00
new_controller_entry - > setText ( 0 , QString : : fromStdString ( controller - > GetName ( ) ) ) ;
2021-01-17 23:00:54 +00:00
}
}
2021-01-09 03:12:41 +00:00
void OpenRGBE131ReceiverDialog : : UpdateTreeView ( )
{
ui - > E131TreeView - > clear ( ) ;
2021-01-06 06:36:42 +00:00
2021-01-09 03:12:41 +00:00
ui - > E131TreeView - > setColumnCount ( 5 ) ;
ui - > E131TreeView - > header ( ) - > setStretchLastSection ( false ) ;
ui - > E131TreeView - > header ( ) - > setSectionResizeMode ( 0 , QHeaderView : : Stretch ) ;
ui - > E131TreeView - > setHeaderLabels ( QStringList ( ) < < " Universe " < < " Start Channel " < < " Start LED " < < " LED Count " < < " Update " ) ;
2021-01-06 06:36:42 +00:00
2021-01-09 03:12:41 +00:00
/*-----------------------------------------------------*\
| Create a signal mapper for LineEdit fields |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
QSignalMapper * LineEditMapper = new QSignalMapper ( this ) ;
2022-12-03 08:30:06 +00:00
connect ( LineEditMapper , SIGNAL ( mapped ( QObject * ) ) , this , SLOT ( LineEdit_updated_slot ( QObject * ) ) ) ;
2021-01-09 03:12:41 +00:00
/*-----------------------------------------------------*\
| Create a signal mapper for CheckBox fields |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
QSignalMapper * CheckBoxMapper = new QSignalMapper ( this ) ;
2022-12-03 08:30:06 +00:00
connect ( CheckBoxMapper , SIGNAL ( mapped ( QObject * ) ) , this , SLOT ( CheckBox_updated_slot ( QObject * ) ) ) ;
2021-01-09 03:12:41 +00:00
for ( unsigned int universe_idx = 0 ; universe_idx < universe_list . size ( ) ; universe_idx + + )
{
QTreeWidgetItem * new_universe_entry = new QTreeWidgetItem ( ui - > E131TreeView ) ;
new_universe_entry - > setText ( 0 , QString : : fromStdString ( " Universe " + std : : to_string ( universe_list [ universe_idx ] . universe ) ) ) ;
for ( unsigned int member_idx = 0 ; member_idx < universe_list [ universe_idx ] . members . size ( ) ; member_idx + + )
2021-01-06 06:36:42 +00:00
{
2021-01-09 03:12:41 +00:00
QTreeWidgetItem * new_member_entry = new QTreeWidgetItem ( new_universe_entry ) ;
2021-01-06 06:36:42 +00:00
2025-08-20 16:44:35 +00:00
new_member_entry - > setText ( 0 , QString : : fromStdString ( ( universe_list [ universe_idx ] . members [ member_idx ] . controller - > GetName ( ) ) ) ) ;
2021-01-06 06:36:42 +00:00
2021-01-09 03:12:41 +00:00
QLineEdit * start_channel_edit = new QLineEdit ( ui - > E131TreeView ) ;
start_channel_edit - > setText ( QString : : number ( universe_list [ universe_idx ] . members [ member_idx ] . start_channel ) ) ;
ui - > E131TreeView - > setItemWidget ( new_member_entry , 1 , start_channel_edit ) ;
2021-01-06 06:36:42 +00:00
2021-01-09 03:12:41 +00:00
LineEditArgument * start_channel_argument = new LineEditArgument ( ) ;
start_channel_argument - > widget = start_channel_edit ;
start_channel_argument - > universe_idx = universe_idx ;
start_channel_argument - > member_idx = member_idx ;
start_channel_argument - > parameter = LINEEDIT_PARAMETER_START_CHANNEL ;
connect ( start_channel_edit , SIGNAL ( editingFinished ( ) ) , LineEditMapper , SLOT ( map ( ) ) ) ;
LineEditMapper - > setMapping ( start_channel_edit , start_channel_argument ) ;
QLineEdit * start_led_edit = new QLineEdit ( ui - > E131TreeView ) ;
start_led_edit - > setText ( QString : : number ( universe_list [ universe_idx ] . members [ member_idx ] . start_led ) ) ;
ui - > E131TreeView - > setItemWidget ( new_member_entry , 2 , start_led_edit ) ;
LineEditArgument * start_led_argument = new LineEditArgument ( ) ;
start_led_argument - > widget = start_led_edit ;
start_led_argument - > universe_idx = universe_idx ;
start_led_argument - > member_idx = member_idx ;
start_led_argument - > parameter = LINEEDIT_PARAMETER_START_LED ;
2021-01-06 06:36:42 +00:00
2021-01-09 03:12:41 +00:00
connect ( start_led_edit , SIGNAL ( editingFinished ( ) ) , LineEditMapper , SLOT ( map ( ) ) ) ;
LineEditMapper - > setMapping ( start_led_edit , start_led_argument ) ;
QLineEdit * num_leds_edit = new QLineEdit ( ui - > E131TreeView ) ;
num_leds_edit - > setText ( QString : : number ( universe_list [ universe_idx ] . members [ member_idx ] . num_leds ) ) ;
ui - > E131TreeView - > setItemWidget ( new_member_entry , 3 , num_leds_edit ) ;
LineEditArgument * num_leds_argument = new LineEditArgument ( ) ;
num_leds_argument - > widget = num_leds_edit ;
num_leds_argument - > universe_idx = universe_idx ;
num_leds_argument - > member_idx = member_idx ;
num_leds_argument - > parameter = LINEEDIT_PARAMETER_NUM_LEDS ;
connect ( num_leds_edit , SIGNAL ( editingFinished ( ) ) , LineEditMapper , SLOT ( map ( ) ) ) ;
LineEditMapper - > setMapping ( num_leds_edit , num_leds_argument ) ;
QCheckBox * update_checkbox = new QCheckBox ( ui - > E131TreeView ) ;
update_checkbox - > setChecked ( universe_list [ universe_idx ] . members [ member_idx ] . update ) ;
ui - > E131TreeView - > setItemWidget ( new_member_entry , 4 , update_checkbox ) ;
CheckBoxArgument * update_argument = new CheckBoxArgument ( ) ;
update_argument - > widget = update_checkbox ;
update_argument - > universe_idx = universe_idx ;
update_argument - > member_idx = member_idx ;
update_argument - > parameter = CHECKBOX_PARAMETER_UPDATE ;
connect ( update_checkbox , SIGNAL ( clicked ( ) ) , CheckBoxMapper , SLOT ( map ( ) ) ) ;
CheckBoxMapper - > setMapping ( update_checkbox , update_argument ) ;
}
2021-01-06 06:36:42 +00:00
}
2021-01-09 03:12:41 +00:00
ui - > E131TreeView - > setStyleSheet ( " QLineEdit { border: none } " ) ;
ui - > E131TreeView - > expandAll ( ) ;
2021-01-06 06:36:42 +00:00
}
2021-01-17 23:36:51 +00:00
void OpenRGBE131ReceiverDialog : : AutoMap ( )
{
for ( unsigned int controller_idx = 0 ; controller_idx < resource_manager - > GetRGBControllers ( ) . size ( ) ; controller_idx + + )
{
RGBController * controller = resource_manager - > GetRGBControllers ( ) [ controller_idx ] ;
// Determine if the controller has a Direct mode
bool has_direct = false ;
for ( unsigned int mode_idx = 0 ; mode_idx < controller - > modes . size ( ) ; mode_idx + + )
{
if ( controller - > modes [ mode_idx ] . name = = " Direct " )
{
has_direct = true ;
break ;
}
}
// Only map controllers that have a Direct mode
if ( has_direct )
{
unsigned int num_universes = 1 + ( ( controller - > leds . size ( ) * 3 ) / 512 ) ;
unsigned int remaining_leds = controller - > leds . size ( ) ;
unsigned int start_led = 0 ;
for ( unsigned int universe_idx = 0 ; universe_idx < num_universes ; universe_idx + + )
{
// For now, create universes sequentially per controller
universe_entry new_entry ;
new_entry . universe = universe_list . size ( ) + 1 ;
// Add members as needed
universe_member new_member ;
new_member . controller = resource_manager - > GetRGBControllers ( ) [ controller_idx ] ;
new_member . start_channel = 1 ;
new_member . start_led = start_led ;
new_member . num_leds = remaining_leds ;
new_member . update = false ;
// Limit the number of LEDs
if ( new_member . num_leds > MAX_LEDS_PER_UNIVERSE )
{
new_member . num_leds = MAX_LEDS_PER_UNIVERSE ;
}
// Update start LED
start_led = start_led + new_member . num_leds ;
// Update remaining LED count
remaining_leds = remaining_leds - new_member . num_leds ;
// Only set the update flag for the last universe of the controller
if ( universe_idx = = ( num_universes - 1 ) )
{
new_member . update = true ;
}
new_entry . members . push_back ( new_member ) ;
universe_list . push_back ( new_entry ) ;
}
}
}
}
2021-01-06 06:36:42 +00:00
void OpenRGBE131ReceiverDialog : : E131ReceiverThreadFunction ( )
{
int sockfd ;
e131_packet_t packet ;
e131_error_t error ;
2021-01-06 19:48:49 +00:00
std : : chrono : : time_point < std : : chrono : : steady_clock > last_update_time ;
/*-----------------------------------------------------*\
| Initialize update time |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
last_update_time = std : : chrono : : steady_clock : : now ( ) ;
2021-01-06 06:36:42 +00:00
2021-01-06 18:54:33 +00:00
/*-----------------------------------------------------*\
| Clear online status |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
online = false ;
2021-01-06 06:36:42 +00:00
/*-----------------------------------------------------*\
| Create a socket for E1 .31 |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
sockfd = e131_socket ( ) ;
if ( sockfd < 0 )
{
printf ( " Socket error \r \n " ) ;
return ;
}
/*-----------------------------------------------------*\
| Bind the socket to the default E1 .31 port |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if ( e131_bind ( sockfd , E131_DEFAULT_PORT ) < 0 )
{
printf ( " Bind error \r \n " ) ;
return ;
}
/*-----------------------------------------------------*\
2021-01-07 06:38:25 +00:00
| Join the configured universes if multicast enabled |
2021-01-06 06:36:42 +00:00
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2021-01-07 06:38:25 +00:00
bool multicast = ui - > EnableMulticastBox - > checkState ( ) = = Qt : : Checked ;
2021-01-06 06:36:42 +00:00
for ( unsigned int universe_idx = 0 ; universe_idx < universe_list . size ( ) ; universe_idx + + )
{
2021-01-07 06:38:25 +00:00
if ( multicast )
2021-01-06 06:36:42 +00:00
{
2021-01-07 06:38:25 +00:00
if ( e131_multicast_join ( sockfd , universe_list [ universe_idx ] . universe ) < 0 )
{
printf ( " Join error \r \n " ) ;
return ;
}
2021-01-06 06:36:42 +00:00
}
}
2021-01-06 18:54:33 +00:00
/*-----------------------------------------------------*\
| Set online status |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
online = true ;
UpdateOnlineStatus ( ) ;
2021-01-06 06:36:42 +00:00
/*-----------------------------------------------------*\
| Loop to receive E1 .31 packets |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2021-01-06 18:54:33 +00:00
while ( online )
2021-01-06 06:36:42 +00:00
{
if ( e131_recv ( sockfd , & packet ) < 0 )
{
printf ( " Receive error \r \n " ) ;
2021-01-06 18:54:33 +00:00
online = false ;
2021-01-06 06:36:42 +00:00
}
if ( ( error = e131_pkt_validate ( & packet ) ) ! = E131_ERR_NONE )
{
printf ( " Validation error: %s \r \n " , e131_strerror ( error ) ) ;
continue ;
}
2021-01-06 18:54:33 +00:00
received_count + + ;
2021-01-06 19:48:49 +00:00
if ( ( std : : chrono : : steady_clock : : now ( ) - last_update_time ) > std : : chrono : : milliseconds ( 500 ) )
{
ui - > PacketsReceivedValue - > setText ( QString : : number ( received_count ) ) ;
2021-01-07 06:19:13 +00:00
ui - > ReceiverSourceValue - > setText ( QString : : fromLocal8Bit ( ( const char * ) packet . frame . source_name , 64 ) ) ;
2021-01-06 19:48:49 +00:00
last_update_time = std : : chrono : : steady_clock : : now ( ) ;
}
2021-01-06 06:36:42 +00:00
/*-------------------------------------------------*\
| If received packet is from a valid universe , |
| update the corresponding devices |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2021-01-11 14:44:40 +00:00
unsigned int universe = ntohs ( packet . frame . universe ) ;
2021-01-06 06:36:42 +00:00
for ( unsigned int universe_idx = 0 ; universe_idx < universe_list . size ( ) ; universe_idx + + )
{
if ( universe_list [ universe_idx ] . universe = = universe )
{
for ( unsigned int member_idx = 0 ; member_idx < universe_list [ universe_idx ] . members . size ( ) ; member_idx + + )
{
RGBController * controller = universe_list [ universe_idx ] . members [ member_idx ] . controller ;
unsigned int channel = universe_list [ universe_idx ] . members [ member_idx ] . start_channel ;
unsigned int start_led = universe_list [ universe_idx ] . members [ member_idx ] . start_led ;
unsigned int num_leds = universe_list [ universe_idx ] . members [ member_idx ] . num_leds ;
bool update = universe_list [ universe_idx ] . members [ member_idx ] . update ;
2021-01-09 03:12:41 +00:00
// Channel range is 1-512, so break if channel is zero
if ( channel = = 0 )
{
break ;
}
2021-01-06 06:36:42 +00:00
for ( unsigned int led_idx = start_led ; led_idx < ( start_led + num_leds ) ; led_idx + + )
{
// Calculate channels for this LED
unsigned int red_idx = channel + 0 ;
unsigned int grn_idx = channel + 1 ;
unsigned int blu_idx = channel + 2 ;
2021-01-09 03:12:41 +00:00
// Verify last channel (blue) is within range 1-512
if ( blu_idx > 512 )
{
break ;
}
2021-01-06 06:36:42 +00:00
// Get color out of E1.31 packet
RGBColor led_color = ToRGBColor ( packet . dmp . prop_val [ red_idx ] ,
packet . dmp . prop_val [ grn_idx ] ,
packet . dmp . prop_val [ blu_idx ] ) ;
2021-01-09 03:12:41 +00:00
// Verify LED index
if ( led_idx > = controller - > colors . size ( ) )
{
break ;
}
2021-01-06 06:36:42 +00:00
// Set LED color in controller
controller - > colors [ led_idx ] = led_color ;
2021-01-08 18:26:34 +00:00
// Increment the channel by 3 to account for red, green, and blue channels
channel = channel + 3 ;
2021-01-06 06:36:42 +00:00
}
// If configured to update the device, update
if ( update )
{
controller - > UpdateLEDs ( ) ;
}
}
}
}
}
2021-01-06 18:54:33 +00:00
closesocket ( sockfd ) ;
UpdateOnlineStatus ( ) ;
}
void OpenRGBE131ReceiverDialog : : UpdateOnlineStatus ( )
{
if ( online )
{
ui - > ReceiverStatusValue - > setText ( " Online " ) ;
ui - > ButtonStartReceiver - > setEnabled ( false ) ;
ui - > ButtonStopReceiver - > setEnabled ( true ) ;
}
else
{
ui - > ReceiverStatusValue - > setText ( " Offline " ) ;
received_count = 0 ;
ui - > PacketsReceivedValue - > setText ( QString : : number ( received_count ) ) ;
ui - > ButtonStartReceiver - > setEnabled ( true ) ;
ui - > ButtonStopReceiver - > setEnabled ( false ) ;
}
}
2024-09-06 21:48:47 +00:00
void OpenRGBE131ReceiverDialog : : LoadMap ( )
2021-01-06 18:54:33 +00:00
{
2024-09-06 21:48:47 +00:00
/*-----------------------------------------------------*\
| Read in the JSON map from a file |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
json universe_map ;
2025-07-21 05:40:23 +00:00
/*-----------------------------------------------------*\
| Open input file in binary mode |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
std : : ifstream universe_file ( resource_manager - > GetConfigurationDirectory ( ) / " plugins " / " settings " / " E131UniverseMap.json " , std : : ios : : in | std : : ios : : binary ) ;
/*-----------------------------------------------------*\
| Read settings into JSON store |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if ( universe_file )
{
try
{
2024-09-06 21:48:47 +00:00
universe_file > > universe_map ;
2025-07-21 05:40:23 +00:00
}
catch ( std : : exception & e )
{
/*---------------------------------------------*\
| If an exception was caught , that means the |
| JSON parsing failed . Clear out any data in |
| the store as it is corrupt . |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2024-09-06 21:48:47 +00:00
universe_map . clear ( ) ;
}
}
2025-07-21 05:40:23 +00:00
/*-----------------------------------------------------*\
| Load checkboxes state |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if ( universe_map . contains ( " enable_multicast " ) )
{
if ( universe_map [ " enable_multicast " ] )
{
2024-09-06 21:48:47 +00:00
ui - > EnableMulticastBox - > setCheckState ( Qt : : Checked ) ;
2025-07-21 05:40:23 +00:00
}
else
{
2024-09-06 21:48:47 +00:00
ui - > EnableMulticastBox - > setCheckState ( Qt : : Unchecked ) ;
}
}
2025-07-21 05:40:23 +00:00
if ( universe_map . contains ( " enable_autostart " ) )
{
if ( universe_map [ " enable_autostart " ] )
{
2024-09-06 21:48:47 +00:00
ui - > EnableAutoStartBox - > setCheckState ( Qt : : Checked ) ;
2025-07-21 05:40:23 +00:00
}
else
{
2024-09-06 21:48:47 +00:00
ui - > EnableAutoStartBox - > setCheckState ( Qt : : Unchecked ) ;
}
}
2025-07-21 05:40:23 +00:00
/*-----------------------------------------------------*\
| Clear the universe map |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2024-09-06 21:48:47 +00:00
universe_list . clear ( ) ;
2025-07-21 05:40:23 +00:00
/*-----------------------------------------------------*\
| Loop through all saved universes and create list |
| entries |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if ( universe_map . contains ( " universes " ) )
{
for ( unsigned int universe_index = 0 ; universe_index < universe_map [ " universes " ] . size ( ) ; universe_index + + )
{
if ( universe_map [ " universes " ] [ universe_index ] . contains ( " universe " ) )
{
2024-09-06 21:48:47 +00:00
universe_entry new_universe ;
new_universe . universe = universe_map [ " universes " ] [ universe_index ] [ " universe " ] ;
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] . contains ( " members " ) )
{
for ( unsigned int member_index = 0 ; member_index < universe_map [ " universes " ] [ universe_index ] [ " members " ] . size ( ) ; member_index + + )
{
2024-09-06 21:48:47 +00:00
universe_member new_member ;
2025-07-21 05:40:23 +00:00
/*---------------------------------*\
| Fill in default values in case |
| entries are missing |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
new_member . controller = NULL ;
new_member . start_channel = 1 ;
new_member . start_led = 0 ;
new_member . num_leds = 0 ;
new_member . update = false ;
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " start_channel " ) )
{
new_member . start_channel = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " start_channel " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " start_led " ) )
{
new_member . start_led = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " start_led " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " num_leds " ) )
{
new_member . num_leds = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " num_leds " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " update " ) )
{
new_member . update = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " update " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
/*---------------------------------*\
| Get controller information |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
std : : string controller_name = " " ;
std : : string controller_description = " " ;
std : : string controller_location = " " ;
std : : string controller_serial = " " ;
unsigned int controller_led_count = 0 ;
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " controller_name " ) )
{
controller_name = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_name " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " controller_description " ) )
{
controller_description = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_description " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " controller_location " ) )
{
controller_location = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_location " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " controller_serial " ) )
{
controller_serial = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_serial " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
if ( universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] . contains ( " controller_led_count " ) )
{
controller_led_count = universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_led_count " ] ;
2024-09-06 21:48:47 +00:00
}
2025-07-21 05:40:23 +00:00
/*---------------------------------*\
| Search the controller list for a |
| matching controller |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
for ( unsigned int controller_index = 0 ; controller_index < resource_manager - > GetRGBControllers ( ) . size ( ) ; controller_index + + )
{
2025-08-20 16:44:35 +00:00
if ( ( resource_manager - > GetRGBControllers ( ) [ controller_index ] - > GetName ( ) = = controller_name )
& & ( resource_manager - > GetRGBControllers ( ) [ controller_index ] - > GetDescription ( ) = = controller_description )
& & ( resource_manager - > GetRGBControllers ( ) [ controller_index ] - > GetLocation ( ) = = controller_location )
& & ( resource_manager - > GetRGBControllers ( ) [ controller_index ] - > GetSerial ( ) = = controller_serial )
& & ( resource_manager - > GetRGBControllers ( ) [ controller_index ] - > colors . size ( ) = = controller_led_count ) )
2025-07-21 05:40:23 +00:00
{
new_member . controller = resource_manager - > GetRGBControllers ( ) [ controller_index ] ;
2024-09-06 21:48:47 +00:00
}
}
2025-07-21 05:40:23 +00:00
/*---------------------------------*\
| If a controller was found , add |
| the member to the universe |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if ( new_member . controller ! = NULL )
{
2024-09-06 21:48:47 +00:00
new_universe . members . push_back ( new_member ) ;
}
}
}
universe_list . push_back ( new_universe ) ;
}
}
}
/*-----------------------------------------------------*\
| Update the universe tree view |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
UpdateTreeView ( ) ;
}
void OpenRGBE131ReceiverDialog : : StartReceiver ( )
{
2025-07-21 05:40:23 +00:00
if ( ! online )
{
2021-01-06 18:54:33 +00:00
// Start the receiver thread
E131ReceiverThread = new std : : thread ( & OpenRGBE131ReceiverDialog : : E131ReceiverThreadFunction , this ) ;
}
}
2024-09-06 21:48:47 +00:00
void OpenRGBE131ReceiverDialog : : on_ButtonStartReceiver_clicked ( )
{
StartReceiver ( ) ;
}
2021-01-06 18:54:33 +00:00
void OpenRGBE131ReceiverDialog : : on_ButtonStopReceiver_clicked ( )
{
online = false ;
UpdateOnlineStatus ( ) ;
2021-01-06 06:36:42 +00:00
}
2021-01-09 03:12:41 +00:00
2022-12-03 08:30:06 +00:00
void OpenRGBE131ReceiverDialog : : LineEdit_updated_slot ( QObject * lineedit_argument )
2021-01-09 03:12:41 +00:00
{
/*-----------------------------------------------------*\
| Update the parameter |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
unsigned int universe_idx = ( ( LineEditArgument * ) lineedit_argument ) - > universe_idx ;
unsigned int member_idx = ( ( LineEditArgument * ) lineedit_argument ) - > member_idx ;
LineEditParameter parameter = ( ( LineEditArgument * ) lineedit_argument ) - > parameter ;
QWidget * widget = ( ( LineEditArgument * ) lineedit_argument ) - > widget ;
unsigned int value = ( ( QLineEdit * ) widget ) - > text ( ) . toInt ( ) ;
switch ( parameter )
{
case LINEEDIT_PARAMETER_START_CHANNEL :
universe_list [ universe_idx ] . members [ member_idx ] . start_channel = value ;
break ;
case LINEEDIT_PARAMETER_START_LED :
universe_list [ universe_idx ] . members [ member_idx ] . start_led = value ;
break ;
case LINEEDIT_PARAMETER_NUM_LEDS :
universe_list [ universe_idx ] . members [ member_idx ] . num_leds = value ;
break ;
}
}
2022-12-03 08:30:06 +00:00
void OpenRGBE131ReceiverDialog : : CheckBox_updated_slot ( QObject * checkbox_argument )
2021-01-09 03:12:41 +00:00
{
/*-----------------------------------------------------*\
| Update the parameter |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
unsigned int universe_idx = ( ( CheckBoxArgument * ) checkbox_argument ) - > universe_idx ;
unsigned int member_idx = ( ( CheckBoxArgument * ) checkbox_argument ) - > member_idx ;
CheckBoxParameter parameter = ( ( CheckBoxArgument * ) checkbox_argument ) - > parameter ;
QWidget * widget = ( ( CheckBoxArgument * ) checkbox_argument ) - > widget ;
bool value = ( ( QCheckBox * ) widget ) - > isChecked ( ) ;
switch ( parameter )
{
case CHECKBOX_PARAMETER_UPDATE :
universe_list [ universe_idx ] . members [ member_idx ] . update = value ;
break ;
}
}
2021-01-17 23:00:54 +00:00
void OpenRGBE131ReceiverDialog : : on_ButtonAddController_clicked ( )
{
/*-----------------------------------------------------*\
| Make sure a valid controller is selected on the left |
| and a valid universe is selected on the right |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int selected_controller = ui - > ControllersTreeView - > indexOfTopLevelItem ( ui - > ControllersTreeView - > currentItem ( ) ) ;
int selected_universe = ui - > E131TreeView - > indexOfTopLevelItem ( ui - > E131TreeView - > currentItem ( ) ) ;
if ( ( selected_controller = = - 1 ) | | ( selected_universe = = - 1 ) )
{
return ;
}
2021-01-17 23:26:44 +00:00
/*-----------------------------------------------------*\
| Determine start channel |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
unsigned int start_channel = 1 ;
if ( universe_list [ selected_universe ] . members . size ( ) > 0 )
{
universe_member last_member = universe_list [ selected_universe ] . members [ universe_list [ selected_universe ] . members . size ( ) - 1 ] ;
start_channel = last_member . start_channel + ( last_member . num_leds * 3 ) ;
}
2021-01-18 19:46:05 +00:00
/*-----------------------------------------------------*\
| Determine number of LEDs |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
unsigned int start_led = 0 ;
unsigned int num_leds = resource_manager - > GetRGBControllers ( ) [ selected_controller ] - > colors . size ( ) ;
unsigned int remaining_leds = num_leds ;
bool update = false ;
if ( ( num_leds * 3 ) + start_channel > 512 )
{
num_leds = ( 512 - start_channel ) / 3 ;
remaining_leds - = num_leds ;
start_led + = num_leds ;
QMessageBox : : StandardButton reply ;
reply = QMessageBox : : question ( this , " " , " This controller is too large for the selected universe. Do you want to map additional universes for this controller? " , QMessageBox : : Yes | QMessageBox : : No ) ;
if ( reply = = QMessageBox : : Yes )
{
update = false ;
}
else
{
update = true ;
}
}
else
{
update = true ;
}
2021-01-17 23:00:54 +00:00
/*-----------------------------------------------------*\
| Add controller to universe |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
universe_member new_member ;
new_member . controller = resource_manager - > GetRGBControllers ( ) [ selected_controller ] ;
2021-01-17 23:26:44 +00:00
new_member . start_channel = start_channel ;
2021-01-17 23:00:54 +00:00
new_member . start_led = 0 ;
2021-01-18 19:46:05 +00:00
new_member . num_leds = num_leds ;
2021-01-17 23:26:44 +00:00
2021-01-18 19:46:05 +00:00
new_member . update = update ;
2021-01-17 23:00:54 +00:00
universe_list [ selected_universe ] . members . push_back ( new_member ) ;
2021-01-18 19:46:05 +00:00
/*-----------------------------------------------------*\
| Add additional universes for controller |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if ( update = = false )
{
while ( remaining_leds > 0 )
{
start_channel = 1 ;
num_leds = remaining_leds ;
if ( ( num_leds * 3 ) + start_channel > 512 )
{
num_leds = ( 512 - start_channel ) / 3 ;
}
remaining_leds - = num_leds ;
if ( remaining_leds = = 0 )
{
update = true ;
}
/*-----------------------------------------------------*\
| Get next universe value |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
unsigned int next_universe = 1 ;
if ( universe_list . size ( ) > 0 )
{
next_universe = universe_list [ universe_list . size ( ) - 1 ] . universe + 1 ;
}
/*-----------------------------------------------------*\
| Create and add new universe to list |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
universe_entry new_universe ;
new_universe . universe = next_universe ;
/*-----------------------------------------------------*\
| Add selected controller member to new universe |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
universe_member new_member ;
new_member . controller = resource_manager - > GetRGBControllers ( ) [ selected_controller ] ;
new_member . start_channel = 1 ;
new_member . start_led = start_led ;
new_member . num_leds = num_leds ;
new_member . update = update ;
new_universe . members . push_back ( new_member ) ;
universe_list . push_back ( new_universe ) ;
start_led + = num_leds ;
}
}
2021-01-17 23:00:54 +00:00
/*-----------------------------------------------------*\
| Update the universe tree view |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
UpdateTreeView ( ) ;
}
void OpenRGBE131ReceiverDialog : : on_ButtonRemoveController_clicked ( )
{
/*-----------------------------------------------------*\
| Make selected item is not a top - level ( universe ) |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int selected_controller = ui - > E131TreeView - > indexOfTopLevelItem ( ui - > E131TreeView - > currentItem ( ) ) ;
if ( selected_controller ! = - 1 )
{
return ;
}
/*-----------------------------------------------------*\
| Get index of universe member |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
selected_controller = ui - > E131TreeView - > currentIndex ( ) . row ( ) ;
int selected_universe = ui - > E131TreeView - > indexOfTopLevelItem ( ui - > E131TreeView - > currentItem ( ) - > parent ( ) ) ;
if ( selected_universe = = - 1 )
{
return ;
}
/*-----------------------------------------------------*\
| Remove controller member from universe |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
universe_list [ selected_universe ] . members . erase ( universe_list [ selected_universe ] . members . begin ( ) + selected_controller ) ;
/*-----------------------------------------------------*\
| Update the universe tree view |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
UpdateTreeView ( ) ;
}
void OpenRGBE131ReceiverDialog : : on_ButtonAddUniverse_clicked ( )
{
/*-----------------------------------------------------*\
| Get next universe value |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
unsigned int next_universe = 1 ;
if ( universe_list . size ( ) > 0 )
{
next_universe = universe_list [ universe_list . size ( ) - 1 ] . universe + 1 ;
}
/*-----------------------------------------------------*\
| Create and add new universe to list |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
universe_entry new_universe ;
new_universe . universe = next_universe ;
universe_list . push_back ( new_universe ) ;
/*-----------------------------------------------------*\
| Update the universe tree view |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
UpdateTreeView ( ) ;
}
void OpenRGBE131ReceiverDialog : : on_ButtonRemoveUniverse_clicked ( )
{
/*-----------------------------------------------------*\
| Get index of universe |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int selected_universe = ui - > E131TreeView - > indexOfTopLevelItem ( ui - > E131TreeView - > currentItem ( ) ) ;
if ( selected_universe = = - 1 )
{
return ;
}
/*-----------------------------------------------------*\
| Remove universe |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
universe_list . erase ( universe_list . begin ( ) + selected_universe ) ;
/*-----------------------------------------------------*\
| Update the universe tree view |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
UpdateTreeView ( ) ;
}
2021-01-17 23:36:51 +00:00
void OpenRGBE131ReceiverDialog : : on_ButtonAutoMap_clicked ( )
{
AutoMap ( ) ;
/*-----------------------------------------------------*\
| Update the universe tree view |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
UpdateTreeView ( ) ;
}
2021-01-18 00:16:49 +00:00
void OpenRGBE131ReceiverDialog : : on_ButtonSaveMap_clicked ( )
{
/*-----------------------------------------------------*\
| Create a JSON structure to hold the universe map |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
json universe_map ;
/*-----------------------------------------------------*\
| Loop through the universe list and add universe fields |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
for ( unsigned int universe_index = 0 ; universe_index < universe_list . size ( ) ; universe_index + + )
{
universe_entry universe = universe_list [ universe_index ] ;
universe_map [ " universes " ] [ universe_index ] [ " universe " ] = universe . universe ;
/*-----------------------------------------------------*\
| Loop through all members and add info fields |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
for ( unsigned int member_index = 0 ; member_index < universe . members . size ( ) ; member_index + + )
{
universe_member member = universe . members [ member_index ] ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " start_channel " ] = member . start_channel ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " start_led " ] = member . start_led ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " num_leds " ] = member . num_leds ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " update " ] = member . update ;
2025-08-20 16:44:35 +00:00
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_name " ] = member . controller - > GetName ( ) ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_description " ] = member . controller - > GetDescription ( ) ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_location " ] = member . controller - > GetLocation ( ) ;
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_serial " ] = member . controller - > GetSerial ( ) ;
2021-01-18 00:16:49 +00:00
universe_map [ " universes " ] [ universe_index ] [ " members " ] [ member_index ] [ " controller_led_count " ] = member . controller - > colors . size ( ) ;
}
}
2024-09-06 21:48:47 +00:00
universe_map [ " enable_multicast " ] = ui - > EnableMulticastBox - > checkState ( ) = = Qt : : Checked ;
universe_map [ " enable_autostart " ] = ui - > EnableAutoStartBox - > checkState ( ) = = Qt : : Checked ;
2021-01-18 00:36:15 +00:00
/*-----------------------------------------------------*\
| Write out the JSON structure to a file |
\ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2024-09-06 21:48:47 +00:00
filesystem : : path settings_dir = resource_manager - > GetConfigurationDirectory ( ) / " plugins " / " settings " ;
2025-07-21 05:40:23 +00:00
if ( ! std : : filesystem : : is_directory ( settings_dir ) | | ! std : : filesystem : : exists ( settings_dir ) )
{
2024-09-06 21:48:47 +00:00
std : : filesystem : : create_directories ( settings_dir ) ;
}
std : : ofstream universe_file ( settings_dir / " E131UniverseMap.json " , std : : ios : : out | std : : ios : : binary ) ;
2021-01-18 00:16:49 +00:00
if ( universe_file )
{
try
{
universe_file < < universe_map . dump ( 4 ) ;
}
2025-07-21 05:40:23 +00:00
catch ( std : : exception & e )
2021-01-18 00:16:49 +00:00
{
}
universe_file . close ( ) ;
}
}
2021-01-18 00:36:15 +00:00
void OpenRGBE131ReceiverDialog : : on_ButtonLoadMap_clicked ( )
{
2024-09-06 21:48:47 +00:00
this - > LoadMap ( ) ;
2021-01-18 00:36:15 +00:00
}