Feature: Sends info about session to the API

This commit is contained in:
Afonso Clerigo Mendes de Sousa 2025-10-21 19:01:20 +01:00
parent 9449749b9b
commit c5c9e22ed6
3 changed files with 127 additions and 101 deletions

Binary file not shown.

View File

@ -186,6 +186,7 @@ typedef struct trackAtributesAPI {
typedef struct api_packet { typedef struct api_packet {
u_int8_t tracker_id; u_int8_t tracker_id;
u_int8_t last_updated_carid; u_int8_t last_updated_carid;
u_int8_t connected_cars;
carAtributesAPI cars[64]; carAtributesAPI cars[64];
trackAtributesAPI track_info; trackAtributesAPI track_info;

View File

@ -28,6 +28,7 @@ const int MAX_PLAYERS = 64;
const int SERVER_ID = 130; const int SERVER_ID = 130;
api_packet current_packet; api_packet current_packet;
int apiSent = 0;
// INFO: This assumes Players pointer to be the same size of MAX_PLAYERS // INFO: This assumes Players pointer to be the same size of MAX_PLAYERS
void update_api_packet(trackAtributes trackInfo, carAtributes *players, u_int8_t last_updated_carid) { void update_api_packet(trackAtributes trackInfo, carAtributes *players, u_int8_t last_updated_carid) {
@ -87,6 +88,7 @@ void update_api_packet(trackAtributes trackInfo, carAtributes *players, u_int8_t
} else { } else {
current_packet.last_updated_carid = last_updated_carid; current_packet.last_updated_carid = last_updated_carid;
} }
apiSent = 0;
} }
void *send_to_api_socket(void *arg) { void *send_to_api_socket(void *arg) {
@ -114,12 +116,23 @@ void *send_to_api_socket(void *arg) {
printf("[+] Connected to API socket at %s\n", API_SOCKET_PATH); printf("[+] Connected to API socket at %s\n", API_SOCKET_PATH);
// Handshake
const char *handshake_msg = "ACSP_API_CLIENT";
send(sock_fd, handshake_msg, strlen(handshake_msg), MSG_NOSIGNAL);
while (1) { while (1) {
if (current_packet.tracker_id == (u_int8_t)-1) { if (current_packet.tracker_id == (u_int8_t)-1) {
usleep(10000); usleep(10000);
apiSent = 0;
continue; continue;
} }
ssize_t sent_bytes = send(sock_fd, &current_packet, sizeof(api_packet), 0);
if (apiSent) {
usleep(10000);
continue;
}
ssize_t sent_bytes = send(sock_fd, &current_packet, sizeof(api_packet), MSG_NOSIGNAL);
if (sent_bytes < 0) { if (sent_bytes < 0) {
fprintf(stderr, "[!] Failed to send data to API socket, reconnecting...\n"); fprintf(stderr, "[!] Failed to send data to API socket, reconnecting...\n");
close(sock_fd); close(sock_fd);
@ -143,6 +156,8 @@ void *send_to_api_socket(void *arg) {
printf("[+] Reconnected to API socket at %s\n", API_SOCKET_PATH); printf("[+] Reconnected to API socket at %s\n", API_SOCKET_PATH);
} }
apiSent = 1;
usleep(10000); // 10ms usleep(10000); // 10ms
} }
@ -314,7 +329,7 @@ int main(void) {
printf("\tWeather Graphics: %s\n", trackInfo.weather_graphics); printf("\tWeather Graphics: %s\n", trackInfo.weather_graphics);
printf("\tElapsed Time: %d ms (%2d:%2d:%2d)\n\n", trackInfo.elapsed_ms, trackInfo.elapsed_ms / 60000, (trackInfo.elapsed_ms % 60000) / 1000, printf("\tElapsed Time: %d ms (%2d:%2d:%2d)\n\n", trackInfo.elapsed_ms, trackInfo.elapsed_ms / 60000, (trackInfo.elapsed_ms % 60000) / 1000,
(trackInfo.elapsed_ms % 60000) % 1000); (trackInfo.elapsed_ms % 60000) % 1000);
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_NEW_CONNECTION: // DONE: case ACSP_NEW_CONNECTION: // DONE:
@ -341,7 +356,8 @@ int main(void) {
} }
update.isConnected = 1; // Mark as connected update.isConnected = 1; // Mark as connected
update.isLoading = 1; // Mark as loading update.isLoading = 1; // Mark as Loading
current_packet.connected_cars++;
printf("\tDriver Name: \"%s\"\n", update.driver_name); printf("\tDriver Name: \"%s\"\n", update.driver_name);
printf("\tDriver GUID: \"%s\"\n", update.driver_GUID); printf("\tDriver GUID: \"%s\"\n", update.driver_GUID);
@ -353,7 +369,7 @@ int main(void) {
if (update.carID < MAX_PLAYERS) { if (update.carID < MAX_PLAYERS) {
memcpy(&players[update.carID], &update, sizeof(carAtributes)); memcpy(&players[update.carID], &update, sizeof(carAtributes));
} }
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_CONNECTION_CLOSED: // DONE: case ACSP_CONNECTION_CLOSED: // DONE:
@ -379,7 +395,9 @@ int main(void) {
break; break;
} }
update.isConnected = 0; // Mark as disconnected update.isConnected = 0; // Mark as disconnected
current_packet.connected_cars--;
printf("\tDriver Name: \"%s\"\n", update.driver_name); printf("\tDriver Name: \"%s\"\n", update.driver_name);
printf("\tDriver GUID: \"%s\"\n", update.driver_GUID); printf("\tDriver GUID: \"%s\"\n", update.driver_GUID);
@ -391,7 +409,7 @@ int main(void) {
if (update.carID < MAX_PLAYERS) { if (update.carID < MAX_PLAYERS) {
memcpy(&players[update.carID], &update, sizeof(carAtributes)); memcpy(&players[update.carID], &update, sizeof(carAtributes));
} }
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_CAR_UPDATE: // DONE: case ACSP_CAR_UPDATE: // DONE:
@ -425,8 +443,11 @@ int main(void) {
players[update.carID].carGear = update.carGear; players[update.carID].carGear = update.carGear;
players[update.carID].carRPM = update.carRPM; players[update.carID].carRPM = update.carRPM;
players[update.carID].normalizedSplinePos = update.normalizedSplinePos; players[update.carID].normalizedSplinePos = update.normalizedSplinePos;
players[update.carID].carID = update.carID;
players[update.carID].isConnected = 1; // Ensure isConnected is set
} }
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_CAR_INFO: // DONE: case ACSP_CAR_INFO: // DONE:
@ -464,6 +485,7 @@ int main(void) {
memcpy(&players[update.carID], &update, sizeof(carAtributes)); memcpy(&players[update.carID], &update, sizeof(carAtributes));
} }
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_END_SESSION: // DONE: (only session type cycling) case ACSP_END_SESSION: // DONE: (only session type cycling)
@ -483,6 +505,7 @@ int main(void) {
printf("\tNext Session Name: %s\n", trackInfo.session_name); printf("\tNext Session Name: %s\n", trackInfo.session_name);
printf("\tNext Session Type: %d\n\n", trackInfo.session_type); printf("\tNext Session Type: %d\n\n", trackInfo.session_type);
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_VERSION: // DONE: case ACSP_VERSION: // DONE:
@ -492,6 +515,7 @@ int main(void) {
printf("\tProtocol Version: %d\n\n", trackInfo.protocol_version); printf("\tProtocol Version: %d\n\n", trackInfo.protocol_version);
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_CHAT: // DONE: Receive chat messages case ACSP_CHAT: // DONE: Receive chat messages
@ -505,7 +529,7 @@ int main(void) {
printf("\tCar ID: %d (%s)\n", update.carID, players[update.carID].driver_name); printf("\tCar ID: %d (%s)\n", update.carID, players[update.carID].driver_name);
printf("\tMessage: \"%s\"\n\n", message); printf("\tMessage: \"%s\"\n\n", message);
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_CLIENT_LOADED: // DONE: Check for client loaded status case ACSP_CLIENT_LOADED: // DONE: Check for client loaded status
@ -516,7 +540,7 @@ int main(void) {
players[update.carID].isLoading = 0; players[update.carID].isLoading = 0;
printf("\tCar ID: %d (%s) Finished Loading into the session\n\n", update.carID, players[update.carID].driver_name); printf("\tCar ID: %d (%s) Finished Loading into the session\n\n", update.carID, players[update.carID].driver_name);
update_api_packet(trackInfo, players, update.carID);
break; break;
case ACSP_ERROR: // DONE: Simple error message from server case ACSP_ERROR: // DONE: Simple error message from server
@ -546,7 +570,7 @@ int main(void) {
printf("\tLap Time: %5d ms\n", update.lap_time); printf("\tLap Time: %5d ms\n", update.lap_time);
printf("\tCuts this lap: %d\n", update.cuts); printf("\tCuts this lap: %d\n", update.cuts);
printf("\tTotal Cuts (this session): %d\n\n", update.total_cuts); printf("\tTotal Cuts (this session): %d\n\n", update.total_cuts);
update_api_packet(trackInfo, players, update.carID);
break; break;
// ============================ // ============================
@ -577,6 +601,7 @@ int main(void) {
// TODO: Update total contacts for both players in the database // TODO: Update total contacts for both players in the database
// TAG:2 Update total contacts for both players // TAG:2 Update total contacts for both players
update_api_packet(trackInfo, players, update.carID);
} break; } break;
case ACSP_CE_COLLISION_WITH_ENV: { case ACSP_CE_COLLISION_WITH_ENV: {
@ -588,6 +613,8 @@ int main(void) {
// TODO: Update total contacts for the player in the database // TODO: Update total contacts for the player in the database
// TAG:2 Update total contacts for the player // TAG:2 Update total contacts for the player
update_api_packet(trackInfo, players, update.carID);
} break; } break;
} }
@ -678,8 +705,6 @@ int main(void) {
} }
// OPTIMIZE: This should be done inside each case where data is updated otherwise we lose performance // OPTIMIZE: This should be done inside each case where data is updated otherwise we lose performance
update_api_packet(trackInfo, players, update.carID);
usleep(10000); // Sleep for 10ms usleep(10000); // Sleep for 10ms
} }
close(send_sock_fd); close(send_sock_fd);