#include <cstdint>

#include "common.h"

namespace {

{% for address, msg_name, msg_size, sigs in msgs %}
const Signal sigs_{{address}}[] = {
  {% for sig in sigs %}
    {
      {% if sig.is_little_endian %}
        {% set b1 = sig.start_bit %}
      {% else %}
        {% set b1 = (sig.start_bit//8)*8  + (-sig.start_bit-1) % 8 %}
      {% endif %}
      .name = "{{sig.name}}",
      .b1 = {{b1}},
      .b2 = {{sig.size}},
      .bo = {{64 - (b1 + sig.size)}},
      .is_signed = {{"true" if sig.is_signed else "false"}},
      .factor = {{sig.factor}},
      .offset = {{sig.offset}},
      .is_little_endian = {{"true" if sig.is_little_endian else "false"}},
      {% if checksum_type == "honda" and sig.name == "CHECKSUM" %}
      .type = SignalType::HONDA_CHECKSUM,
      {% elif checksum_type == "honda" and sig.name == "COUNTER" %}
      .type = SignalType::HONDA_COUNTER,
      {% elif checksum_type == "toyota" and sig.name == "CHECKSUM" %}
      .type = SignalType::TOYOTA_CHECKSUM,
      {% else %}
      .type = SignalType::DEFAULT,
      {% endif %}
    },
  {% endfor %}
};
{% endfor %}

const Msg msgs[] = {
{% for address, msg_name, msg_size, sigs in msgs %}
  {% set address_hex = "0x%X" % address %}
  {
    .name = "{{msg_name}}",
    .address = {{address_hex}},
    .size = {{msg_size}},
    .num_sigs = ARRAYSIZE(sigs_{{address}}),
    .sigs = sigs_{{address}},
  },
{% endfor %}
};

const Val vals[] = {
{% for address, sig in def_vals %}
  {% for sg_name, def_val in sig %}
    {% set address_hex = "0x%X" % address %}
    {
      .name = "{{sg_name}}",
      .address = {{address_hex}},
      .def_val = {{def_val}},
      .sigs = sigs_{{address}},
    },
  {% endfor %}
{% endfor %}
};

}

const DBC {{dbc.name}} = {
  .name = "{{dbc.name}}",
  .num_msgs = ARRAYSIZE(msgs),
  .msgs = msgs,
  .vals = vals,
  .num_vals = ARRAYSIZE(vals),
};

dbc_init({{dbc.name}})
