{{define "cenum"}} typedef enum { {{- range .Entries }} {{ .Name }} = {{ printf "0x%X" .ID }}, {{- end }} }{{.EnumName}}; {{end}} {{define "payloads"}} {{- range . }} typedef struct { {{- if not .Entries}} // empty payload {{- end}} {{- range .Entries }} {{- if (.ArrayLength) }} {{.DataType}} {{.Name}}[{{.ArrayLength}}]; {{- else }} {{.DataType}} {{.Name}}; {{- end}} {{- end }} } {{ .Name }}Payload; {{ end }} {{end}} {{define "union"}} typedef union { {{- range .}} {{.Name}}Payload {{ .Name | snake}}; {{- end }} } PayloadUnion; {{end}} {{define "handler"}} {{- range . }} void (*on_{{ .Name | snake }})({{ .Name }}Payload*) = NULL; {{- end}} {{end}} {{define "dispatcher"}} void dispatch_message(uint8_t msg_id, void* payload) { switch (msg_id) { {{- range . }} case {{ .Name }}: if (on_{{ .Name | snake }}) on_{{ .Name | snake }}(({{ .Name }}Payload*)payload); break; {{- end }} default: // Unknown message break; } } {{end}} {{define "send_functions"}} {{- range .}} {{ $argLen := len .Payload }} void send_{{.Name | snake}}({{- range $i, $p := .Payload}}{{$p.DataType}} {{$p.Name}} {{- if not (isLast $argLen $i) }}, {{ end}} {{- end}}) { {{.Name}}Payload payload; // Payload-Daten zuweisen {{- range .Payload}} payload.{{.Name}} = {{.Name}}; {{- end}} // Nachricht senden send_message({{.Name}}, &payload); } {{- end }} {{end}}