Skip to content

UDP Protocol

Каскадирование машин Decima-8


📦 Формат Пакета

packet_v1 — fixed binary формат

Характеристика Значение
Размер 37 bytes
Endianness Little-endian
Назначение Каскадирование машин (IN/OUT)

🗂️ Структура Пакета

Offset Поле Тип Описание
0 magic u32 'D8UP' (0x50553844)
4 version u16 1
6 flags u16 has_winner, has_bus, has_cycle, has_flags
8 frame_tag u32 Тег кадра
12 domain_id u8 ID домена
13 pattern_id u16 ID паттерна
15 reset_mask16 u16 Маска сброса
17 collision_mask16 u16 Маска коллизий
19 winner_tile_id u16 ID победителя
21 cycle_time_us u32 Время цикла
25 flags32_last u32 FLAGS последнего цикла
29 bus16[8] u8×8 Значения шины

🚩 Flags (u16)

Бит Флаг Описание
bit0 has_winner winner_tile_id/pattern_id валидны
bit1 has_bus bus16[8] валидны
bit2 has_cycle cycle_time_us валиден
bit3 has_flags flags32_last валиден

📋 Поля Пакета

magic (u32)

'D8UP' (0x50553844)

version (u16)

1

flags (u16)

bit0: has_winner
bit1: has_bus
bit2: has_cycle
bit3: has_flags

frame_tag (u32)

Уникальный тег кадра для синхронизации

domain_id (u8)

ID домена (0..15)

pattern_id (u16)

ID паттерна (0..32767)
Валиден если flags.has_winner

reset_mask16 (u16)

Маска доменов для RESET_DOMAIN
Каждый бит соответствует домену

collision_mask16 (u16)

Маска доменов с коллизией (cnt≥2)
Валидно если flags.has_winner

winner_tile_id (u16)

ID тайла-победителя
Валидно если flags.has_winner

cycle_time_us (u32)

Время цикла в микросекундах
Валидно если flags.has_cycle

flags32_last (u32)

FLAGS32 последнего цикла:
bit0: READY_LAST
bit1: OVF_ANY_LAST
bit2: COLLIDE_ANY_LAST
Валидно если flags.has_flags

bus16[8] (u8×8)

Значения шины BUS16[0..7]
Валидно если flags.has_bus

🔄 Пример Пакета

Hex Dump

0000: 44 38 55 50 01 00 0F 00  00 00 00 01 00 00 00 00   D8UP............
0010: 00 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
0020: 00 00 00 00 00 00 00 00  00 00 00 00               ............

Разбор

magic: 'D8UP'
version: 1
flags: 0x000F (has_winner|has_bus|has_cycle|has_flags)
frame_tag: 1
domain_id: 0
pattern_id: 0
reset_mask16: 0
collision_mask16: 0
winner_tile_id: 0
cycle_time_us: 0
flags32_last: 0
bus16: [0, 0, 0, 0, 0, 0, 0, 0]

💻 Использование

Отправка Пакета

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

packet = struct.pack('<4sHHIIBHHHHIIBBBBBBBB',
    b'D8UP',           # magic
    1,                 # version
    0x000F,            # flags (все поля валидны)
    frame_tag,
    domain_id,
    pattern_id,
    reset_mask16,
    collision_mask16,
    winner_tile_id,
    cycle_time_us,
    flags32_last,
    *bus16             # 8 bytes
)

sock.sendto(packet, ('127.0.0.1', 9999))

Приём Пакета

data, addr = sock.recvfrom(37)

magic, version, flags, frame_tag, domain_id, pattern_id, \
reset_mask16, collision_mask16, winner_tile_id, cycle_time_us, \
flags32_last, *bus16_bytes = struct.unpack('<4sHHIIBHHHHIIBBBBBBBB', data)

bus16 = list(bus16_bytes)

has_winner = bool(flags & 0x0001)
has_bus = bool(flags & 0x0002)
has_cycle = bool(flags & 0x0004)
has_flags = bool(flags & 0x0008)

🔗 Интеграция

Входной Поток (IN)

Decima-8 получает пакеты:
- reset_mask16 → EV_RESET_DOMAIN
- pattern_id → целевой паттерн
- bus16 → входные данные (если has_bus)

Выходной Поток (OUT)

Decima-8 отправляет пакеты:
- frame_tag → синхронизация
- winner_tile_id → распознанный паттерн
- bus16 → состояние шины
- flags32_last → флаги цикла

Bake the Future. Build the Substrate. 🛠️⚡️