#include #include #include #include "thirtytwodl_final.h" static void print_hex(const uint8_t *buf, size_t len) { for (size_t i = 0; i < len; i++) { printf("%02X ", buf[i]); if ((i + 1) % 16 == 0) printf("\n"); } printf("\n"); } int main(void) { uint8_t msg[256]; size_t msg_len; twodl_decode_result_t result; /* ---- 1. Simple affirmation ---- */ printf("=== 1. Simple affirmation ===\n"); uint8_t expr1[1]; twodl_builder_t b1; twodl_builder_init(&b1, expr1, sizeof(expr1)); twodl_builder_add_affirm(&b1); msg_len = sizeof(msg); twodl_error_t err = twodl_encode_message(b1.buf, b1.pos, msg, &msg_len); printf("Encode: %s (%zu bytes)\n", err == TWODL_OK ? "OK" : "FAIL", msg_len); print_hex(msg, msg_len); twodl_decode(msg, msg_len, &result); printf("Decode: %s | version=%d | expr_len=%d\n\n", result.error == TWODL_OK ? "OK" : "FAIL", result.version, result.expr_len); /* ---- 2. Intersection coordination: 1/pi ; compose ; V:A ---- */ printf("=== 2. Shared ground + UUID identity + compose ===\n"); uint8_t uuid_a[16] = { 0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x11,0x22, 0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00 }; uint8_t expr2[32]; twodl_builder_t b2; twodl_builder_init(&b2, expr2, sizeof(expr2)); twodl_builder_add_shared_ground(&b2); twodl_builder_add_uuid(&b2, uuid_a); twodl_builder_add_affirm(&b2); twodl_builder_add_compose(&b2); msg_len = sizeof(msg); err = twodl_encode_message(b2.buf, b2.pos, msg, &msg_len); printf("Encode: %s (%zu bytes)\n", err == TWODL_OK ? "OK" : "FAIL", msg_len); print_hex(msg, msg_len); twodl_decode(msg, msg_len, &result); printf("Decode: %s | expr_len=%d\n\n", result.error == TWODL_OK ? "OK" : "FAIL", result.expr_len); /* ---- 3. Timeout wrapping an affirmation (500ms) ---- */ printf("=== 3. timeout(affirm, 500ms) ===\n"); uint8_t inner[1]; twodl_builder_t ib; twodl_builder_init(&ib, inner, sizeof(inner)); twodl_builder_add_affirm(&ib); uint8_t expr3[32]; twodl_builder_t b3; twodl_builder_init(&b3, expr3, sizeof(expr3)); twodl_builder_add_timeout(&b3, ib.buf, ib.pos, 500); msg_len = sizeof(msg); err = twodl_encode_message(b3.buf, b3.pos, msg, &msg_len); printf("Encode: %s (%zu bytes)\n", err == TWODL_OK ? "OK" : "FAIL", msg_len); print_hex(msg, msg_len); twodl_decode(msg, msg_len, &result); printf("Decode: %s | expr_len=%d\n\n", result.error == TWODL_OK ? "OK" : "FAIL", result.expr_len); /* ---- 4. GPS coordinate identity ---- */ printf("=== 4. GPS identity (Little Millham, Robertsbridge) ===\n"); /* 51.0000N, 0.5000E approx — degrees × 1e7 */ uint8_t expr4[32]; twodl_builder_t b4; twodl_builder_init(&b4, expr4, sizeof(expr4)); twodl_builder_add_gps(&b4, 510000000, 5000000, 50000); msg_len = sizeof(msg); err = twodl_encode_message(b4.buf, b4.pos, msg, &msg_len); printf("Encode: %s (%zu bytes)\n", err == TWODL_OK ? "OK" : "FAIL", msg_len); print_hex(msg, msg_len); twodl_decode(msg, msg_len, &result); printf("Decode: %s | expr_len=%d\n\n", result.error == TWODL_OK ? "OK" : "FAIL", result.expr_len); /* ---- 5. CRC corruption test ---- */ printf("=== 5. Bad checksum test ===\n"); uint8_t bad[256]; memcpy(bad, msg, msg_len); bad[msg_len - 1] ^= 0xFF; twodl_decode(bad, msg_len, &result); printf("Expected TWODL_ERR_INVALID_CHECKSUM (%d), got: %d — %s\n\n", TWODL_ERR_INVALID_CHECKSUM, result.error, result.error == TWODL_ERR_INVALID_CHECKSUM ? "PASS" : "FAIL"); /* ---- 6. NACK ---- */ printf("=== 6. NACK ===\n"); msg_len = sizeof(msg); twodl_encode_nack(msg, &msg_len); printf("NACK (%zu bytes): ", msg_len); print_hex(msg, msg_len); /* ---- 7. Truncated frame test ---- */ printf("=== 7. Truncated frame test ===\n"); uint8_t short_buf[3] = {0x01, 0x00, 0x07}; twodl_decode(short_buf, 3, &result); printf("Expected TWODL_ERR_TRUNCATED (%d), got: %d — %s\n\n", TWODL_ERR_TRUNCATED, result.error, result.error == TWODL_ERR_TRUNCATED ? "PASS" : "FAIL"); return 0; }