{{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 "basemessage"}} typedef struct { uint8_t Version; {{.CenumPCTOESP.EnumName}} MessageID; uint8_t Length; PayloadUnion Payload; } PCTOESPBaseMessage; typedef struct { uint8_t Version; {{.CenumESPTOPC.EnumName}} MessageID; uint8_t Length; PayloadUnion Payload; } ESPTOPCBaseMessage; {{end}} {{define "handler"}} {{- range . }} void (*on_{{ .Name | snake }})({{ .Name }}Payload*); {{- 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_function_prototype"}} void send_message(ESP_TO_PC_MESSAGE_IDS msgid, PayloadUnion *payload); {{end}} {{define "send_function_source"}} void send_message(ESP_TO_PC_MESSAGE_IDS msgid, PayloadUnion *payload) {} {{end}} {{define "send_functions_prototype"}} {{- range .}} {{- $argLen := len .Payload }} void send_{{.Name | snake}}({{- range $i, $p := .Payload}}{{$p.DataType}} {{ if .ArrayLength}}*{{end}}{{$p.Name}} {{- if not (isLast $argLen $i) }}, {{ end}} {{- end}}); {{- end }} {{end}} {{define "send_functions_source"}} {{- range .}} {{- $argLen := len .Payload }} void send_{{.Name | snake}}({{- range $i, $p := .Payload}}{{$p.DataType}} {{ if .ArrayLength}}*{{end}}{{$p.Name}} {{ if not (isLast $argLen $i) }}, {{ end}} {{- end}}) { {{.Name}}Payload payload; // Payload-Daten zuweisen {{- range .Payload}} {{- if .ArrayLength }} memcpy(payload.{{.Name}}, {{.Name}}, {{.ArrayLength}}); {{- else }} payload.{{.Name}} = {{.Name}}; {{- end}} {{- end}} // Nachricht senden send_message({{.Name}}, (PayloadUnion *)&payload); } {{end}} {{end}}