feat(agb02/control-box): auto-reconnect and white_button cycle

This commit is contained in:
catvayor 2024-10-15 16:53:44 +02:00
parent bcc156c5fc
commit fecddb1f77
Signed by: lbailly
GPG key ID: CE3E645251AC63F3

View file

@ -75,24 +75,6 @@ int main(const int argc, char const* const* const argv) {
// let the settings apply
std::this_thread::sleep_for(poll_period);
/// init server communication ///
int socket_file_desc = socket(AF_INET, SOCK_STREAM, 0);
{
sockaddr_in socket_addr = {
.sin_family = AF_INET,
.sin_port = htons(1235),
.sin_addr = { .s_addr = inet_addr("10.10.10.1") }
};
int con_ret = connect(socket_file_desc,
reinterpret_cast<const sockaddr*>(&socket_addr),
sizeof(socket_addr));
if(con_ret < 0) {
std::cerr << "Failed to open tcp socket." << std::endl;
return 1;
}
}
/// internal state and buffers ///
std::chrono::time_point now = std::chrono::system_clock::now();
@ -119,6 +101,7 @@ int main(const int argc, char const* const* const argv) {
uint8_t decoder_pos = 0; //TODO: init from server
uint8_t decoder_realpos = read_decoder_realpos(line_reader);
uint8_t white_state = 0;
bool white_pressed = false;
bool black_pressed = false;
@ -126,6 +109,26 @@ int main(const int argc, char const* const* const argv) {
std::chrono::time_point last_send = now;
std::string postData;
/// init server communication ///
int socket_file_desc;
connection:
socket_file_desc = socket(AF_INET, SOCK_STREAM, 0);
{
sockaddr_in socket_addr = {
.sin_family = AF_INET,
.sin_port = htons(1235),
.sin_addr = { .s_addr = inet_addr("10.10.10.1") }
};
while (connect(socket_file_desc,
reinterpret_cast<const sockaddr*>(&socket_addr),
sizeof(socket_addr)) < 0) {
std::cerr << "Failed to open tcp socket, retrying..." << std::endl;
std::this_thread::sleep_for(retry_timeout);
}
std::cout << "Connected." << std::endl;
}
for(;;){
std::this_thread::sleep_for(poll_period);
now = std::chrono::system_clock::now();
@ -153,8 +156,10 @@ int main(const int argc, char const* const* const argv) {
black_pressed = pressed;
pressed = bool(line_reader.get_value(white_button));
if(pressed ^ white_pressed)
if(pressed && !white_pressed){
has_changed = true;
white_state = (white_state + 1)%9;
}
white_pressed = pressed;
/// decoder ///
@ -184,20 +189,22 @@ int main(const int argc, char const* const* const argv) {
"\"pan\": {},"
"\"tilt\": {},"
"\"focus\": {},"
"\"whiteButton\": {},"
"\"blackButton\": {}"
"\"white_button\": {},"
"\"black_button\": {}"
"}}\n",
uint8_t(spot_pos.first),
uint8_t(spot_pos.second),
int(decoder_pos),
white_pressed,
white_state,
black_pressed
);
int wrote = write(socket_file_desc, postData.data(), postData.size());
if(wrote < postData.size()){
std::cerr << "Failed to send data, retrying in " << retry_timeout << "." << std::endl;
last_send = now + retry_timeout - server_ratelimit;
std::cerr << "Failed to send data, reconnecting..." << std::endl;
close(socket_file_desc);
std::this_thread::sleep_for(retry_timeout);
goto connection;
} else {
has_changed = false;
last_send = now;