> ## Documentation Index
> Fetch the complete documentation index at: https://docs.makkii.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# 生成コードの組み込み

> 生成された Sender/Receiver の Lua コードを MC のスクリプトに組み込む

Number Codec Compiler は、パケット 1 つにつき Sender (送信側) と Receiver (受信側) の 2 つの Lua コードを生成します。それぞれ別の MC のスクリプトに組み込みます。

## Sender.lua

送信側 MC のスクリプトに、生成された `onTick()` をそのまま貼り付けます。フィールドごとに `input.getNumber(sourceChannel)` / `input.getBool(sourceChannel)` で値を読み、量子化・範囲外処理をしたうえで `output.setNumber(<送信CH>, ...)` に書き込みます。

パッキング方式によっては、値をそのまま送らずビット再解釈するヘルパー関数 (`u2f`、範囲によっては `put`) がコードの先頭に生成されます。既存の `onTick()` がある場合は、ヘルパー関数の定義と、生成された処理内容をその中にマージしてください。

```lua Sender.lua (サンプルパケットでの生成例) theme={null}
-- SampleTelemetry / Sender
function onTick()
 local v1_1=math.floor(math.max(0,math.min(1000,input.getNumber(3))))
 local v1_2=input.getNumber(5)<-180 and 0 or input.getNumber(5)>180 and 362 or math.floor(input.getNumber(5)+180+.7)+1
 local v1_3=input.getBool(1) and 1 or 0
 local p1=((v1_1)*363+v1_2)*2+v1_3
 output.setNumber(1,p1)
 local v2_1=math.floor(input.getNumber(1)*100+.5)
 local v2_2=math.floor(input.getNumber(2)*100+100+.5)
 local v2_3=math.ceil(math.max(0,math.min(200,input.getNumber(4))))
 local p2=((v2_1)*201+v2_2)*201+v2_3
 output.setNumber(2,p2)
end
```

## Receiver.lua

受信側 MC のスクリプトには、受信テーブルの初期化 (`<受信テーブル変数名> = <受信テーブル変数名> or {}`)、そして `receive_<パケット名>()` 関数が生成されます。Sender 側と同様に、パッキング方式によってはヘルパー関数 (`f2u`、方式によっては `get`) も先頭に生成されます。

```lua Receiver.lua (サンプルパケットでの生成例) theme={null}
-- SampleTelemetry / Receiver
rx=rx or {}
function receive_SampleTelemetry()
 local p1=input.getNumber(1)
 local q1_3=p1%2
 p1=(p1-q1_3)/2
 rx.headlight_on=q1_3~=0
 local q1_2=p1%363
 p1=(p1-q1_2)/363
 rx.target_bearing_deg=q1_2==0 and -math.huge or q1_2==362 and math.huge or (q1_2-1)+-180
 local q1_1=p1
 rx.altitude_m=q1_1
 local p2=input.getNumber(2)
 local q2_3=p2%201
 p2=(p2-q2_3)/201
 rx.engine_temp_c=q2_3
 local q2_2=p2%201
 p2=(p2-q2_2)/201
 rx.steering=q2_2*.01+-1
 local q2_1=p2
 rx.throttle=q2_1*.01
end
```

<Warning>
  生成されたコードは、`receive_<パケット名>()` を自動的には呼び出しません。受信側 MC の自分の `onTick()` から明示的に呼び出す必要があります。呼び出し忘れると `rx` テーブルが更新されません。
</Warning>

デコードされた値は `<受信テーブル変数名>.<フィールド名>` (既定では `rx.<フィールド名>`) に書き込まれます。範囲外検知 (Overflow) を使ったフィールドは、範囲外の入力に対して `-math.huge` / `math.huge` が入ることがあるため、その値を使う側のロジックで考慮してください。

<Note>
  `u2f`/`f2u`/`put`/`get` ヘルパー関数や、その中の定数は、浮動小数点のビット再解釈と NaN/Infinity 回避のために使われています。削除したり並べ替えたりすると、デコード結果が壊れます。仕組みの詳細は [パッキング方式](/codec-compiler/reference/packing-modes) を参照してください。
</Note>

## 送受信が噛み合わない場合

* Sender.lua と Receiver.lua は、必ず同じ候補 (同じ使用チャンネル数) から生成された組を貼り付けてください。候補を切り替えるとエンコードの並び順や基数が変わります。
* `送信CH`/`受信CH` は、リストの先頭から順に 1 対 1 で対応します。番号そのものではなく並び順で対応するため、片方だけ並べ替えると噛み合わなくなります。
* フィールドを追加・変更したら、Sender/Receiver の両方を貼り直してください。


## Related topics

- [Number Codec Compiler](/codec-compiler/index.md)
- [FAQ・トラブルシューティング](/codec-compiler/faq.md)
- [最初の一歩](/codec-compiler/quickstart.md)
- [制限事項](/codec-compiler/reference/limits.md)
- [ライブラリの使い方](/stormmin/guides/library-usage.md)
