Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Introduction

Preface

This page is more or less a write-up of a video by Arshan Khanifar that can be found here. If you prefer video to text, please watch the video.

What is codegen?

Code generation is the generation of code so that humans don’t have to write repetitive code. For MSXIV, we store our code generation tools in the repo codegen-tooling-msxiv.

Why do we use codegen?

We use tools to generate code to make our code more clear when it comes to CAN messages. A CAN message has a number of fields packed into 64 bits, e.g. 2 x uint32_t, 1 x uint64_t, or 2 x uint8_t. To facilitate packing these fields, we generate CAN_PACK_… and CAN_UNPACK… functions for each message depending on the contents. This way we don’t have to write custom message packing every time we want to transmit a message. We also generate CAN_TRANSMIT_… functions to facilitate transmitting messages.

How does codegen work?

At a high level, we define our message layouts in the file can_messages.asciipb. Then, we use python scripts to generate the necessary code.

Tutorials

How do you set up codegen?

Follow the instructions on the github repo readme. In short, run these commands after you’ve cloned the readme.

# add the protobuf repo
sudo add-apt-repository ppa:maarten-fonville/protobuf
sudo apt-get update

# install protobuf compiler
sudo apt-get install protobuf-compiler
go get -u github.com/golang/protobuf/protoc-gen-go

# create a virtual environment using conda or virtual env
# virtualenv demonstrated here
virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

You should now be set up to generate messages.

How do you add new messages?

  1. In a text editor of your choice, open up can_messages.asciipb

  2. Choose a non-used message id, and fill out a message definition, following the format of the other messages

    1. Note: messages 0-9 are high priority messages, don’t use these.

    2. msg {
        id: 99
        source: EXAMPLE
        # target: EXAMPLE
        msg_name: "descriptive name"
        can_data {
          u8 {
            field_name_1: "blablabla"
            field_name_2: "albalbalb"
          }
        }
      }

    3. If you need enums to go along with your messages, don’t forget to add them to exported_enums.h in the firmware_xiv repo.

  3. Run make gen in the root of the repo.

    1. The generated files will be placed in the codegen-tooling-msxiv/out directory.

  4. Copy the generated files into your firmware repo at firmware-xiv/libraries/codegen-tooling/inc.

  5. Check your messages were added correctly with git diff or other, then commit and push your changes.

  • No labels