Stabe: V1.0 - First Stable Release

This commit is contained in:
Afonso Clerigo Mendes de Sousa 2025-10-20 17:12:09 +01:00
parent 650977cfb9
commit e94afdfd9b
4 changed files with 59 additions and 29 deletions

Binary file not shown.

View File

@ -137,3 +137,5 @@ void read_string(const u_int8_t *buf, size_t recv_len, size_t *offset, char *out
*offset += len; *offset += len;
*ok = 1; *ok = 1;
} }

View File

@ -5,6 +5,7 @@
#include <cstdint> #include <cstdint>
#include <sys/cdefs.h> #include <sys/cdefs.h>
#include <sys/types.h> #include <sys/types.h>
struct handshake { struct handshake {
// [not used in the current Remote Telemtry version by AC] // [not used in the current Remote Telemtry version by AC]
// In future versions it will identify the platform type of the client. // In future versions it will identify the platform type of the client.
@ -106,6 +107,7 @@ enum SessionType {
struct trackAtributes { struct trackAtributes {
u_int8_t protocol_version; u_int8_t protocol_version;
u_int8_t session_index; u_int8_t session_index;
u_int8_t current_session_index; u_int8_t current_session_index;
u_int8_t session_count; u_int8_t session_count;

View File

@ -1,6 +1,8 @@
#include <cmath> #include <cmath>
#include <cstddef> #include <cstddef>
#include <cstdlib>
#include <iterator> #include <iterator>
#include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -51,18 +53,16 @@ void init_carupdate(carAtributes *car) {
car->lap_time = 0; car->lap_time = 0;
car->cuts = 0; car->cuts = 0;
car->total_cuts = 0; car->total_cuts = 0;
car->total_cuts_alltime = 0; // TODO: SQL querry to get total cuts of all time; car->total_cuts_alltime = 0; // TODO: SQL querry to get total cuts of all time; TAG:1
// TAG:1
car->total_laps_completed = 0; car->total_laps_completed = 0;
car->contacts = 0; car->contacts = 0;
car->total_contacts = 0; // TODO: SQL querry to get total contacts of all time; car->total_contacts = 0; // TODO: SQL querry to get total contacts of all time; TAG:2
// TAG:2
car->normalizedSplinePos = 0.0f; car->normalizedSplinePos = 0.0f;
} }
int main(void) { int main(void) {
printf("[+] Starting server...\n"); printf("[+] Starting server...\n");
printf("[+] Server listening on port %d\n", SERVER_IN_PORT); printf("[+] Server listening on port %d\n", SERVER_IN_PORT);
printf("[+] Server sending to %s:%d\n\n", SERVER_OUT_IP, SERVER_OUT_PORT); printf("[+] Server sending to %s:%d\n\n", SERVER_OUT_IP, SERVER_OUT_PORT);
@ -98,6 +98,7 @@ int main(void) {
char message[124] = {0}; // just a place to put info messages from the server itself char message[124] = {0}; // just a place to put info messages from the server itself
printf("\n"); printf("\n");
while (1) { while (1) {
offset = 0; offset = 0;
@ -120,7 +121,7 @@ int main(void) {
case ACSP_SESSION_INFO: case ACSP_SESSION_INFO:
printf("[+] Message Type: ACSP_SESSION_INFO\n"); printf("[+] Message Type: ACSP_SESSION_INFO\n");
goto skip_message; goto skip_message;
case ACSP_NEW_SESSION: // DONE case ACSP_NEW_SESSION: // DONE:
printf("[+] Message Type: ACSP_NEW_SESSION\n"); printf("[+] Message Type: ACSP_NEW_SESSION\n");
skip_message: skip_message:
offset = 1; // Reset offset to 1 to read after message types offset = 1; // Reset offset to 1 to read after message types
@ -433,13 +434,12 @@ int main(void) {
printf("Car ID: %d (%s) collided with Car ID: %d (%s)\n", update.carID, players[update.carID].driver_name, event_car_id, players[event_car_id].driver_name); printf("Car ID: %d (%s) collided with Car ID: %d (%s)\n", update.carID, players[update.carID].driver_name, event_car_id, players[event_car_id].driver_name);
players[update.carID].contacts++;
players[update.carID].contacts++; players[event_car_id].contacts++;
players[event_car_id].contacts++;
// TODO: Update total contacts for both players in the database
// TAG:2 Update total contacts for both players
// TODO: Update total contacts for both players in the database
// TAG:2 Update total contacts for both players
} break; } break;
case ACSP_CE_COLLISION_WITH_ENV: { case ACSP_CE_COLLISION_WITH_ENV: {
@ -447,15 +447,15 @@ int main(void) {
printf("Car ID: %d (%s) collided with the environment\n", update.carID, players[update.carID].driver_name); printf("Car ID: %d (%s) collided with the environment\n", update.carID, players[update.carID].driver_name);
players[update.carID].contacts++; players[update.carID].contacts++;
// 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
} break; } break;
} }
// TODO: possible iRacing style impact severity system // TODO: possible iRacing style impact severity system
// With X velues and (e.g >5 m/s = 0x, >10 m/s = 2x, >15 m/s = 4x) && Blackflag limits (e.g x17 = DQ) // With X velues and (e.g >5 m/s = 0x, >10 m/s = 2x, >15 m/s = 4x) && Blackflag limits (e.g x17 = DQ)
float impact_speed = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok); float impact_speed = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
postion world_pos = {0}; postion world_pos = {0};
@ -463,15 +463,14 @@ int main(void) {
world_pos.y = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok); world_pos.y = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
world_pos.z = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok); world_pos.z = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
postion rel_pos = {0}; postion rel_pos = {0};
rel_pos.x = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok); rel_pos.x = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
rel_pos.y = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok); rel_pos.y = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
rel_pos.z = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok); rel_pos.z = read_float((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
printf("\tImpact Speed: %.2f m/s\n", impact_speed);
printf("\tWorld Position: X: %.2f Y: %.2f Z: %.2f\n", world_pos.x, world_pos.y, world_pos.z);
printf("\tRelative Position: X: %.2f Y: %.2f Z: %.2f\n\n", rel_pos.x, rel_pos.y, rel_pos.z);
printf("\tImpact Speed: %.2f m/s\n", impact_speed);
printf("\tWorld Position: X: %.2f Y: %.2f Z: %.2f\n", world_pos.x, world_pos.y, world_pos.z);
printf("\tRelative Position: X: %.2f Y: %.2f Z: %.2f\n\n", rel_pos.x, rel_pos.y, rel_pos.z);
} break; } break;
@ -480,6 +479,7 @@ int main(void) {
// //
// ============================ // ============================
// CLIENT → SERVER COMMANDS // CLIENT → SERVER COMMANDS
// NOTE: These are not meant to be here, these are comands to SEND to the server
// ============================ // ============================
case ACSP_REALTIMEPOS_INTERVAL: case ACSP_REALTIMEPOS_INTERVAL:
printf("[+] Command: ACSP_REALTIMEPOS_INTERVAL\n"); printf("[+] Command: ACSP_REALTIMEPOS_INTERVAL\n");
@ -517,9 +517,20 @@ int main(void) {
printf("[+] Command: ACSP_RESTART_SESSION\n"); printf("[+] Command: ACSP_RESTART_SESSION\n");
break; break;
case ACSP_ADMIN_COMMAND: case ACSP_ADMIN_COMMAND: { // DONE:
printf("[+] Command: ACSP_ADMIN_COMMAND\n"); printf("[+] Command: ACSP_ADMIN_COMMAND\n");
break; char *buffer = (char *)malloc(256);
char command[256] = "/settime 19:00"; // TEST:
buffer[0] = (char)ACSP_ADMIN_COMMAND;
for (int i = 1; i <= strlen(command); i++) {
buffer[i] = command[i - 1];
}
sendto(send_sock_fd, buffer, strlen(command) + 1, 0, NULL, 0);
printf("\tSent Admin Command: %s\n\n", command);
free(buffer);
} break;
// ============================ // ============================
// DEFAULT HANDLER // DEFAULT HANDLER
@ -534,6 +545,21 @@ int main(void) {
close(send_sock_fd); close(send_sock_fd);
close(recv_sock_fd); close(recv_sock_fd);
// Free allocated memory
free(update.car_model);
free(update.driver_GUID);
free(update.car_skin);
free(update.driver_name);
free(update.driver_team);
for (int i = 0; i < MAX_PLAYERS; i++) {
free(players[i].car_model);
free(players[i].driver_GUID);
free(players[i].car_skin);
free(players[i].driver_name);
free(players[i].driver_team);
}
free(trackInfo.server_name); free(trackInfo.server_name);
free(trackInfo.track); free(trackInfo.track);
free(trackInfo.track_config); free(trackInfo.track_config);