#pragma once #include "message.h" #include // Handle for the high level robot interface struct RobotImp; typedef struct RobotImp* Robot; #define FRAGMENT_MESSAGE 1 #define FRAGMENT_RECTANGLE 2 #define FRAGMENT_LINE 3 #define FRAGMENT_MARKER 4 struct Fragment { int type; union { union Message message; struct VisionRect rect; }; }; int robot_poll(Robot robot, struct Fragment* fragment); /* * Return a handle to the high level robot interface, or NULL on error. */ Robot robot_new(); /* * Queue initialization tasks before further commands can be sent to the robot. * The robot is not guaranteed to be ready until a ready message is popped from * the work function. * * robot: The robot to initialize * returns: 0 on success, non-zero on failure */ int robot_init(Robot robot); /* * Request the robot to stop. This does not stop the robot immediately. The * robot has stopped once the work function returns that there is no more work * to do. * * robot: The robot to stop * returns: 0 on success, non-zero on failure */ int robot_stop(Robot robot); /* * Set the gimble speed. A packet will be sent to the robot on * the next ready tick of the work function. * * robot: The robot to set the velocity of * p: pitch speed * y: yaw speed * returns: 0 on success, non-zero on failure */ int robot_aim(Robot, float p, float y); /* * Set the velocity of the robot chassis. A packet will be sent to the robot on * the next ready tick of the work function. * * robot: The robot to set the velocity of * x: strafe velocity * y: forward and backward velocity * r: rotation velocity * returns: 0 on success, non-zero on failure */ int robot_drive(Robot, float x, float y, float r); /* * TODO: This is too simplistic for what the lights are capable of. * Set the color of all LEDs on the robot. A packet will be sent to the robot * on the next ready tick of the work function. * * robot: The robot to set LED colors of * r: red * g: green * b: blue * returns: 0 on success, non-zero on failure */ int robot_led(Robot, unsigned char r, unsigned char g, unsigned char b); int robot_blast(Robot); int robot_stream(Robot, bool); /* * If the robot is in ready mode, this makes the robot send a heartbeat in * the next tick of the work function. The work function will not do anything * else until a heartbeat response is received. * * A heartbeat must be sent periodically or else the robot will become * unresponsive. This function is thread-safe and can be called in a * busy-waiting loop, signal handler, or background thread. * * robot: The robot to send a heartbeat to * returns: 0 on success, non-zero on failure */ int robot_heartbeat(Robot robot); /* * This does all of the work in small pieces so it returns as quickly as * possible. Most of the other functions in this API simply set a flag * to signal this function to work. A non-zero value is returned until * no more work is left, which would only happen shortly after the stop * function is called and any remaining tasks have been worked through. * * robot: The robot to do periodic work on * returns: non-zero until stop function is called */ int robot_work(Robot robot);