|
|
|
@ -12,7 +12,6 @@
|
|
|
|
|
#define NS_PER_S 1000000000
|
|
|
|
|
|
|
|
|
|
struct timespec finish, delta;
|
|
|
|
|
int pausedTime = 0;
|
|
|
|
|
bool timerActive = false;
|
|
|
|
|
bool paused = false;
|
|
|
|
|
bool alive = true;
|
|
|
|
@ -25,6 +24,7 @@ enum event_type {
|
|
|
|
|
SKIP,
|
|
|
|
|
PAUSE,
|
|
|
|
|
RESUME,
|
|
|
|
|
RESET,
|
|
|
|
|
STOP
|
|
|
|
|
};
|
|
|
|
|
struct run_event {
|
|
|
|
@ -38,8 +38,8 @@ struct segment {
|
|
|
|
|
};
|
|
|
|
|
struct route {
|
|
|
|
|
char *name;
|
|
|
|
|
struct segment *segments;
|
|
|
|
|
int segment_count;
|
|
|
|
|
struct segment *segments;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct run_event *run;
|
|
|
|
@ -53,7 +53,7 @@ char *default_file_name = "untitled.quest";
|
|
|
|
|
int run_count = 0;
|
|
|
|
|
int files = 0;
|
|
|
|
|
char **filePaths = NULL;
|
|
|
|
|
char **names, **values;
|
|
|
|
|
char **meta_keys, **meta_values;
|
|
|
|
|
int valuecount;
|
|
|
|
|
struct segment *segments;
|
|
|
|
|
int segment_count = 0;
|
|
|
|
@ -72,11 +72,13 @@ void timespecToRFC3339(struct timespec t, char buf[]);
|
|
|
|
|
void loadFiles();
|
|
|
|
|
void add_segment(char *sname, char *lname, char *desc);
|
|
|
|
|
void addFile(char *path);
|
|
|
|
|
void sendValue(int sock, char* name);
|
|
|
|
|
void sendInt(int sock, int value);
|
|
|
|
|
void doprocessing (int sock);
|
|
|
|
|
void addPauseTime();
|
|
|
|
|
void subtractPauseTime();
|
|
|
|
|
void sendValue(int sock, char* name);
|
|
|
|
|
void sendString(int sock, char* str);
|
|
|
|
|
void process_socket_input(int sock);
|
|
|
|
|
void set_metadata(char *key, char *value);
|
|
|
|
|
void save_metadata_to_file(char *token, char *token2);
|
|
|
|
|
void reset_timer();
|
|
|
|
|
int current_ms();
|
|
|
|
|
|
|
|
|
|
//basic timer commands
|
|
|
|
@ -88,9 +90,11 @@ void undo();
|
|
|
|
|
void redo();
|
|
|
|
|
void pause_timer();
|
|
|
|
|
void resume();
|
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
|
|
//convenient combination commands
|
|
|
|
|
void start_split_stop();
|
|
|
|
|
void start_reset();
|
|
|
|
|
void start_split();
|
|
|
|
|
void split_stop();
|
|
|
|
|
void start_stop();
|
|
|
|
@ -148,6 +152,7 @@ void add_event(enum event_type t)
|
|
|
|
|
offset_timespec(timerOffset, &run[runMarker].time);
|
|
|
|
|
runMarker++;
|
|
|
|
|
runMarker2 = runMarker;
|
|
|
|
|
hasUndoneAtLeastOnce = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void reset_timer()
|
|
|
|
@ -179,6 +184,16 @@ void stop()
|
|
|
|
|
runUnsaved = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Identical function to stop() but with a RESET event
|
|
|
|
|
void reset()
|
|
|
|
|
{
|
|
|
|
|
if (!timerActive) return;
|
|
|
|
|
timerActive = false;
|
|
|
|
|
add_event(RESET);
|
|
|
|
|
finish = run[runMarker - 1].time;
|
|
|
|
|
runUnsaved = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void start_split_stop()
|
|
|
|
|
{
|
|
|
|
|
if (!timerActive) {
|
|
|
|
@ -210,6 +225,12 @@ void start_stop()
|
|
|
|
|
else stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void start_reset()
|
|
|
|
|
{
|
|
|
|
|
if (!timerActive) start();
|
|
|
|
|
else reset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void split()
|
|
|
|
|
{
|
|
|
|
|
if (!timerActive) return;
|
|
|
|
@ -222,46 +243,20 @@ void skip()
|
|
|
|
|
add_event(SKIP);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void addPauseTime()
|
|
|
|
|
{
|
|
|
|
|
int pauseEvent = 0;
|
|
|
|
|
for (int i = runMarker - 2; i >= 1; i--) {
|
|
|
|
|
if (run[i].type == PAUSE) {
|
|
|
|
|
pauseEvent = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sub_timespec(run[pauseEvent].time, run[runMarker - 1].time, &delta);
|
|
|
|
|
pausedTime += timespecToMS(delta);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void subtractPauseTime()
|
|
|
|
|
{
|
|
|
|
|
int pauseEvent = 0;
|
|
|
|
|
for (int i = runMarker - 1; i >= i; i--) {
|
|
|
|
|
if (run[i].type == PAUSE) {
|
|
|
|
|
pauseEvent = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sub_timespec(run[pauseEvent].time, run[runMarker].time, &delta);
|
|
|
|
|
pausedTime -= timespecToMS(delta);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void undo()
|
|
|
|
|
{
|
|
|
|
|
if (!timerActive) return;
|
|
|
|
|
if (runMarker > 0) {
|
|
|
|
|
runMarker--;
|
|
|
|
|
if (run[runMarker].type == STOP)
|
|
|
|
|
if (run[runMarker].type == STOP) {
|
|
|
|
|
timerActive = true;
|
|
|
|
|
runUnsaved = false;
|
|
|
|
|
}
|
|
|
|
|
if (run[runMarker].type == START)
|
|
|
|
|
timerActive = false;
|
|
|
|
|
if (run[runMarker].type == PAUSE)
|
|
|
|
|
paused = false;
|
|
|
|
|
if (run[runMarker].type == RESUME) {
|
|
|
|
|
paused = true;
|
|
|
|
|
subtractPauseTime();
|
|
|
|
|
}
|
|
|
|
|
hasUndoneAtLeastOnce = true;
|
|
|
|
|
}
|
|
|
|
@ -272,17 +267,20 @@ void redo()
|
|
|
|
|
if (!timerActive) return;
|
|
|
|
|
if (runMarker < runMarker2) {
|
|
|
|
|
runMarker++;
|
|
|
|
|
if (run[runMarker - 1].type == STOP)
|
|
|
|
|
if (run[runMarker - 1].type == STOP) {
|
|
|
|
|
timerActive = false;
|
|
|
|
|
runUnsaved = true;
|
|
|
|
|
finish = run[runMarker - 1].time;
|
|
|
|
|
}
|
|
|
|
|
if (run[runMarker - 1].type == START)
|
|
|
|
|
timerActive = true;
|
|
|
|
|
if (run[runMarker - 1].type == PAUSE)
|
|
|
|
|
paused = true;
|
|
|
|
|
if (run[runMarker - 1].type == RESUME) {
|
|
|
|
|
paused = false;
|
|
|
|
|
addPauseTime();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
if (runMarker == runMarker2) {
|
|
|
|
|
hasUndoneAtLeastOnce = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -309,7 +307,6 @@ void resume()
|
|
|
|
|
if (paused) {
|
|
|
|
|
add_event(RESUME);
|
|
|
|
|
paused = false;
|
|
|
|
|
addPauseTime();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -359,6 +356,9 @@ void appendRunToFile()
|
|
|
|
|
case RESUME:
|
|
|
|
|
fprintf(fp, "\t%s\n", "Resume");
|
|
|
|
|
break;
|
|
|
|
|
case RESET:
|
|
|
|
|
fprintf(fp, "\t%s\n", "Reset");
|
|
|
|
|
break;
|
|
|
|
|
case STOP:
|
|
|
|
|
fprintf(fp, "\t%s\n", "Stop");
|
|
|
|
|
break;
|
|
|
|
@ -397,7 +397,6 @@ void loadFiles()
|
|
|
|
|
char buff2[255];
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < files; i++) {
|
|
|
|
|
printf("loading file: \"%s\"\n", filePaths[i]);
|
|
|
|
|
fp = fopen(filePaths[i], "r+");
|
|
|
|
|
while(1) {
|
|
|
|
|
if (!fgets(buff, 255, fp))
|
|
|
|
@ -443,33 +442,14 @@ void loadFiles()
|
|
|
|
|
if (!fgets(buff2, 255, fp))
|
|
|
|
|
break;
|
|
|
|
|
if (buff2[0] == '\t') {
|
|
|
|
|
valuecount++;
|
|
|
|
|
|
|
|
|
|
names = realloc(names, sizeof(char*) * valuecount);
|
|
|
|
|
names[valuecount - 1] = malloc(strlen(buff));
|
|
|
|
|
strncpy(names[valuecount - 1], buff, strlen(buff) - 1);
|
|
|
|
|
names[valuecount - 1][strlen(buff)] = '\0';
|
|
|
|
|
|
|
|
|
|
values = realloc(values, sizeof(char*) * valuecount);
|
|
|
|
|
values[valuecount - 1] = malloc(strlen(buff2) - 1);
|
|
|
|
|
strncpy(values[valuecount - 1], buff2 + 1, strlen(buff2) - 1);
|
|
|
|
|
values[valuecount - 1][strlen(buff2)] = '\0';
|
|
|
|
|
buff[strlen(buff) - 1] = '\0';
|
|
|
|
|
buff2[strlen(buff2) - 1] = '\0';
|
|
|
|
|
set_metadata(buff, buff2 + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Print metadata arrays
|
|
|
|
|
for (int i = 0; i < valuecount; i++) {
|
|
|
|
|
printf("%s | %s", names[i], values[i]);
|
|
|
|
|
}
|
|
|
|
|
//Print segments
|
|
|
|
|
for (int i = 0; i < segment_count; i++) {
|
|
|
|
|
printf("Segment %d: %s\n", i, segments[i].shortname);
|
|
|
|
|
}
|
|
|
|
|
//Print run count
|
|
|
|
|
printf("%d\n", run_count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void add_segment(char *sname, char *lname, char *desc)
|
|
|
|
@ -494,18 +474,18 @@ int current_ms()
|
|
|
|
|
{
|
|
|
|
|
if (timerActive)
|
|
|
|
|
clock_gettime(CLOCK_REALTIME, &finish);
|
|
|
|
|
if (paused) {
|
|
|
|
|
sub_timespec(run[0].time, run[runMarker - 1].time, &delta);
|
|
|
|
|
} else {
|
|
|
|
|
//if (paused) {
|
|
|
|
|
// sub_timespec(run[0].time, run[runMarker - 1].time, &delta);
|
|
|
|
|
//} else {
|
|
|
|
|
sub_timespec(run[0].time, finish, &delta);
|
|
|
|
|
}
|
|
|
|
|
return timespecToMS(delta) - pausedTime;
|
|
|
|
|
//}
|
|
|
|
|
return timespecToMS(delta);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void sendInt(int sock, int value)
|
|
|
|
|
{
|
|
|
|
|
char buffer[256];
|
|
|
|
|
strncpy(buffer, (char*)&value, sizeof(int));
|
|
|
|
|
sprintf(buffer, "%d", value);
|
|
|
|
|
int n = write(sock, &buffer, 256);
|
|
|
|
|
if (n < 0) {
|
|
|
|
|
perror("ERROR writing to socket");
|
|
|
|
@ -518,16 +498,20 @@ void sendValue(int sock, char* name)
|
|
|
|
|
char buffer[256];
|
|
|
|
|
int n, x;
|
|
|
|
|
bool namefound = false;
|
|
|
|
|
for(int i = 0; i < valuecount; i++) {
|
|
|
|
|
if (!strcmp(names[i], name)) {
|
|
|
|
|
x = i;
|
|
|
|
|
namefound = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (namefound)
|
|
|
|
|
strcpy(buffer, values[x]);
|
|
|
|
|
else
|
|
|
|
|
if (name == NULL) {
|
|
|
|
|
strcpy(buffer, "DATA NOT PRESENT");
|
|
|
|
|
} else {
|
|
|
|
|
for(int i = 0; i < valuecount; i++) {
|
|
|
|
|
if (!strcmp(meta_keys[i], name)) {
|
|
|
|
|
x = i;
|
|
|
|
|
namefound = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (namefound)
|
|
|
|
|
strcpy(buffer, meta_values[x]);
|
|
|
|
|
else
|
|
|
|
|
strcpy(buffer, "DATA NOT PRESENT");
|
|
|
|
|
}
|
|
|
|
|
n = write(sock, &buffer, 256);
|
|
|
|
|
if (n < 0) {
|
|
|
|
|
perror("ERROR writing to socket");
|
|
|
|
@ -535,81 +519,252 @@ void sendValue(int sock, char* name)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void doprocessing (int sock)
|
|
|
|
|
void sendString(int sock, char* str)
|
|
|
|
|
{
|
|
|
|
|
char buffer[256];
|
|
|
|
|
strcpy(buffer, str);
|
|
|
|
|
int n = write(sock, &buffer, 256);
|
|
|
|
|
if (n < 0) {
|
|
|
|
|
perror("ERROR writing to socket");
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void set_metadata(char *key, char *value)
|
|
|
|
|
{
|
|
|
|
|
char key_pos = -1;
|
|
|
|
|
for (int i = 0; i < valuecount; i++)
|
|
|
|
|
if (!strcmp(meta_keys[i], key))
|
|
|
|
|
key_pos = i;
|
|
|
|
|
if (key_pos > -1) {
|
|
|
|
|
meta_values[key_pos] = realloc(meta_values[key_pos], strlen(value));
|
|
|
|
|
strncpy(meta_values[key_pos], value, strlen(value));
|
|
|
|
|
meta_values[key_pos][strlen(value)] = '\0';
|
|
|
|
|
} else {
|
|
|
|
|
valuecount++;
|
|
|
|
|
|
|
|
|
|
meta_keys = realloc(meta_keys, sizeof(char*) * valuecount);
|
|
|
|
|
meta_keys[valuecount - 1] = malloc(strlen(key));
|
|
|
|
|
strncpy(meta_keys[valuecount - 1], key, strlen(key));
|
|
|
|
|
meta_keys[valuecount - 1][strlen(key)] = '\0';
|
|
|
|
|
|
|
|
|
|
meta_values = realloc(meta_values, sizeof(char*) * valuecount);
|
|
|
|
|
meta_values[valuecount - 1] = malloc(strlen(value));
|
|
|
|
|
strncpy(meta_values[valuecount - 1], value, strlen(value));
|
|
|
|
|
meta_values[valuecount - 1][strlen(value)] = '\0';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void save_metadata_to_file(char *token, char *token2)
|
|
|
|
|
{
|
|
|
|
|
char* save_path = NULL;
|
|
|
|
|
if (files <= 0)
|
|
|
|
|
save_path = default_file_name;
|
|
|
|
|
else
|
|
|
|
|
save_path = filePaths[0];
|
|
|
|
|
FILE* fp;
|
|
|
|
|
|
|
|
|
|
fp = fopen(save_path, "r+");
|
|
|
|
|
fprintf(fp, "%s\n", token);
|
|
|
|
|
fprintf(fp, "\t%s\n\n", token2);
|
|
|
|
|
fclose(fp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void process_socket_input(int sock)
|
|
|
|
|
{
|
|
|
|
|
int n;
|
|
|
|
|
char buffer[256];
|
|
|
|
|
n = read(sock, &buffer, 256);
|
|
|
|
|
|
|
|
|
|
if (n < 0) {
|
|
|
|
|
perror("ERROR reading from socket");
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
if (!strcmp(buffer, "current_time")) {
|
|
|
|
|
//printf("Recieved time command\n");
|
|
|
|
|
sendInt(sock, current_ms());
|
|
|
|
|
} else if (!strcmp(buffer, "start")) {
|
|
|
|
|
printf("Recieved start command\n");
|
|
|
|
|
char *token = strtok(buffer, " ");
|
|
|
|
|
|
|
|
|
|
//Imperative commands
|
|
|
|
|
if (!strcmp(token, "start")) {
|
|
|
|
|
start();
|
|
|
|
|
} else if (!strcmp(buffer, "stop")) {
|
|
|
|
|
printf("Recieved stop command\n");
|
|
|
|
|
} else if (!strcmp(token, "stop")) {
|
|
|
|
|
stop();
|
|
|
|
|
} else if (!strcmp(buffer, "kill")) {
|
|
|
|
|
printf("Recieved kill command\n");
|
|
|
|
|
} else if (!strcmp(token, "reset")) {
|
|
|
|
|
reset();
|
|
|
|
|
} else if (!strcmp(token, "kill")) {
|
|
|
|
|
alive = false;
|
|
|
|
|
} else if (!strcmp(buffer, "split")) {
|
|
|
|
|
printf("Recieved split command\n");
|
|
|
|
|
} else if (!strcmp(token, "split")) {
|
|
|
|
|
split();
|
|
|
|
|
} else if (!strcmp(buffer, "skip")) {
|
|
|
|
|
printf("Recieved skip command\n");
|
|
|
|
|
} else if (!strcmp(token, "skip")) {
|
|
|
|
|
skip();
|
|
|
|
|
} else if (!strcmp(buffer, "pause")) {
|
|
|
|
|
printf("Recieved pause command\n");
|
|
|
|
|
} else if (!strcmp(token, "pause")) {
|
|
|
|
|
pause_timer();
|
|
|
|
|
} else if (!strcmp(buffer, "resume")) {
|
|
|
|
|
printf("Recieved resume command\n");
|
|
|
|
|
} else if (!strcmp(token, "resume")) {
|
|
|
|
|
resume();
|
|
|
|
|
} else if (!strcmp(buffer, "undo")) {
|
|
|
|
|
printf("Recieved undo command\n");
|
|
|
|
|
} else if (!strcmp(token, "undo")) {
|
|
|
|
|
undo();
|
|
|
|
|
} else if (!strcmp(buffer, "redo")) {
|
|
|
|
|
printf("Recieved redo command\n");
|
|
|
|
|
} else if (!strcmp(token, "redo")) {
|
|
|
|
|
redo();
|
|
|
|
|
} else if (!strcmp(buffer, "Foreground-Color")) {
|
|
|
|
|
printf("Recieved request for foreground color\n");
|
|
|
|
|
sendValue(sock, "Foreground-Color");
|
|
|
|
|
} else if (!strcmp(buffer, "Background-Color")) {
|
|
|
|
|
printf("Recieved request for background color\n");
|
|
|
|
|
sendValue(sock, "Background-Color");
|
|
|
|
|
} else if (!strcmp(buffer, "save")) {
|
|
|
|
|
printf("Recieved save command\n");
|
|
|
|
|
} else if (!strcmp(token, "save")) {
|
|
|
|
|
appendRunToFile();
|
|
|
|
|
} else if (!strcmp(buffer, "run_count")) {
|
|
|
|
|
printf("Recieved request for run count\n");
|
|
|
|
|
sendInt(sock, run_count);
|
|
|
|
|
} else if (!strcmp(buffer, "segment_count")) {
|
|
|
|
|
printf("Recieved request for segment count\n");
|
|
|
|
|
sendInt(sock, segment_count);
|
|
|
|
|
} else if (!strcmp(buffer, "start_split_stop")) {
|
|
|
|
|
printf("Recieved start_split_stop command\n");
|
|
|
|
|
} else if (!strcmp(token, "start-split-stop")) {
|
|
|
|
|
start_split_stop();
|
|
|
|
|
} else if (!strcmp(buffer, "pause_resume")) {
|
|
|
|
|
printf("Recieved pause_resume command\n");
|
|
|
|
|
} else if (!strcmp(token, "pause-resume")) {
|
|
|
|
|
pause_resume();
|
|
|
|
|
} else if (!strcmp(buffer, "start-stop")) {
|
|
|
|
|
printf("Recieved start-stop command\n");
|
|
|
|
|
} else if (!strcmp(token, "start-stop")) {
|
|
|
|
|
start_stop();
|
|
|
|
|
} else if (!strcmp(buffer, "start-split")) {
|
|
|
|
|
printf("Recieved start-split command\n");
|
|
|
|
|
} else if (!strcmp(token, "start-reset")) {
|
|
|
|
|
start_reset();
|
|
|
|
|
} else if (!strcmp(token, "start-split")) {
|
|
|
|
|
start_split();
|
|
|
|
|
} else if (!strcmp(buffer, "split-stop")) {
|
|
|
|
|
printf("Recieved split-stop command\n");
|
|
|
|
|
} else if (!strcmp(token, "split-stop")) {
|
|
|
|
|
split_stop();
|
|
|
|
|
} else if (!strcmp(buffer, "undo-redo")) {
|
|
|
|
|
printf("Recieved undo-redo command\n");
|
|
|
|
|
} else if (!strcmp(token, "undo-redo")) {
|
|
|
|
|
undo_redo();
|
|
|
|
|
} else {
|
|
|
|
|
printf("Recieved invalid command, ignoring...\n");
|
|
|
|
|
|
|
|
|
|
//Getters
|
|
|
|
|
} else if (!strcmp(token, "get")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
if (!strcmp(token, "current_time")) {
|
|
|
|
|
sendInt(sock, current_ms());
|
|
|
|
|
} else if (!strcmp(token, "current_time_with_pause")) {
|
|
|
|
|
int running_pause = 0;
|
|
|
|
|
struct timespec p, r;
|
|
|
|
|
bool tracking_pause = false;
|
|
|
|
|
for (int i = 0; i < runMarker; i++) {
|
|
|
|
|
if (run[i].type == PAUSE) {
|
|
|
|
|
sub_timespec(run[0].time, run[i].time, &p);
|
|
|
|
|
tracking_pause = true;
|
|
|
|
|
}
|
|
|
|
|
if (run[i].type == RESUME) {
|
|
|
|
|
sub_timespec(run[0].time, run[i].time, &r);
|
|
|
|
|
running_pause += timespecToMS(r) - timespecToMS(p);
|
|
|
|
|
tracking_pause = false;
|
|
|
|
|
} else if (i == runMarker - 1 && tracking_pause) {
|
|
|
|
|
running_pause += current_ms() - timespecToMS(p);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sendInt(sock, current_ms() - running_pause);
|
|
|
|
|
} else if (!strcmp(token, "run_count")) {
|
|
|
|
|
sendInt(sock, run_count);
|
|
|
|
|
} else if (!strcmp(token, "segment_count")) {
|
|
|
|
|
sendInt(sock, segment_count);
|
|
|
|
|
} else if (!strcmp(token, "route_count")) {
|
|
|
|
|
sendInt(sock, route_count);
|
|
|
|
|
} else if (!strcmp(token, "event_count")) {
|
|
|
|
|
sendInt(sock, runMarker);
|
|
|
|
|
} else if (!strcmp(token, "segment_shortname")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x = atoi(token);
|
|
|
|
|
sendString(sock, segments[x].shortname);
|
|
|
|
|
} else if (!strcmp(token, "segment_longname")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x = atoi(token);
|
|
|
|
|
sendString(sock, segments[x].longname);
|
|
|
|
|
} else if (!strcmp(token, "segment_description")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x = atoi(token);
|
|
|
|
|
sendString(sock, segments[x].description);
|
|
|
|
|
} else if (!strcmp(token, "route_name")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x = atoi(token);
|
|
|
|
|
sendString(sock, routes[x].name);
|
|
|
|
|
} else if (!strcmp(token, "route_segment_count")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x = atoi(token);
|
|
|
|
|
sendInt(sock, routes[x].segment_count);
|
|
|
|
|
} else if (!strcmp(token, "route_segment_shortname")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x = atoi(token);
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int y = atoi(token);
|
|
|
|
|
sendString(sock, routes[x].segments[y].shortname);
|
|
|
|
|
} else if (!strcmp(token, "event_time")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x;
|
|
|
|
|
if (!strcmp(token, "last"))
|
|
|
|
|
x = runMarker - 1;
|
|
|
|
|
else if (!strcmp(token, "first"))
|
|
|
|
|
x = 0;
|
|
|
|
|
else
|
|
|
|
|
x = atoi(token);
|
|
|
|
|
struct timespec t;
|
|
|
|
|
sub_timespec(run[0].time, run[x].time, &t);
|
|
|
|
|
sendInt(sock, timespecToMS(t));
|
|
|
|
|
} else if (!strcmp(token, "event_time_with_pause")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x;
|
|
|
|
|
if (!strcmp(token, "last"))
|
|
|
|
|
x = runMarker - 1;
|
|
|
|
|
else if (!strcmp(token, "first"))
|
|
|
|
|
x = 0;
|
|
|
|
|
else
|
|
|
|
|
x = atoi(token);
|
|
|
|
|
int running_pause = 0;
|
|
|
|
|
struct timespec p, r;
|
|
|
|
|
bool tracking_pause = false;
|
|
|
|
|
for (int i = 0; i < x; i++) {
|
|
|
|
|
if (run[i].type == PAUSE) {
|
|
|
|
|
sub_timespec(run[0].time, run[i].time, &p);
|
|
|
|
|
tracking_pause = true;
|
|
|
|
|
}
|
|
|
|
|
if (run[i].type == RESUME) {
|
|
|
|
|
sub_timespec(run[0].time, run[i].time, &r);
|
|
|
|
|
running_pause += timespecToMS(r) - timespecToMS(p);
|
|
|
|
|
tracking_pause = false;
|
|
|
|
|
} else if (i == x - 1 && tracking_pause) {
|
|
|
|
|
sub_timespec(run[0].time, run[x].time, &r);
|
|
|
|
|
running_pause += timespecToMS(r) - timespecToMS(p);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
struct timespec t;
|
|
|
|
|
sub_timespec(run[0].time, run[x].time, &t);
|
|
|
|
|
sendInt(sock, timespecToMS(t) - running_pause);
|
|
|
|
|
} else if (!strcmp(token, "event_type")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
int x;
|
|
|
|
|
if (!strcmp(token, "last"))
|
|
|
|
|
x = runMarker - 1;
|
|
|
|
|
else if (!strcmp(token, "first"))
|
|
|
|
|
x = 0;
|
|
|
|
|
else
|
|
|
|
|
x = atoi(token);
|
|
|
|
|
char *reply;
|
|
|
|
|
switch (run[x].type) {
|
|
|
|
|
case START:
|
|
|
|
|
reply = "START";
|
|
|
|
|
break;
|
|
|
|
|
case SPLIT:
|
|
|
|
|
reply = "SPLIT";
|
|
|
|
|
break;
|
|
|
|
|
case SKIP:
|
|
|
|
|
reply = "SKIP";
|
|
|
|
|
break;
|
|
|
|
|
case PAUSE:
|
|
|
|
|
reply = "PAUSE";
|
|
|
|
|
break;
|
|
|
|
|
case RESUME:
|
|
|
|
|
reply = "RESUME";
|
|
|
|
|
break;
|
|
|
|
|
case RESET:
|
|
|
|
|
reply = "RESET";
|
|
|
|
|
break;
|
|
|
|
|
case STOP:
|
|
|
|
|
reply = "STOP";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sendString(sock, reply);
|
|
|
|
|
} else if (!strcmp(token, "meta")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
sendValue(sock, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Setters
|
|
|
|
|
} else if (!strcmp(token, "set")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
if (!strcmp(token, "meta")) {
|
|
|
|
|
token = strtok(NULL, " ");
|
|
|
|
|
char *token2 = strtok(NULL, " ");
|
|
|
|
|
set_metadata(token, token2);
|
|
|
|
|
save_metadata_to_file(token, token2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -656,7 +811,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
perror("ERROR on accept");
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
doprocessing(newsockfd);
|
|
|
|
|
process_socket_input(newsockfd);
|
|
|
|
|
close(newsockfd);
|
|
|
|
|
}
|
|
|
|
|
free(run);
|
|
|
|
|