5
5
#include < stdint.h>
6
6
#include < string.h>
7
7
8
+ #include " broadcast_server.h"
8
9
#include " custom_cast.h"
9
10
#include " json.hpp"
10
11
#include " network_interfaces.h"
@@ -20,7 +21,7 @@ Emotibit::Emotibit (struct BrainFlowInputParams params)
20
21
{
21
22
data_socket = NULL ;
22
23
control_socket = NULL ;
23
- advertise_socket_server = NULL ;
24
+ adv_socket = NULL ;
24
25
keep_alive = false ;
25
26
initialized = false ;
26
27
control_port = -1 ;
@@ -70,10 +71,10 @@ int Emotibit::prepare_session ()
70
71
71
72
if (res != (int )BrainFlowExitCodes::STATUS_OK)
72
73
{
73
- if (advertise_socket_server != NULL )
74
+ if (adv_socket != NULL )
74
75
{
75
- delete advertise_socket_server ;
76
- advertise_socket_server = NULL ;
76
+ delete adv_socket ;
77
+ adv_socket = NULL ;
77
78
}
78
79
if (data_socket != NULL )
79
80
{
@@ -165,11 +166,11 @@ int Emotibit::release_session ()
165
166
delete control_socket;
166
167
control_socket = NULL ;
167
168
}
168
- if (advertise_socket_server )
169
+ if (adv_socket )
169
170
{
170
- advertise_socket_server ->close ();
171
- delete advertise_socket_server ;
172
- advertise_socket_server = NULL ;
171
+ adv_socket ->close ();
172
+ delete adv_socket ;
173
+ adv_socket = NULL ;
173
174
}
174
175
control_port = -1 ;
175
176
data_port = -1 ;
@@ -596,14 +597,14 @@ int Emotibit::create_adv_connection ()
596
597
597
598
for (std::string broadcast_address : broadcast_addresses)
598
599
{
600
+ BroadCastServer *advertise_socket =
601
+ new BroadCastServer (broadcast_address.c_str (), WIFI_ADVERTISING_PORT);
599
602
res = (int )BrainFlowExitCodes::STATUS_OK;
600
603
safe_logger (
601
604
spdlog::level::info, " trying broadcast address: {}" , broadcast_address.c_str ());
602
605
if (res == (int )BrainFlowExitCodes::STATUS_OK)
603
606
{
604
- advertise_socket_server =
605
- new BroadCastServer (broadcast_address.c_str (), WIFI_ADVERTISING_PORT);
606
- int init_res = advertise_socket_server->init ();
607
+ int init_res = advertise_socket->init ();
607
608
if (init_res != (int )BroadCastServerReturnCodes::STATUS_OK)
608
609
{
609
610
safe_logger (spdlog::level::err, " failed to init broadcast server socket: {}" , res);
@@ -614,7 +615,7 @@ int Emotibit::create_adv_connection ()
614
615
{
615
616
std::string package = create_package (HELLO_EMOTIBIT, 0 , " " , 0 );
616
617
safe_logger (spdlog::level::info, " sending package: {}" , package.c_str ());
617
- int bytes_send = advertise_socket_server ->send (package.c_str (), (int )package.size ());
618
+ int bytes_send = advertise_socket ->send (package.c_str (), (int )package.size ());
618
619
if (bytes_send != (int )package.size ())
619
620
{
620
621
safe_logger (
@@ -632,8 +633,8 @@ int Emotibit::create_adv_connection ()
632
633
double start_time = get_timestamp ();
633
634
for (int i = 0 ; (i < 100 ) && (!found); i++)
634
635
{
635
- int bytes_recv = advertise_socket_server-> recv (
636
- recv_data, max_size, emotibit_ip, max_ip_addr_size);
636
+ int bytes_recv =
637
+ advertise_socket-> recv ( recv_data, max_size, emotibit_ip, max_ip_addr_size);
637
638
if (bytes_recv > 0 )
638
639
{
639
640
std::vector<std::string> splitted_packages =
@@ -679,19 +680,40 @@ int Emotibit::create_adv_connection ()
679
680
res = (int )BrainFlowExitCodes::BOARD_NOT_READY_ERROR;
680
681
}
681
682
}
682
- if (res != ( int )BrainFlowExitCodes::STATUS_OK )
683
+ if (advertise_socket != NULL )
683
684
{
684
- if (advertise_socket_server != NULL )
685
- {
686
- delete advertise_socket_server;
687
- advertise_socket_server = NULL ;
688
- }
685
+ delete advertise_socket;
686
+ advertise_socket = NULL ;
689
687
}
690
- else
688
+ if (res == ( int )BrainFlowExitCodes::STATUS_OK)
691
689
{
692
690
break ;
693
691
}
694
692
}
693
+ // we dont need broadcast anymore, replace it with normal socket
694
+ if (res == (int )BrainFlowExitCodes::STATUS_OK)
695
+ {
696
+ // ugly but makes it safer
697
+ #ifdef _WIN32
698
+ Sleep (1000 );
699
+ #else
700
+ usleep (1000000 );
701
+ #endif
702
+ adv_socket = new SocketClientUDP (ip_address.c_str (), WIFI_ADVERTISING_PORT);
703
+ if (adv_socket->connect () != ((int )SocketClientUDPReturnCodes::STATUS_OK))
704
+ {
705
+ safe_logger (spdlog::level::err, " Failed to bind adv_socket" );
706
+ res = (int )BrainFlowExitCodes::SET_PORT_ERROR;
707
+ adv_socket->close ();
708
+ delete adv_socket;
709
+ adv_socket = NULL ;
710
+ }
711
+ else
712
+ {
713
+ safe_logger (spdlog::level::debug, " adv_connection established, ip: {}, port: {}" ,
714
+ ip_address, WIFI_ADVERTISING_PORT);
715
+ }
716
+ }
695
717
return res;
696
718
}
697
719
@@ -771,7 +793,7 @@ int Emotibit::send_connect_msg ()
771
793
safe_logger (spdlog::level::info, " sending connect package: {}" , package.c_str ());
772
794
773
795
int res = (int )BrainFlowExitCodes::STATUS_OK;
774
- int bytes_send = advertise_socket_server ->send (package.c_str (), (int )package.size ());
796
+ int bytes_send = adv_socket ->send (package.c_str (), (int )package.size ());
775
797
if (bytes_send != (int )package.size ())
776
798
{
777
799
safe_logger (spdlog::level::err, " failed to send connect package, res is {}" , bytes_send);
@@ -860,7 +882,7 @@ void Emotibit::ping_thread ()
860
882
payload.push_back (std::to_string (data_port));
861
883
std::string package = create_package (PING, package_num++, payload);
862
884
// safe_logger (spdlog::level::trace, "sending package: {}", package.c_str ());
863
- int bytes_send = advertise_socket_server ->send (package.c_str (), (int )package.size ());
885
+ int bytes_send = adv_socket ->send (package.c_str (), (int )package.size ());
864
886
if (bytes_send != (int )package.size ())
865
887
{
866
888
safe_logger (spdlog::level::err, " failed to send adv package, res is {}" , bytes_send);
0 commit comments