{
  "sensor": {
    "type": "FSR (Force Sensitive Resistor)",
    "product": "PoseLab Seat",
    "layout": "32셀, 3행 비대칭 (뒤 10 · 중 14 · 앞 8)",
    "count": 32,
    "resolution_bits": 12,
    "value_range": [
      0,
      4095
    ],
    "physical_size_mm": {
      "width": 336,
      "height": 260
    },
    "origin": "중앙 cross (0,0)",
    "sampling_rate_hz": 50
  },
  "sensor_layout": {
    "rows": 3,
    "cells_per_row": {
      "row1_back": 10,
      "row2_mid": 14,
      "row3_front": 8
    },
    "spacing": "불규칙 (24~40mm)",
    "coordinate_system": "원점 = 중앙 cross. x: -168~+168mm(좌-/우+), y: -119~+141mm(뒤-/앞+)",
    "note": "정방 격자가 아니다. 셀 위치는 cells 배열의 물리 좌표(mm)를 따른다.",
    "cells": [
      {
        "seq": 0,
        "id": "left-15",
        "x_mm": -138.5,
        "y_mm": -119
      },
      {
        "seq": 1,
        "id": "left-14",
        "x_mm": -114.5,
        "y_mm": -119
      },
      {
        "seq": 2,
        "id": "left-13",
        "x_mm": -90.5,
        "y_mm": -119
      },
      {
        "seq": 3,
        "id": "left-12",
        "x_mm": -66.5,
        "y_mm": -119
      },
      {
        "seq": 4,
        "id": "left-11",
        "x_mm": -42.5,
        "y_mm": -119
      },
      {
        "seq": 5,
        "id": "right-4",
        "x_mm": 42.5,
        "y_mm": -119
      },
      {
        "seq": 6,
        "id": "right-3",
        "x_mm": 66.5,
        "y_mm": -119
      },
      {
        "seq": 7,
        "id": "right-2",
        "x_mm": 90.5,
        "y_mm": -119
      },
      {
        "seq": 8,
        "id": "right-1",
        "x_mm": 114.5,
        "y_mm": -119
      },
      {
        "seq": 9,
        "id": "right-0",
        "x_mm": 138.5,
        "y_mm": -119
      },
      {
        "seq": 10,
        "id": "left-10",
        "x_mm": -168,
        "y_mm": 0
      },
      {
        "seq": 11,
        "id": "left-9",
        "x_mm": -144,
        "y_mm": 0
      },
      {
        "seq": 12,
        "id": "left-8",
        "x_mm": -120,
        "y_mm": 0
      },
      {
        "seq": 13,
        "id": "left-7",
        "x_mm": -96,
        "y_mm": 0
      },
      {
        "seq": 14,
        "id": "left-6",
        "x_mm": -72,
        "y_mm": 0
      },
      {
        "seq": 15,
        "id": "left-5",
        "x_mm": -48,
        "y_mm": 0
      },
      {
        "seq": 16,
        "id": "left-4",
        "x_mm": -24,
        "y_mm": 0
      },
      {
        "seq": 17,
        "id": "right-11",
        "x_mm": 24,
        "y_mm": 0
      },
      {
        "seq": 18,
        "id": "right-10",
        "x_mm": 48,
        "y_mm": 0
      },
      {
        "seq": 19,
        "id": "right-9",
        "x_mm": 72,
        "y_mm": 0
      },
      {
        "seq": 20,
        "id": "right-8",
        "x_mm": 96,
        "y_mm": 0
      },
      {
        "seq": 21,
        "id": "right-7",
        "x_mm": 120,
        "y_mm": 0
      },
      {
        "seq": 22,
        "id": "right-6",
        "x_mm": 144,
        "y_mm": 0
      },
      {
        "seq": 23,
        "id": "right-5",
        "x_mm": 168,
        "y_mm": 0
      },
      {
        "seq": 24,
        "id": "left-3",
        "x_mm": -156,
        "y_mm": 141
      },
      {
        "seq": 25,
        "id": "left-2",
        "x_mm": -116,
        "y_mm": 141
      },
      {
        "seq": 26,
        "id": "left-1",
        "x_mm": -76,
        "y_mm": 141
      },
      {
        "seq": 27,
        "id": "left-0",
        "x_mm": -36,
        "y_mm": 141
      },
      {
        "seq": 28,
        "id": "right-15",
        "x_mm": 36,
        "y_mm": 141
      },
      {
        "seq": 29,
        "id": "right-14",
        "x_mm": 76,
        "y_mm": 141
      },
      {
        "seq": 30,
        "id": "right-13",
        "x_mm": 116,
        "y_mm": 141
      },
      {
        "seq": 31,
        "id": "right-12",
        "x_mm": 156,
        "y_mm": 141
      }
    ]
  },
  "protocol": {
    "interface": "USB Serial (Web Serial API)",
    "baud_rate": 2000000,
    "packet_size_bytes": 96,
    "packet_structure": [
      {
        "offset": "0~1",
        "field": "sync",
        "desc": "0xFF 0xFF"
      },
      {
        "offset": "2",
        "field": "rows",
        "desc": "3"
      },
      {
        "offset": "3",
        "field": "cols",
        "desc": "14 (bounding grid width)"
      },
      {
        "offset": "4",
        "field": "boardId",
        "desc": "고정 0 (PoseLab Core)"
      },
      {
        "offset": "5",
        "field": "rolling",
        "desc": "rolling index 0~199"
      },
      {
        "offset": "6~9",
        "field": "timestamp",
        "desc": "uint32 LE (millis)"
      },
      {
        "offset": "10~73",
        "field": "sensor_data",
        "desc": "32 sensors × 2bytes (highByte×100 + lowByte)",
        "value_range": [
          0,
          4095
        ]
      },
      {
        "offset": "74~75",
        "field": "cofX",
        "desc": "무게중심 X int16 LE",
        "range": "0.0000~1.0000 을 ×10000 하여 정수화"
      },
      {
        "offset": "76~77",
        "field": "cofY",
        "desc": "무게중심 Y int16 LE",
        "range": "0.0000~1.0000 을 ×10000 하여 정수화"
      },
      {
        "offset": "78~79",
        "field": "maxVal",
        "desc": "최대 센서값 uint16 LE",
        "value_range": [
          0,
          4095
        ]
      },
      {
        "offset": "80~81",
        "field": "velocity",
        "desc": "최대값 변화율 int16 LE",
        "value_range": [
          -4095,
          4095
        ]
      },
      {
        "offset": "82~83",
        "field": "avg",
        "desc": "활성 셀 평균 uint16 LE",
        "value_range": [
          0,
          4095
        ]
      },
      {
        "offset": "84",
        "field": "appId",
        "desc": "app id. 0x00=추론 없음, 0x01~0xEF=앱 id, 0xF0=ASCII 모드"
      },
      {
        "offset": "85",
        "field": "modelId",
        "desc": "앱 안에서 모델을 구분하는 번호. .plmodel 컨테이너에 적힌 값을 그대로 싣고, 없으면 1이 된다"
      },
      {
        "offset": "86~87",
        "field": "flags",
        "desc": "예약, 항상 0x0000"
      },
      {
        "offset": "88",
        "field": "label0",
        "desc": "1순위 추론 라벨 인덱스"
      },
      {
        "offset": "89",
        "field": "conf0",
        "desc": "1순위 신뢰도",
        "range": "0~200 (÷200 하면 0.0~1.0). 255가 아닌 이유는 0xFE/0xFF를 피하기 위함"
      },
      {
        "offset": "90",
        "field": "label1",
        "desc": "2순위 추론 라벨 인덱스"
      },
      {
        "offset": "91",
        "field": "conf1",
        "desc": "2순위 신뢰도",
        "range": "0~200 (÷200 하면 0.0~1.0)"
      },
      {
        "offset": "92",
        "field": "label2",
        "desc": "3순위 추론 라벨 인덱스"
      },
      {
        "offset": "93",
        "field": "conf2",
        "desc": "3순위 신뢰도",
        "range": "0~200 (÷200 하면 0.0~1.0)"
      },
      {
        "offset": "94~95",
        "field": "tail",
        "desc": "0x00 0xFE"
      }
    ],
    "sensor_data_encoding": "highByte × 100 + lowByte per sensor",
    "inference_block": {
      "size_bytes": 10,
      "position": "tail 직전",
      "label_values": "0x00~0xDF 클래스 인덱스 / 0xE0 empty(게이트 판정) / 0xE1~0xEE 예약 / 0xEF 빈 슬롯",
      "ascii_mode": "appId=0xF0이면 offset+1~+9가 null-padded ASCII 라벨"
    }
  },
  "computed_fields": {
    "fields": [
      {
        "name": "area",
        "desc": "임계 이상 활성 셀 면적",
        "unit": "cm²"
      }
    ]
  },
  "circuit": {
    "mcu": "ESP32-S3",
    "measurement_circuit": "PoseLab Core",
    "adc_bits": 12,
    "mux": "En11(left)+En12(right), 16ch each",
    "power": "5V USB"
  }
}