Fixed the update crash caused by BVM state publisher.
This commit is contained in:
parent
3ad277bd5e
commit
58c09093a7
|
@ -4,6 +4,6 @@
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
updated="update_ack"
|
updated="update_ack"
|
||||||
update_no=0
|
update_no=0
|
||||||
function updated_neigh(){
|
function updated_no_bct(){
|
||||||
neighbors.broadcast(updated, update_no)
|
neighbors.broadcast(updated, update_no)
|
||||||
}
|
}
|
|
@ -51,7 +51,6 @@ function step() {
|
||||||
statef=action
|
statef=action
|
||||||
|
|
||||||
statef()
|
statef()
|
||||||
|
|
||||||
log("Current state: ", BVMSTATE)
|
log("Current state: ", BVMSTATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,41 @@
|
||||||
|
include "act/states.bzz"
|
||||||
|
include "vstigenv.bzz"
|
||||||
|
|
||||||
updated="update_ack"
|
updated="update_ack"
|
||||||
update_no=0
|
update_no=0
|
||||||
function init(){
|
BVMSTATE = "UPDATESTANDBY"
|
||||||
barrier = stigmergy.create(101)
|
|
||||||
barrier.put(id,1)
|
|
||||||
barrier_val=0
|
|
||||||
barrier.onconflict(function (k,l,r) {
|
|
||||||
if(r. data < l. data or (r. data == l. data )) return l
|
|
||||||
else return r
|
|
||||||
})
|
|
||||||
|
|
||||||
s = swarm.create(1)
|
# Executed once at init time.
|
||||||
s.join()
|
function init(){
|
||||||
|
barrier = stigmergy.create(101)
|
||||||
|
barrier.put(id,1)
|
||||||
|
barrier_val=0
|
||||||
|
barrier.onconflict(function (k,l,r) {
|
||||||
|
if(r. data < l. data or (r. data == l. data )) return l
|
||||||
|
else return r
|
||||||
|
})
|
||||||
|
|
||||||
|
BVMSTATE = "UPDATESTANDBY"
|
||||||
|
init_swarm()
|
||||||
|
# start the swarm command listener
|
||||||
|
nei_cmd_listen()
|
||||||
}
|
}
|
||||||
|
|
||||||
function stand_by(){
|
function stand_by(){
|
||||||
|
barrier.get(id)
|
||||||
|
barrier_val = barrier.size()
|
||||||
|
|
||||||
barrier.get(id)
|
neighbors.listen(updated,
|
||||||
barrier_val = barrier.size()
|
function(vid, value, rid) {
|
||||||
|
print(" got from",vid," ", " value = ",value," ","rid"," " )
|
||||||
neighbors.listen(updated,
|
if(value==update_no) barrier.put(rid,1)
|
||||||
function(vid, value, rid) {
|
}
|
||||||
print(" got from",vid," ", " value = ",value," ","rid"," " )
|
|
||||||
if(value==update_no) barrier.put(rid,1)
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Executed at each time step.
|
||||||
function step() {
|
function step() {
|
||||||
|
stand_by()
|
||||||
stand_by()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
#ifndef BUZZ_UPDATE_H
|
#ifndef BUZZ_UPDATE_H
|
||||||
#define BUZZ_UPDATE_H
|
#define BUZZ_UPDATE_H
|
||||||
/*Simulation or robot check*/
|
|
||||||
//#define SIMULATION 1 // set in CMAKELIST
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -112,31 +110,30 @@ void code_message_inqueue_append(uint8_t* msg, uint16_t size);
|
||||||
void code_message_inqueue_process();
|
void code_message_inqueue_process();
|
||||||
|
|
||||||
/*****************************************************/
|
/*****************************************************/
|
||||||
/* obtains messages from out msgs queue of the updater*/
|
/*Obtains messages from out msgs queue of the updater*/
|
||||||
/*******************************************************/
|
/*******************************************************/
|
||||||
uint8_t* getupdater_out_msg();
|
uint8_t* getupdater_out_msg();
|
||||||
|
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
/*obtains out msg queue size*/
|
/*Obtains out msg queue size*/
|
||||||
/*****************************************************/
|
/*****************************************************/
|
||||||
uint8_t* getupdate_out_msg_size();
|
uint8_t* getupdate_out_msg_size();
|
||||||
|
|
||||||
/**************************************************/
|
/**************************************************/
|
||||||
/*destroys the out msg queue*/
|
/*Destroys the out msg queue*/
|
||||||
/*************************************************/
|
/*************************************************/
|
||||||
void destroy_out_msg_queue();
|
void destroy_out_msg_queue();
|
||||||
|
|
||||||
/***************************************************/
|
|
||||||
/*obatins updater state*/
|
|
||||||
/***************************************************/
|
|
||||||
// int get_update_mode();
|
|
||||||
|
|
||||||
// buzz_updater_elem_t get_updater();
|
// buzz_updater_elem_t get_updater();
|
||||||
/***************************************************/
|
/***************************************************/
|
||||||
/*sets bzz file name*/
|
/*Sets bzz file name*/
|
||||||
/***************************************************/
|
/***************************************************/
|
||||||
void set_bzz_file(const char* in_bzz_file);
|
void set_bzz_file(const char* in_bzz_file);
|
||||||
|
|
||||||
|
/****************************************************/
|
||||||
|
/*Tests the code from a buffer*/
|
||||||
|
/***************************************************/
|
||||||
|
|
||||||
int test_set_code(uint8_t* BO_BUF, const char* dbgfname, size_t bcode_size);
|
int test_set_code(uint8_t* BO_BUF, const char* dbgfname, size_t bcode_size);
|
||||||
|
|
||||||
/****************************************************/
|
/****************************************************/
|
||||||
|
@ -145,17 +142,22 @@ int test_set_code(uint8_t* BO_BUF, const char* dbgfname, size_t bcode_size);
|
||||||
|
|
||||||
void destroy_updater();
|
void destroy_updater();
|
||||||
|
|
||||||
|
/****************************************************/
|
||||||
|
/*Checks for updater message*/
|
||||||
|
/***************************************************/
|
||||||
|
|
||||||
int is_msg_present();
|
int is_msg_present();
|
||||||
|
|
||||||
int get_update_status();
|
/****************************************************/
|
||||||
|
/*Compiles a bzz script to bo and bdbg*/
|
||||||
void set_read_update_status();
|
/***************************************************/
|
||||||
|
|
||||||
int compile_bzz(std::string bzz_file);
|
int compile_bzz(std::string bzz_file);
|
||||||
|
|
||||||
|
/****************************************************/
|
||||||
|
/*Set number of robots in the updater*/
|
||||||
|
/***************************************************/
|
||||||
|
|
||||||
void updates_set_robots(int robots);
|
void updates_set_robots(int robots);
|
||||||
|
|
||||||
// void set_packet_id(int packet_id);
|
|
||||||
|
|
||||||
// void collect_data(std::ofstream& logger);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,4 +77,6 @@ buzzvm_t get_vm();
|
||||||
void set_robot_var(int ROBOTS);
|
void set_robot_var(int ROBOTS);
|
||||||
|
|
||||||
int get_inmsg_size();
|
int get_inmsg_size();
|
||||||
|
|
||||||
|
std::string getuavstate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,10 +85,6 @@ double* getgoto();
|
||||||
* returns the current grid
|
* returns the current grid
|
||||||
*/
|
*/
|
||||||
std::map<int, std::map<int,int>> getgrid();
|
std::map<int, std::map<int,int>> getgrid();
|
||||||
/*
|
|
||||||
* returns the current Buzz state
|
|
||||||
*/
|
|
||||||
std::string getuavstate();
|
|
||||||
/*
|
/*
|
||||||
* returns the gimbal commands
|
* returns the gimbal commands
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -45,7 +45,7 @@ void init_update_monitor(const char* bo_filename, const char* stand_by_script, c
|
||||||
{
|
{
|
||||||
perror("inotify_init error");
|
perror("inotify_init error");
|
||||||
}
|
}
|
||||||
/*If simulation set the file monitor only for robot 1*/
|
/*If simulation set the file monitor only for robot 0*/
|
||||||
if (SIMULATION == 1 && robot_id == 0)
|
if (SIMULATION == 1 && robot_id == 0)
|
||||||
{
|
{
|
||||||
/* watch /.bzz file for any activity and report it back to update */
|
/* watch /.bzz file for any activity and report it back to update */
|
||||||
|
@ -321,6 +321,7 @@ void code_message_inqueue_process()
|
||||||
// fprintf(stdout,"[debug]Inside inmsg code running");
|
// fprintf(stdout,"[debug]Inside inmsg code running");
|
||||||
if (*(uint8_t*)(updater->inmsg_queue->queue) == SENT_CODE)
|
if (*(uint8_t*)(updater->inmsg_queue->queue) == SENT_CODE)
|
||||||
{
|
{
|
||||||
|
updated = 1;
|
||||||
size += sizeof(uint8_t);
|
size += sizeof(uint8_t);
|
||||||
if (*(uint16_t*)(updater->inmsg_queue->queue + size) > *(uint16_t*)(updater->update_no))
|
if (*(uint16_t*)(updater->inmsg_queue->queue + size) > *(uint16_t*)(updater->update_no))
|
||||||
{
|
{
|
||||||
|
@ -413,9 +414,6 @@ void create_update_patch()
|
||||||
fprintf(stdout, "Launching bsdiff command: %s \n", genpatch.str().c_str());
|
fprintf(stdout, "Launching bsdiff command: %s \n", genpatch.str().c_str());
|
||||||
system(genpatch.str().c_str());
|
system(genpatch.str().c_str());
|
||||||
|
|
||||||
// BETTER: CALL THE FUNCTION IN BSDIFF.CPP
|
|
||||||
// bsdiff_do(path + name1 + ".bo", path + name2 + ".bo", path + "diff.bo");
|
|
||||||
|
|
||||||
/* delete old files & rename new files */
|
/* delete old files & rename new files */
|
||||||
|
|
||||||
remove((path + name1 + ".bo").c_str());
|
remove((path + name1 + ".bo").c_str());
|
||||||
|
@ -460,7 +458,7 @@ void update_routine()
|
||||||
// fprintf(stdout,"[Debug : ]updater value = %i \n",updater->mode);
|
// fprintf(stdout,"[Debug : ]updater value = %i \n",updater->mode);
|
||||||
if (*(int*)updater->mode == CODE_RUNNING)
|
if (*(int*)updater->mode == CODE_RUNNING)
|
||||||
{
|
{
|
||||||
buzzvm_function_call(VM, "updated_neigh", 0);
|
buzzvm_function_call(VM, "updated_no_bct", 0);
|
||||||
// Check for update
|
// Check for update
|
||||||
if (check_update())
|
if (check_update())
|
||||||
{
|
{
|
||||||
|
@ -479,7 +477,7 @@ void update_routine()
|
||||||
name = name.substr(0, name.find_last_of("."));
|
name = name.substr(0, name.find_last_of("."));
|
||||||
bzzfile_in_compile << path << name << "-update.bo";
|
bzzfile_in_compile << path << name << "-update.bo";
|
||||||
uint8_t* BO_BUF = 0;
|
uint8_t* BO_BUF = 0;
|
||||||
FILE* fp = fopen(bzzfile_in_compile.str().c_str(), "rb"); // to change file edit
|
FILE* fp = fopen(bzzfile_in_compile.str().c_str(), "rb");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
perror(bzzfile_in_compile.str().c_str());
|
perror(bzzfile_in_compile.str().c_str());
|
||||||
|
@ -528,7 +526,6 @@ void update_routine()
|
||||||
// collect_data();
|
// collect_data();
|
||||||
buzz_utility::buzz_update_set((updater)->bcode, (char*)dbgf_name, *(size_t*)(updater->bcode_size));
|
buzz_utility::buzz_update_set((updater)->bcode, (char*)dbgf_name, *(size_t*)(updater->bcode_size));
|
||||||
// buzzvm_function_call(m_tBuzzVM, "updated", 0);
|
// buzzvm_function_call(m_tBuzzVM, "updated", 0);
|
||||||
updated = 1;
|
|
||||||
update_try_counter = 0;
|
update_try_counter = 0;
|
||||||
timer_steps = 0;
|
timer_steps = 0;
|
||||||
}
|
}
|
||||||
|
@ -538,7 +535,6 @@ void update_routine()
|
||||||
/*Time out hit deceided to roll back*/
|
/*Time out hit deceided to roll back*/
|
||||||
*(int*)(updater->mode) = CODE_RUNNING;
|
*(int*)(updater->mode) = CODE_RUNNING;
|
||||||
buzz_utility::buzz_script_set(old_bcfname, dbgf_name, (int)VM->robot);
|
buzz_utility::buzz_script_set(old_bcfname, dbgf_name, (int)VM->robot);
|
||||||
updated = 1;
|
|
||||||
update_try_counter = 0;
|
update_try_counter = 0;
|
||||||
timer_steps = 0;
|
timer_steps = 0;
|
||||||
}
|
}
|
||||||
|
@ -580,6 +576,9 @@ int test_set_code(uint8_t* BO_BUF, const char* dbgfname, size_t bcode_size)
|
||||||
buzzvm_pushs(VM, buzzvm_string_register(VM, "ROBOTS", 1));
|
buzzvm_pushs(VM, buzzvm_string_register(VM, "ROBOTS", 1));
|
||||||
buzzvm_pushi(VM, no_of_robot);
|
buzzvm_pushi(VM, no_of_robot);
|
||||||
buzzvm_gstore(VM);
|
buzzvm_gstore(VM);
|
||||||
|
buzzvm_pushs(VM, buzzvm_string_register(VM, "BVMSTATE", 1));
|
||||||
|
buzzvm_pushs(VM, buzzvm_string_register(VM, "UPDATE", 1));
|
||||||
|
buzzvm_gstore(VM);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*Unable to step something wrong*/
|
/*Unable to step something wrong*/
|
||||||
|
@ -634,18 +633,6 @@ void destroy_out_msg_queue()
|
||||||
delete_p(updater->outmsg_queue);
|
delete_p(updater->outmsg_queue);
|
||||||
updater_msg_ready = 0;
|
updater_msg_ready = 0;
|
||||||
}
|
}
|
||||||
int get_update_status()
|
|
||||||
{
|
|
||||||
return updated;
|
|
||||||
}
|
|
||||||
void set_read_update_status()
|
|
||||||
{
|
|
||||||
updated = 0;
|
|
||||||
}
|
|
||||||
/*int get_update_mode()
|
|
||||||
{
|
|
||||||
return (int)*(int*)(updater->mode);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
int is_msg_present()
|
int is_msg_present()
|
||||||
{
|
{
|
||||||
|
|
|
@ -351,17 +351,17 @@ int buzz_update_set(uint8_t* UP_BO_BUF, const char* bdbg_filename, size_t bcode_
|
||||||
// Set byte code
|
// Set byte code
|
||||||
if (buzzvm_set_bcode(VM, UP_BO_BUF, bcode_size) != BUZZVM_STATE_READY)
|
if (buzzvm_set_bcode(VM, UP_BO_BUF, bcode_size) != BUZZVM_STATE_READY)
|
||||||
{
|
{
|
||||||
|
ROS_ERROR("[%i] %s: Error loading Buzz bytecode, VM state : %i", Robot_id, VM->state);
|
||||||
buzzvm_destroy(&VM);
|
buzzvm_destroy(&VM);
|
||||||
buzzdebug_destroy(&DBG_INFO);
|
buzzdebug_destroy(&DBG_INFO);
|
||||||
ROS_ERROR("[%i] %s: Error loading Buzz bytecode (update)", Robot_id);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// Register hook functions
|
// Register hook functions
|
||||||
if (buzz_register_hooks() != BUZZVM_STATE_READY)
|
if (buzz_register_hooks() != BUZZVM_STATE_READY)
|
||||||
{
|
{
|
||||||
|
ROS_ERROR("[%i] Error registering hooks, VM state : %i", Robot_id, VM->state);
|
||||||
buzzvm_destroy(&VM);
|
buzzvm_destroy(&VM);
|
||||||
buzzdebug_destroy(&DBG_INFO);
|
buzzdebug_destroy(&DBG_INFO);
|
||||||
ROS_ERROR("[%i] Error registering hooks (update)", Robot_id);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,7 +379,7 @@ int buzz_update_set(uint8_t* UP_BO_BUF, const char* bdbg_filename, size_t bcode_
|
||||||
// Call the Init() function
|
// Call the Init() function
|
||||||
if (buzzvm_function_call(VM, "init", 0) != BUZZVM_STATE_READY)
|
if (buzzvm_function_call(VM, "init", 0) != BUZZVM_STATE_READY)
|
||||||
{
|
{
|
||||||
ROS_ERROR("Error in calling init, VM state : %i", VM->state);
|
ROS_ERROR("Error in calling init, VM state : %i", VM->state);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// All OK
|
// All OK
|
||||||
|
@ -564,4 +564,21 @@ int get_inmsg_size()
|
||||||
{
|
{
|
||||||
return IN_MSG.size();
|
return IN_MSG.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string getuavstate()
|
||||||
|
/*
|
||||||
|
/ return current BVM state
|
||||||
|
---------------------------------------*/
|
||||||
|
{
|
||||||
|
std::string uav_state = "Unknown";
|
||||||
|
if(VM && VM->strings){
|
||||||
|
buzzvm_pushs(VM, buzzvm_string_register(VM, "BVMSTATE", 1));
|
||||||
|
buzzvm_gload(VM);
|
||||||
|
buzzobj_t obj = buzzvm_stack_at(VM, 1);
|
||||||
|
uav_state = string(obj->s.value.str);
|
||||||
|
buzzvm_pop(VM);
|
||||||
|
}
|
||||||
|
return uav_state;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -479,19 +479,6 @@ float* getgimbal()
|
||||||
return rc_gimbal;
|
return rc_gimbal;
|
||||||
}
|
}
|
||||||
|
|
||||||
string getuavstate()
|
|
||||||
/*
|
|
||||||
/ return current BVM state
|
|
||||||
---------------------------------------*/
|
|
||||||
{
|
|
||||||
static buzzvm_t VM = buzz_utility::get_vm();
|
|
||||||
buzzvm_pushs(VM, buzzvm_string_register(VM, "BVMSTATE", 1));
|
|
||||||
buzzvm_gload(VM);
|
|
||||||
buzzobj_t uav_state = buzzvm_stack_at(VM, 1);
|
|
||||||
buzzvm_pop(VM);
|
|
||||||
return uav_state->s.value.str;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getcmd()
|
int getcmd()
|
||||||
/*
|
/*
|
||||||
/ return current mavros command to the FC
|
/ return current mavros command to the FC
|
||||||
|
|
|
@ -120,6 +120,7 @@ void roscontroller::RosControllerRun()
|
||||||
send_MPpayload();
|
send_MPpayload();
|
||||||
// Check updater state and step code
|
// Check updater state and step code
|
||||||
update_routine();
|
update_routine();
|
||||||
|
ROS_WARN("OUT OF UPDATE ROUTINE");
|
||||||
if (time_step == BUZZRATE)
|
if (time_step == BUZZRATE)
|
||||||
{
|
{
|
||||||
time_step = 0;
|
time_step = 0;
|
||||||
|
@ -144,10 +145,10 @@ void roscontroller::RosControllerRun()
|
||||||
// Call the flight controler service
|
// Call the flight controler service
|
||||||
flight_controller_service_call();
|
flight_controller_service_call();
|
||||||
// Set multi message available after update
|
// Set multi message available after update
|
||||||
if (get_update_status())
|
//if (get_update_status())
|
||||||
{
|
//{
|
||||||
set_read_update_status();
|
// set_read_update_status();
|
||||||
}
|
//}
|
||||||
// Set ROBOTS variable (swarm size)
|
// Set ROBOTS variable (swarm size)
|
||||||
get_number_of_robots();
|
get_number_of_robots();
|
||||||
buzz_utility::set_robot_var(no_of_robots);
|
buzz_utility::set_robot_var(no_of_robots);
|
||||||
|
@ -455,7 +456,7 @@ void roscontroller::uavstate_publisher()
|
||||||
/----------------------------------------------------*/
|
/----------------------------------------------------*/
|
||||||
{
|
{
|
||||||
std_msgs::String uavstate_msg;
|
std_msgs::String uavstate_msg;
|
||||||
uavstate_msg.data = buzzuav_closures::getuavstate();
|
uavstate_msg.data = buzz_utility::getuavstate();
|
||||||
uavstate_pub.publish(uavstate_msg);
|
uavstate_pub.publish(uavstate_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue