|
|
@@ -1,4 +1,6 @@
|
|
|
#include <string.h>
|
|
|
+#include <errno.h>
|
|
|
+#include <sys/socket.h>
|
|
|
|
|
|
#include "scufeng/log.h"
|
|
|
|
|
|
@@ -8,26 +10,38 @@ static const uint8_t fb = 0xfb;
|
|
|
static const uint8_t fe = 0xfe;
|
|
|
|
|
|
void PaddleChangeDirMsg_encode(const PaddleChangeDirMsg *const msg, uint8_t *buf, const size_t buf_size) {
|
|
|
- if (buf_size < PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE) {
|
|
|
- LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE);
|
|
|
+ if (buf_size < sizeof(PaddleChangeDirMsg)) {
|
|
|
+ LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, sizeof(PaddleChangeDirMsg));
|
|
|
}
|
|
|
|
|
|
- memcpy(buf, &msg->dir, sizeof(msg->dir));
|
|
|
- buf += sizeof(msg->dir);
|
|
|
- memcpy(buf, &msg->player1, sizeof(msg->player1));
|
|
|
+ memcpy(buf, msg, sizeof(PaddleChangeDirMsg));
|
|
|
}
|
|
|
|
|
|
PaddleChangeDirMsg PaddleChangeDir_decode(const uint8_t *buf, const size_t buf_size) {
|
|
|
- if (buf_size < PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE) {
|
|
|
- LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE);
|
|
|
+ if (buf_size < sizeof(PaddleChangeDirMsg)) {
|
|
|
+ LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, sizeof(PaddleChangeDirMsg));
|
|
|
}
|
|
|
|
|
|
- PaddleChangeDirMsg msg = {0};
|
|
|
+ PaddleChangeDirMsg msg = { 0 };
|
|
|
+ memcpy(&msg, buf, sizeof(PaddleChangeDirMsg));
|
|
|
|
|
|
- memcpy(&msg.dir, buf, sizeof(msg.dir));
|
|
|
- buf += sizeof(msg.dir);
|
|
|
- memcpy(&msg.player1, buf, sizeof(msg.player1));
|
|
|
+ return msg;
|
|
|
+}
|
|
|
|
|
|
+void PaddlePosMsg_encode(const PaddlePosMsg *const msg, uint8_t *buf, const size_t buf_size) {
|
|
|
+ if (buf_size < sizeof(PaddlePosMsg)) {
|
|
|
+ LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, sizeof(PaddlePosMsg));
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy(buf, msg, buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+PaddlePosMsg PaddlePosMsg_decode(const uint8_t *buf, const size_t buf_size) {
|
|
|
+ if (buf_size < sizeof(PaddlePosMsg)) {
|
|
|
+ LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, sizeof(PaddlePosMsg));
|
|
|
+ }
|
|
|
+ PaddlePosMsg msg = { 0 };
|
|
|
+ memcpy(&msg, buf, sizeof(PaddlePosMsg));
|
|
|
return msg;
|
|
|
}
|
|
|
|
|
|
@@ -35,7 +49,10 @@ void send_msg(FILE *s, const uint8_t *const buf, const size_t buf_size) {
|
|
|
uint8_t *buf_cpy = (uint8_t *) malloc(sizeof(uint8_t) * buf_size);
|
|
|
memcpy(buf_cpy, buf, buf_size);
|
|
|
for (uint8_t *p = buf_cpy; p < buf_cpy + buf_size; p++) {
|
|
|
- if (*p == fb || *p == fe) {
|
|
|
+ // if (*p == fb || *p == fe) {
|
|
|
+ // *p += SEND_FRAME_MANGLE;
|
|
|
+ // }
|
|
|
+ if (*p == fb) {
|
|
|
*p += SEND_FRAME_MANGLE;
|
|
|
}
|
|
|
}
|
|
|
@@ -49,9 +66,9 @@ void send_msg(FILE *s, const uint8_t *const buf, const size_t buf_size) {
|
|
|
if (fwrite(buf_cpy, buf_size, 1, s) < 1) {
|
|
|
LOG_FATAL("[send_msg] Failed to write msg");
|
|
|
}
|
|
|
- if (fwrite(&fe, sizeof(fe), 1, s) < 1) {
|
|
|
- LOG_FATAL("[send_msg] Failed to write fe");
|
|
|
- }
|
|
|
+ // if (fwrite(&fe, sizeof(fe), 1, s) < 1) {
|
|
|
+ // LOG_FATAL("[send_msg] Failed to write fe");
|
|
|
+ // }
|
|
|
if (fflush(s) != 0) {
|
|
|
LOG_FATAL("[send_msg] Failed to flush stream");
|
|
|
}
|
|
|
@@ -59,12 +76,28 @@ void send_msg(FILE *s, const uint8_t *const buf, const size_t buf_size) {
|
|
|
free(buf_cpy);
|
|
|
}
|
|
|
|
|
|
-bool recv_msg(FILE *s, uint8_t *const buf, const size_t buf_size) {
|
|
|
- uint8_t _fb;
|
|
|
- if (fread(&_fb, sizeof(_fb), 1, s) < 1) {
|
|
|
- LOG_FATAL("[recv_msg] Failed to read _fb");
|
|
|
+static bool recv_until_fb_or_empty_buf(FILE *s) {
|
|
|
+ while (true) {
|
|
|
+ uint8_t _fb;
|
|
|
+ if (fread(&_fb, sizeof(_fb), 1, s) < 1) {
|
|
|
+ if (errno == EWOULDBLOCK) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ printf("errno: %d ferror: %d feof: %d\n", errno, ferror(s), feof(s));
|
|
|
+ LOG_FATAL("[recv_msg] Failed to read _fb");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (_fb != fb) {
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|
|
|
- if (_fb != fb) {
|
|
|
+}
|
|
|
+
|
|
|
+bool recv_msg(FILE *s, uint8_t *const buf, const size_t buf_size) {
|
|
|
+ bool found_fb = recv_until_fb_or_empty_buf(s);
|
|
|
+ if (!found_fb) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -80,18 +113,21 @@ bool recv_msg(FILE *s, uint8_t *const buf, const size_t buf_size) {
|
|
|
LOG_FATAL("[recv_msg] Failed to read msg");
|
|
|
}
|
|
|
for (uint8_t *p = buf; p < buf + buf_size; p++) {
|
|
|
- if (*p == fb + SEND_FRAME_MANGLE || *p == fe + SEND_FRAME_MANGLE) {
|
|
|
+ // if (*p == fb + SEND_FRAME_MANGLE || *p == fe + SEND_FRAME_MANGLE) {
|
|
|
+ // *p += RECV_FRAME_MANGLE;
|
|
|
+ // }
|
|
|
+ if (*p == fb + SEND_FRAME_MANGLE) {
|
|
|
*p += RECV_FRAME_MANGLE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- uint8_t _fe;
|
|
|
- if (fread(&_fe, sizeof(_fe), 1, s) < 1) {
|
|
|
- LOG_FATAL("[recv_msg] Failed to read _fe");
|
|
|
- }
|
|
|
- if (_fe != fe) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ // uint8_t _fe;
|
|
|
+ // if (fread(&_fe, sizeof(_fe), 1, s) < 1) {
|
|
|
+ // LOG_FATAL("[recv_msg] Failed to read _fe");
|
|
|
+ // }
|
|
|
+ // if (_fe != fe) {
|
|
|
+ // return false;
|
|
|
+ // }
|
|
|
|
|
|
return true;
|
|
|
}
|