|
|
@ -7,8 +7,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct FragmentLink {
|
|
|
|
|
|
|
|
struct Fragment fragment;
|
|
|
|
|
|
|
|
struct FragmentLink *next;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct RobotImp {
|
|
|
|
struct RobotImp {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct {
|
|
|
|
|
|
|
|
struct FragmentLink *head;
|
|
|
|
|
|
|
|
struct FragmentLink *free;
|
|
|
|
|
|
|
|
} frag_queue;
|
|
|
|
|
|
|
|
|
|
|
|
struct Client* client;
|
|
|
|
struct Client* client;
|
|
|
|
uint16_t seq;
|
|
|
|
uint16_t seq;
|
|
|
|
|
|
|
|
|
|
|
@ -33,6 +43,7 @@ struct RobotImp {
|
|
|
|
SETTING_SDK_CONNECTION,
|
|
|
|
SETTING_SDK_CONNECTION,
|
|
|
|
CONNECTING_TO_DEVICE_PORT,
|
|
|
|
CONNECTING_TO_DEVICE_PORT,
|
|
|
|
SETTING_SDK_MODE,
|
|
|
|
SETTING_SDK_MODE,
|
|
|
|
|
|
|
|
STREAMING_ENABLED,
|
|
|
|
RESETTING_SUBNODE,
|
|
|
|
RESETTING_SUBNODE,
|
|
|
|
SUSBCRIBING_SUBNODE,
|
|
|
|
SUSBCRIBING_SUBNODE,
|
|
|
|
SETTING_MOVEMENT_MODE,
|
|
|
|
SETTING_MOVEMENT_MODE,
|
|
|
@ -98,6 +109,61 @@ robot_heartbeat(Robot robot) {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline
|
|
|
|
|
|
|
|
static
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
enqueue_fragment (
|
|
|
|
|
|
|
|
Robot robot,
|
|
|
|
|
|
|
|
const struct Fragment fragment ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct FragmentLink *link;
|
|
|
|
|
|
|
|
if(robot->frag_queue.free) {
|
|
|
|
|
|
|
|
link = robot->frag_queue.free;
|
|
|
|
|
|
|
|
robot->frag_queue.free = link->next;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
link = malloc(sizeof(struct FragmentLink));
|
|
|
|
|
|
|
|
link->next = NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
link->fragment = fragment;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(robot->frag_queue.head) {
|
|
|
|
|
|
|
|
robot->frag_queue.head->next = link;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
robot->frag_queue.head = link;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline
|
|
|
|
|
|
|
|
static
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
dequeue_fragment (
|
|
|
|
|
|
|
|
Robot robot,
|
|
|
|
|
|
|
|
struct Fragment *fragment ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment->type = 0;
|
|
|
|
|
|
|
|
if(!robot->frag_queue.head)
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct FragmentLink *link = robot->frag_queue.head;
|
|
|
|
|
|
|
|
*fragment = link->fragment;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
robot->frag_queue.head = link->next;
|
|
|
|
|
|
|
|
link->next = NULL;
|
|
|
|
|
|
|
|
if(robot->frag_queue.free) {
|
|
|
|
|
|
|
|
robot->frag_queue.free->next = link;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
robot->frag_queue.free = link;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int robot_poll(Robot robot, struct Fragment* fragment) {
|
|
|
|
|
|
|
|
dequeue_fragment(robot, fragment);
|
|
|
|
|
|
|
|
return fragment->type;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
int
|
|
|
|
robot_work(Robot robot) {
|
|
|
|
robot_work(Robot robot) {
|
|
|
|
|
|
|
|
|
|
|
@ -170,6 +236,16 @@ robot_work(Robot robot) {
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case STREAMING_ENABLED:
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vision_enable (
|
|
|
|
|
|
|
|
&req, robot->seq++, true
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
req_send(robot->client->dev_conn, &req);
|
|
|
|
|
|
|
|
robot->state = READY;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case READY:
|
|
|
|
case READY:
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(robot->dirty_wheels) {
|
|
|
|
if(robot->dirty_wheels) {
|
|
|
@ -241,9 +317,42 @@ robot_work(Robot robot) {
|
|
|
|
|
|
|
|
|
|
|
|
union Message resp;
|
|
|
|
union Message resp;
|
|
|
|
poll_message(robot->client, &resp);
|
|
|
|
poll_message(robot->client, &resp);
|
|
|
|
|
|
|
|
if(resp.header.cmd) {
|
|
|
|
|
|
|
|
const struct Fragment fragment = {
|
|
|
|
|
|
|
|
.type = FRAGMENT_MESSAGE,
|
|
|
|
|
|
|
|
.message = resp
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
enqueue_fragment(robot, fragment);
|
|
|
|
|
|
|
|
}
|
|
|
|
switch(resp.header.cmd) {
|
|
|
|
switch(resp.header.cmd) {
|
|
|
|
case 0:
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STREAM_CTRL_CMD:
|
|
|
|
|
|
|
|
if(!resp.resp.sdkconn.retcode)
|
|
|
|
|
|
|
|
robot->state = STREAMING_ENABLED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VISION_DETECT_INFO_CMD:
|
|
|
|
|
|
|
|
// enqueue rectangles
|
|
|
|
|
|
|
|
for(int i = 0; i < resp.push.vision.count; i++) {
|
|
|
|
|
|
|
|
int type;
|
|
|
|
|
|
|
|
switch(resp.push.vision.type) {
|
|
|
|
|
|
|
|
case VISIONTYPE_SHOULDER:
|
|
|
|
|
|
|
|
case VISIONTYPE_PERSON:
|
|
|
|
|
|
|
|
case VISIONTYPE_GESTURE:
|
|
|
|
|
|
|
|
case VISIONTYPE_ROBOT:
|
|
|
|
|
|
|
|
type = FRAGMENT_RECTANGLE;
|
|
|
|
|
|
|
|
case VISIONTYPE_LINE:
|
|
|
|
|
|
|
|
type = FRAGMENT_LINE;
|
|
|
|
|
|
|
|
case VISIONTYPE_MARKER:
|
|
|
|
|
|
|
|
type = FRAGMENT_MARKER;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const struct Fragment fragment = {
|
|
|
|
|
|
|
|
.type = type,
|
|
|
|
|
|
|
|
.rect = resp.push.vision.rects[i]
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
enqueue_fragment(robot, fragment);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
case SET_SDK_CONNECTION_CMD:
|
|
|
|
case SET_SDK_CONNECTION_CMD:
|
|
|
|
// TODO: Do more with this
|
|
|
|
// TODO: Do more with this
|
|
|
|
if(resp.resp.sdkconn.retcode) {
|
|
|
|
if(resp.resp.sdkconn.retcode) {
|
|
|
|