forked from Archive/PX4-Autopilot
Compare commits
1 Commits
main
...
pr-paramet
Author | SHA1 | Date |
---|---|---|
Daniel Agar | bbc9a8c9bb |
|
@ -137,5 +137,8 @@
|
||||||
"workbench.settings.enableNaturalLanguageSearch": false,
|
"workbench.settings.enableNaturalLanguageSearch": false,
|
||||||
"yaml.schemas": {
|
"yaml.schemas": {
|
||||||
"${workspaceFolder}/validation/module_schema.yaml": "${workspaceFolder}/src/modules/*/module.yaml"
|
"${workspaceFolder}/validation/module_schema.yaml": "${workspaceFolder}/src/modules/*/module.yaml"
|
||||||
}
|
},
|
||||||
|
"python.autoComplete.extraPaths": [
|
||||||
|
"/opt/ros/foxy/lib/python3.8/site-packages"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -369,7 +369,7 @@ __EXPORT void board_crashdump(uintptr_t currentsp, FAR void *tcb, FAR const char
|
||||||
pdump->info.flags |= eInvalidUserStackPtr;
|
pdump->info.flags |= eInvalidUserStackPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rv = px4_savepanic(HARDFAULT_FILENO, (uint8_t *)pdump, sizeof(fullcontext_s));
|
int rv = stm32_bbsram_savepanic(HARDFAULT_FILENO, (uint8_t *)pdump, sizeof(fullcontext_s));
|
||||||
|
|
||||||
/* Test if memory got wiped because of using _sdata */
|
/* Test if memory got wiped because of using _sdata */
|
||||||
|
|
||||||
|
|
|
@ -87,10 +87,6 @@ __BEGIN_DECLS
|
||||||
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
||||||
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
||||||
|
|
||||||
#define kinetis_bbsram_savepanic(fileno, context, length) (0) // todo:Not implemented yet
|
|
||||||
|
|
||||||
#define px4_savepanic(fileno, context, length) kinetis_bbsram_savepanic(fileno, context, length)
|
|
||||||
|
|
||||||
/* bus_num is zero based on kinetis and must be translated from the legacy one based */
|
/* bus_num is zero based on kinetis and must be translated from the legacy one based */
|
||||||
|
|
||||||
#define PX4_BUS_OFFSET 1 /* Kinetis buses are 0 based and adjustment is needed */
|
#define PX4_BUS_OFFSET 1 /* Kinetis buses are 0 based and adjustment is needed */
|
||||||
|
|
|
@ -82,10 +82,6 @@ __BEGIN_DECLS
|
||||||
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
||||||
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
||||||
|
|
||||||
#define imxrt_bbsram_savepanic(fileno, context, length) (0) // todo:Not implemented yet
|
|
||||||
|
|
||||||
#define px4_savepanic(fileno, context, length) imxrt_bbsram_savepanic(fileno, context, length)
|
|
||||||
|
|
||||||
/* bus_num is 1 based on imx and must be translated from the legacy one based */
|
/* bus_num is 1 based on imx and must be translated from the legacy one based */
|
||||||
|
|
||||||
#define PX4_BUS_OFFSET 0 /* imxrt buses are 1 based no adjustment needed */
|
#define PX4_BUS_OFFSET 0 /* imxrt buses are 1 based no adjustment needed */
|
||||||
|
|
|
@ -89,10 +89,6 @@ __BEGIN_DECLS
|
||||||
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
||||||
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
||||||
|
|
||||||
#define s32k1xx_bbsram_savepanic(fileno, context, length) (0) // todo:Not implemented yet
|
|
||||||
|
|
||||||
#define px4_savepanic(fileno, context, length) s32k1xx_bbsram_savepanic(fileno, context, length)
|
|
||||||
|
|
||||||
/* bus_num is zero based on s32k1xx and must be translated from the legacy one based */
|
/* bus_num is zero based on s32k1xx and must be translated from the legacy one based */
|
||||||
|
|
||||||
#define PX4_BUS_OFFSET 1 /* s32k1xx buses are 0 based and adjustment is needed */
|
#define PX4_BUS_OFFSET 1 /* s32k1xx buses are 0 based and adjustment is needed */
|
||||||
|
|
|
@ -88,8 +88,6 @@ __BEGIN_DECLS
|
||||||
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_UUID_WORD32_FORMAT_SIZE (PX4_CPU_UUID_WORD32_LENGTH-1+(2*PX4_CPU_UUID_BYTE_LENGTH)+1)
|
||||||
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
#define PX4_CPU_MFGUID_FORMAT_SIZE ((2*PX4_CPU_MFGUID_BYTE_LENGTH)+1)
|
||||||
|
|
||||||
#define px4_savepanic(fileno, context, length) stm32_bbsram_savepanic(fileno, context, length)
|
|
||||||
|
|
||||||
#define PX4_BUS_OFFSET 0 /* STM buses are 1 based no adjustment needed */
|
#define PX4_BUS_OFFSET 0 /* STM buses are 1 based no adjustment needed */
|
||||||
#define px4_spibus_initialize(bus_num_1based) stm32_spibus_initialize(bus_num_1based)
|
#define px4_spibus_initialize(bus_num_1based) stm32_spibus_initialize(bus_num_1based)
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ if (NOT "${PX4_BOARD}" MATCHES "px4_io")
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(parameters PRIVATE perf tinybson px4_layer)
|
target_link_libraries(parameters PRIVATE perf tinybson px4_layer)
|
||||||
target_compile_definitions(parameters PRIVATE -DMODULE_NAME="parameters")
|
target_compile_definitions(parameters PRIVATE -DMODULE_NAME="parameters" -DDEBUG_BUILD)
|
||||||
target_compile_options(parameters
|
target_compile_options(parameters
|
||||||
PRIVATE
|
PRIVATE
|
||||||
-Wno-cast-align # TODO: fix and enable
|
-Wno-cast-align # TODO: fix and enable
|
||||||
|
|
|
@ -117,7 +117,7 @@ param_export_internal(bool only_unsaved, param_filter_func filter)
|
||||||
case PARAM_TYPE_INT32:
|
case PARAM_TYPE_INT32:
|
||||||
i = s->val.i;
|
i = s->val.i;
|
||||||
|
|
||||||
if (bson_encoder_append_int(&encoder, param_name(s->param), i)) {
|
if (bson_encoder_append_int32(&encoder, param_name(s->param), i)) {
|
||||||
debug("BSON append failed for '%s'", param_name(s->param));
|
debug("BSON append failed for '%s'", param_name(s->param));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1009,6 +1009,8 @@ int param_reset_no_notification(param_t param) { return param_reset_internal(par
|
||||||
static void
|
static void
|
||||||
param_reset_all_internal(bool auto_save)
|
param_reset_all_internal(bool auto_save)
|
||||||
{
|
{
|
||||||
|
PX4_INFO("param_reset_all_internal");
|
||||||
|
|
||||||
param_lock_writer();
|
param_lock_writer();
|
||||||
|
|
||||||
if (param_values != nullptr) {
|
if (param_values != nullptr) {
|
||||||
|
@ -1131,33 +1133,42 @@ int param_save_default()
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write parameters to temp file */
|
|
||||||
int fd = PARAM_OPEN(filename, O_WRONLY | O_CREAT, PX4_O_MODE_666);
|
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
PX4_ERR("failed to open param file: %s", filename);
|
|
||||||
|
|
||||||
return PX4_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
int attempts = 5;
|
int attempts = 5;
|
||||||
|
|
||||||
while (res != OK && attempts > 0) {
|
while (res != OK && attempts > 0) {
|
||||||
res = param_export(fd, false, nullptr);
|
|
||||||
attempts--;
|
|
||||||
|
|
||||||
if (res != PX4_OK) {
|
/* write parameters to temp file */
|
||||||
|
int fd = ::open(filename, O_WRONLY | O_CREAT, PX4_O_MODE_666);
|
||||||
|
|
||||||
|
if (fd >= 0) {
|
||||||
|
PX4_DEBUG("param export %d/5", attempts - 4);
|
||||||
|
res = param_export(fd, false, nullptr);
|
||||||
|
::close(fd);
|
||||||
|
|
||||||
|
if (res == PX4_OK) {
|
||||||
|
fd = -1;
|
||||||
|
|
||||||
|
static const char *backup_file = PX4_ROOTFSDIR"/eeprom/parameters_backup.bson";
|
||||||
|
fd = ::open(backup_file, O_WRONLY | O_CREAT, PX4_O_MODE_666);
|
||||||
|
res = param_export(fd, false, nullptr);
|
||||||
|
::close(fd);
|
||||||
|
|
||||||
|
} else {
|
||||||
PX4_ERR("param_export failed, retrying %d", attempts);
|
PX4_ERR("param_export failed, retrying %d", attempts);
|
||||||
lseek(fd, 0, SEEK_SET); // jump back to the beginning of the file
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
PX4_ERR("failed to open param file: %s", filename);
|
||||||
|
return PX4_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
attempts--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res != OK) {
|
if (res != OK) {
|
||||||
PX4_ERR("failed to write parameters to file: %s", filename);
|
PX4_ERR("failed to write parameters to file: %s", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
PARAM_CLOSE(fd);
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1200,20 +1211,19 @@ param_load_default()
|
||||||
int
|
int
|
||||||
param_export(int fd, bool only_unsaved, param_filter_func filter)
|
param_export(int fd, bool only_unsaved, param_filter_func filter)
|
||||||
{
|
{
|
||||||
int result = -1;
|
|
||||||
perf_begin(param_export_perf);
|
perf_begin(param_export_perf);
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
param_lock_writer();
|
param_lock_writer();
|
||||||
// flash_param_save() will take the shutdown lock
|
// flash_param_save() will take the shutdown lock
|
||||||
result = flash_param_save(only_unsaved, filter);
|
int result = flash_param_save(only_unsaved, filter);
|
||||||
param_unlock_writer();
|
param_unlock_writer();
|
||||||
perf_end(param_export_perf);
|
perf_end(param_export_perf);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
param_wbuf_s *s = nullptr;
|
|
||||||
struct bson_encoder_s encoder;
|
|
||||||
|
|
||||||
int shutdown_lock_ret = px4_shutdown_lock();
|
int shutdown_lock_ret = px4_shutdown_lock();
|
||||||
|
|
||||||
|
@ -1226,16 +1236,31 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
||||||
|
|
||||||
param_lock_reader();
|
param_lock_reader();
|
||||||
|
|
||||||
|
bson_encoder_s encoder{};
|
||||||
uint8_t bson_buffer[256];
|
uint8_t bson_buffer[256];
|
||||||
bson_encoder_init_buf_file(&encoder, fd, &bson_buffer, sizeof(bson_buffer));
|
bson_encoder_init_buf_file(&encoder, fd, &bson_buffer, sizeof(bson_buffer));
|
||||||
|
|
||||||
|
int result = PX4_ERROR;
|
||||||
|
param_wbuf_s *s = nullptr;
|
||||||
|
uint32_t export_crc32 = 0;
|
||||||
|
uint32_t export_count_int32 = 0;
|
||||||
|
uint32_t export_count_double = 0;
|
||||||
|
size_t total_size = sizeof(int32_t);
|
||||||
|
|
||||||
/* no modified parameters -> we are done */
|
/* no modified parameters -> we are done */
|
||||||
if (param_values == nullptr) {
|
if (param_values == nullptr) {
|
||||||
result = 0;
|
result = PX4_OK;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((s = (param_wbuf_s *)utarray_next(param_values, s)) != nullptr) {
|
||||||
|
|
||||||
|
if (encoder.dead) {
|
||||||
|
PX4_ERR("bson encoder dead!");
|
||||||
|
result = PX4_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((s = (struct param_wbuf_s *)utarray_next(param_values, s)) != nullptr) {
|
|
||||||
/*
|
/*
|
||||||
* If we are only saving values changed since last save, and this
|
* If we are only saving values changed since last save, and this
|
||||||
* one hasn't, then skip it
|
* one hasn't, then skip it
|
||||||
|
@ -1275,28 +1300,39 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
||||||
|
|
||||||
s->unsaved = false;
|
s->unsaved = false;
|
||||||
|
|
||||||
const char *name = param_name(s->param);
|
|
||||||
const size_t size = param_size(s->param);
|
|
||||||
|
|
||||||
/* append the appropriate BSON type object */
|
/* append the appropriate BSON type object */
|
||||||
switch (param_type(s->param)) {
|
switch (param_type(s->param)) {
|
||||||
|
|
||||||
case PARAM_TYPE_INT32: {
|
case PARAM_TYPE_INT32: {
|
||||||
|
const char *name = param_name(s->param);
|
||||||
const int32_t i = s->val.i;
|
const int32_t i = s->val.i;
|
||||||
PX4_DEBUG("exporting: %s (%d) size: %lu val: %d", name, s->param, (long unsigned int)size, i);
|
size_t bson_size = sizeof(int8_t) + strlen(name) + 1 + sizeof(i);
|
||||||
|
total_size += bson_size;
|
||||||
|
PX4_DEBUG("exporting: %s (%d) (name size: %d) size: %lu val: %d - size: %d, total_size: %d", name, s->param,
|
||||||
|
strlen(name) + 1, (long unsigned int)param_size(s->param), i, bson_size, total_size);
|
||||||
|
|
||||||
if (bson_encoder_append_int(&encoder, name, i)) {
|
if (bson_encoder_append_int32(&encoder, name, i) == 0) {
|
||||||
|
export_count_int32++;
|
||||||
|
|
||||||
|
} else {
|
||||||
PX4_ERR("BSON append failed for '%s'", name);
|
PX4_ERR("BSON append failed for '%s'", name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PARAM_TYPE_FLOAT: {
|
case PARAM_TYPE_FLOAT: {
|
||||||
|
const char *name = param_name(s->param);
|
||||||
const double f = (double)s->val.f;
|
const double f = (double)s->val.f;
|
||||||
PX4_DEBUG("exporting: %s (%d) size: %lu val: %.3f", name, s->param, (long unsigned int)size, (double)f);
|
size_t bson_size = sizeof(int8_t) + strlen(name) + 1 + sizeof(f);
|
||||||
|
total_size += bson_size;
|
||||||
|
PX4_DEBUG("exporting: %s (%d) (name size: %d) size: %lu val: %.3f - size: %d, total_size: %d", name, s->param,
|
||||||
|
strlen(name) + 1, (long unsigned int)param_size(s->param), (double)f, bson_size, total_size);
|
||||||
|
|
||||||
if (bson_encoder_append_double(&encoder, name, f)) {
|
if (bson_encoder_append_double(&encoder, name, f) == 0) {
|
||||||
|
export_count_double++;
|
||||||
|
|
||||||
|
} else {
|
||||||
PX4_ERR("BSON append failed for '%s'", name);
|
PX4_ERR("BSON append failed for '%s'", name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1307,16 +1343,29 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
||||||
PX4_ERR("unrecognized parameter type");
|
PX4_ERR("unrecognized parameter type");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *name = param_name(s->param);
|
||||||
|
const void *val = &(s->val);
|
||||||
|
export_crc32 = crc32part((const uint8_t *)name, strlen(name), export_crc32);
|
||||||
|
export_crc32 = crc32part((const uint8_t *)val, param_size(s->param), export_crc32);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = 0;
|
result = PX4_OK;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
if (result == 0) {
|
if (result == PX4_OK) {
|
||||||
|
bson_encoder_append_int32(&encoder, "PX4_PARAMETER_CRC32", export_crc32);
|
||||||
|
bson_encoder_append_int32(&encoder, "PX4_PARAMETER_COUNT_INT32", export_count_int32);
|
||||||
|
bson_encoder_append_int32(&encoder, "PX4_PARAMETER_COUNT_DOUBLE", export_count_double);
|
||||||
|
|
||||||
|
PX4_DEBUG("bson_encoder_fini");
|
||||||
|
|
||||||
if (bson_encoder_fini(&encoder) != PX4_OK) {
|
if (bson_encoder_fini(&encoder) != PX4_OK) {
|
||||||
PX4_ERR("bson encoder finish failed");
|
PX4_ERR("bson encoder finish failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PX4_DEBUG("BSON final size = %d, crc32: %X", encoder.total_written_size, export_crc32);
|
||||||
}
|
}
|
||||||
|
|
||||||
param_unlock_reader();
|
param_unlock_reader();
|
||||||
|
@ -1373,6 +1422,11 @@ param_import_callback(bson_decoder_t decoder, void *priv, bson_node_t node)
|
||||||
|
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case BSON_INT32: {
|
case BSON_INT32: {
|
||||||
|
if (strcmp(node->name, "PX4_PARAMETER_CRC32") == 0) {
|
||||||
|
int32_t crc32 = node->i;
|
||||||
|
PX4_INFO("%s = %X", node->name, crc32);
|
||||||
|
|
||||||
|
} else {
|
||||||
if (param_type(param) != PARAM_TYPE_INT32) {
|
if (param_type(param) != PARAM_TYPE_INT32) {
|
||||||
PX4_WARN("unexpected type for %s", node->name);
|
PX4_WARN("unexpected type for %s", node->name);
|
||||||
result = 1; // just skip this entry
|
result = 1; // just skip this entry
|
||||||
|
@ -1384,6 +1438,7 @@ param_import_callback(bson_decoder_t decoder, void *priv, bson_node_t node)
|
||||||
|
|
||||||
PX4_DEBUG("Imported %s with value %d", param_name(param), i);
|
PX4_DEBUG("Imported %s with value %d", param_name(param), i);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BSON_DOUBLE: {
|
case BSON_DOUBLE: {
|
||||||
|
@ -1405,6 +1460,11 @@ param_import_callback(bson_decoder_t decoder, void *priv, bson_node_t node)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
decoder->import_scratch = crc32part((const uint8_t *)node->name, strlen(node->name), decoder->import_scratch);
|
||||||
|
decoder->import_scratch = crc32part((const uint8_t *)v, param_size(param), decoder->import_scratch);
|
||||||
|
}
|
||||||
|
|
||||||
if (param_set_internal(param, v, state->mark_saved, true)) {
|
if (param_set_internal(param, v, state->mark_saved, true)) {
|
||||||
PX4_DEBUG("error setting value for '%s'", node->name);
|
PX4_DEBUG("error setting value for '%s'", node->name);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1420,6 +1480,11 @@ out:
|
||||||
static int
|
static int
|
||||||
param_import_internal(int fd, bool mark_saved)
|
param_import_internal(int fd, bool mark_saved)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
off_t fsize = lseek(fd, 0, SEEK_END);
|
||||||
|
PX4_DEBUG("param file size = %d", fsize);
|
||||||
|
lseek(fd, 0, SEEK_SET);
|
||||||
|
|
||||||
bson_decoder_s decoder;
|
bson_decoder_s decoder;
|
||||||
param_import_state state;
|
param_import_state state;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
@ -1434,7 +1499,9 @@ param_import_internal(int fd, bool mark_saved)
|
||||||
do {
|
do {
|
||||||
result = bson_decoder_next(&decoder);
|
result = bson_decoder_next(&decoder);
|
||||||
|
|
||||||
} while (result > 0);
|
} while (result > 0 && !decoder.dead);
|
||||||
|
|
||||||
|
PX4_DEBUG("bson decode finished total bytes: %d, crc32: %X", decoder.total_bytes_imported, decoder.import_scratch);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1149,7 +1149,7 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
||||||
|
|
||||||
PX4_DEBUG("exporting: %s (%d) size: %d val: %d", name, s->param, size, i);
|
PX4_DEBUG("exporting: %s (%d) size: %d val: %d", name, s->param, size, i);
|
||||||
|
|
||||||
if (bson_encoder_append_int(&encoder, name, i)) {
|
if (bson_encoder_append_int32(&encoder, name, i)) {
|
||||||
PX4_ERR("BSON append failed for '%s'", name);
|
PX4_ERR("BSON append failed for '%s'", name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,5 +33,5 @@
|
||||||
|
|
||||||
add_library(tinybson tinybson.cpp)
|
add_library(tinybson tinybson.cpp)
|
||||||
target_compile_definitions(tinybson PRIVATE -DMODULE_NAME="tinybson")
|
target_compile_definitions(tinybson PRIVATE -DMODULE_NAME="tinybson")
|
||||||
target_compile_options(tinybson PRIVATE -Wno-sign-compare) # TODO: fix this
|
target_compile_options(tinybson PRIVATE -Wno-sign-compare -Wno-error) # TODO: fix this
|
||||||
add_dependencies(tinybson prebuild_targets)
|
add_dependencies(tinybson prebuild_targets)
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
#include "tinybson.h"
|
#include "tinybson.h"
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
# define debug(fmt, args...) do { PX4_INFO("BSON: " fmt, ##args); } while(0)
|
# define debug(fmt, args...) do { PX4_INFO("BSON: " fmt, ##args); } while(0)
|
||||||
#else
|
#else
|
||||||
# define debug(fmt, args...) do { } while(0)
|
# define debug(fmt, args...) do { } while(0)
|
||||||
|
@ -64,7 +64,14 @@ read_x(bson_decoder_t decoder, void *p, size_t s)
|
||||||
CODER_CHECK(decoder);
|
CODER_CHECK(decoder);
|
||||||
|
|
||||||
if (decoder->fd > -1) {
|
if (decoder->fd > -1) {
|
||||||
return (BSON_READ(decoder->fd, p, s) == s) ? 0 : -1;
|
int ret = BSON_READ(decoder->fd, p, s);
|
||||||
|
|
||||||
|
if (ret == s) {
|
||||||
|
decoder->total_bytes_imported += ret;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (decoder->buf != nullptr) {
|
if (decoder->buf != nullptr) {
|
||||||
|
@ -79,6 +86,7 @@ read_x(bson_decoder_t decoder, void *p, size_t s)
|
||||||
|
|
||||||
memcpy(p, (decoder->buf + decoder->bufpos), s);
|
memcpy(p, (decoder->buf + decoder->bufpos), s);
|
||||||
decoder->bufpos += s;
|
decoder->bufpos += s;
|
||||||
|
decoder->total_bytes_imported += s;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,8 +121,6 @@ read_double(bson_decoder_t decoder, double *d)
|
||||||
int
|
int
|
||||||
bson_decoder_init_file(bson_decoder_t decoder, int fd, bson_decoder_callback callback, void *priv)
|
bson_decoder_init_file(bson_decoder_t decoder, int fd, bson_decoder_callback callback, void *priv)
|
||||||
{
|
{
|
||||||
int32_t junk;
|
|
||||||
|
|
||||||
decoder->fd = fd;
|
decoder->fd = fd;
|
||||||
decoder->buf = nullptr;
|
decoder->buf = nullptr;
|
||||||
decoder->dead = false;
|
decoder->dead = false;
|
||||||
|
@ -125,10 +131,14 @@ bson_decoder_init_file(bson_decoder_t decoder, int fd, bson_decoder_callback cal
|
||||||
decoder->node.type = BSON_UNDEFINED;
|
decoder->node.type = BSON_UNDEFINED;
|
||||||
|
|
||||||
/* read and discard document size */
|
/* read and discard document size */
|
||||||
if (read_int32(decoder, &junk)) {
|
int32_t junk_size = 0;
|
||||||
|
|
||||||
|
if (read_int32(decoder, &junk_size)) {
|
||||||
CODER_KILL(decoder, "failed discarding length");
|
CODER_KILL(decoder, "failed discarding length");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug("junk_size = %d", junk_size);
|
||||||
|
|
||||||
/* ready for decoding */
|
/* ready for decoding */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -340,7 +350,14 @@ write_x(bson_encoder_t encoder, const void *p, size_t s)
|
||||||
|
|
||||||
/* bson file encoder (non-buffered) */
|
/* bson file encoder (non-buffered) */
|
||||||
if (encoder->fd > -1 && encoder->buf == nullptr) {
|
if (encoder->fd > -1 && encoder->buf == nullptr) {
|
||||||
return (BSON_WRITE(encoder->fd, p, s) == (int)s) ? 0 : -1;
|
int ret = BSON_WRITE(encoder->fd, p, s);
|
||||||
|
|
||||||
|
if (ret == s) {
|
||||||
|
encoder->total_written_size += ret;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do we need to extend the buffer? */
|
/* do we need to extend the buffer? */
|
||||||
|
@ -353,6 +370,8 @@ write_x(bson_encoder_t encoder, const void *p, size_t s)
|
||||||
int ret = BSON_WRITE(encoder->fd, encoder->buf, encoder->bufpos);
|
int ret = BSON_WRITE(encoder->fd, encoder->buf, encoder->bufpos);
|
||||||
|
|
||||||
if (ret == (int)encoder->bufpos) {
|
if (ret == (int)encoder->bufpos) {
|
||||||
|
encoder->total_written_size += ret;
|
||||||
|
|
||||||
// reset buffer to beginning and continue
|
// reset buffer to beginning and continue
|
||||||
encoder->bufpos = 0;
|
encoder->bufpos = 0;
|
||||||
|
|
||||||
|
@ -432,6 +451,8 @@ bson_encoder_init_file(bson_encoder_t encoder, int fd)
|
||||||
encoder->buf = nullptr;
|
encoder->buf = nullptr;
|
||||||
encoder->dead = false;
|
encoder->dead = false;
|
||||||
|
|
||||||
|
encoder->total_written_size = 0;
|
||||||
|
|
||||||
if (write_int32(encoder, 0)) {
|
if (write_int32(encoder, 0)) {
|
||||||
CODER_KILL(encoder, "write error on document length");
|
CODER_KILL(encoder, "write error on document length");
|
||||||
}
|
}
|
||||||
|
@ -449,6 +470,8 @@ bson_encoder_init_buf_file(bson_encoder_t encoder, int fd, void *buf, unsigned b
|
||||||
encoder->dead = false;
|
encoder->dead = false;
|
||||||
encoder->realloc_ok = false;
|
encoder->realloc_ok = false;
|
||||||
|
|
||||||
|
encoder->total_written_size = 0;
|
||||||
|
|
||||||
if (write_int32(encoder, 0)) {
|
if (write_int32(encoder, 0)) {
|
||||||
CODER_KILL(encoder, "write error on document length");
|
CODER_KILL(encoder, "write error on document length");
|
||||||
}
|
}
|
||||||
|
@ -473,6 +496,8 @@ bson_encoder_init_buf(bson_encoder_t encoder, void *buf, unsigned bufsize)
|
||||||
encoder->realloc_ok = false;
|
encoder->realloc_ok = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encoder->total_written_size = 0;
|
||||||
|
|
||||||
if (write_int32(encoder, 0)) {
|
if (write_int32(encoder, 0)) {
|
||||||
CODER_KILL(encoder, "write error on document length");
|
CODER_KILL(encoder, "write error on document length");
|
||||||
}
|
}
|
||||||
|
@ -489,13 +514,30 @@ bson_encoder_fini(bson_encoder_t encoder)
|
||||||
CODER_KILL(encoder, "write error on document terminator");
|
CODER_KILL(encoder, "write error on document terminator");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (encoder->fd > -1 && encoder->buf != nullptr) {
|
if (encoder->fd > -1 && encoder->bufpos > 0) {
|
||||||
/* write final buffer to disk */
|
|
||||||
int ret = BSON_WRITE(encoder->fd, encoder->buf, encoder->bufpos);
|
int ret = BSON_WRITE(encoder->fd, encoder->buf, encoder->bufpos);
|
||||||
|
|
||||||
if (ret != (int)encoder->bufpos) {
|
if (ret == (int)encoder->bufpos) {
|
||||||
|
encoder->total_written_size += ret;
|
||||||
|
|
||||||
|
} else {
|
||||||
CODER_KILL(encoder, "write error");
|
CODER_KILL(encoder, "write error");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// record document size
|
||||||
|
if (encoder->fd > -1) {
|
||||||
|
off_t offset = lseek(encoder->fd, 0, SEEK_SET);
|
||||||
|
|
||||||
|
int32_t total_document_size = encoder->total_written_size;
|
||||||
|
|
||||||
|
debug("writing document size %d to beginning of file (%d)", total_document_size, offset);
|
||||||
|
|
||||||
|
if (BSON_WRITE(encoder->fd, &total_document_size, sizeof(total_document_size)) != sizeof(total_document_size)) {
|
||||||
|
CODER_KILL(encoder, "write error on document length");
|
||||||
|
}
|
||||||
|
|
||||||
|
BSON_FSYNC(encoder->fd);
|
||||||
|
|
||||||
} else if (encoder->buf != nullptr) {
|
} else if (encoder->buf != nullptr) {
|
||||||
/* update buffer length */
|
/* update buffer length */
|
||||||
|
@ -503,11 +545,6 @@ bson_encoder_fini(bson_encoder_t encoder)
|
||||||
memcpy(encoder->buf, &len, sizeof(len));
|
memcpy(encoder->buf, &len, sizeof(len));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sync file */
|
|
||||||
if (encoder->fd > -1) {
|
|
||||||
BSON_FSYNC(encoder->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,26 +586,18 @@ int bson_encoder_append_bool(bson_encoder_t encoder, const char *name, bool valu
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bson_encoder_append_int(bson_encoder_t encoder, const char *name, int64_t value)
|
bson_encoder_append_int32(bson_encoder_t encoder, const char *name, int32_t value)
|
||||||
{
|
{
|
||||||
bool result;
|
bool result;
|
||||||
|
|
||||||
CODER_CHECK(encoder);
|
CODER_CHECK(encoder);
|
||||||
|
|
||||||
/* use the smallest encoding that will hold the value */
|
/* use the smallest encoding that will hold the value */
|
||||||
if (value == (int32_t)value) {
|
|
||||||
debug("encoding %lld as int32", value);
|
debug("encoding %lld as int32", value);
|
||||||
result = write_int8(encoder, BSON_INT32) ||
|
result = write_int8(encoder, BSON_INT32) ||
|
||||||
write_name(encoder, name) ||
|
write_name(encoder, name) ||
|
||||||
write_int32(encoder, value);
|
write_int32(encoder, value);
|
||||||
|
|
||||||
} else {
|
|
||||||
debug("encoding %lld as int64", value);
|
|
||||||
result = write_int8(encoder, BSON_INT64) ||
|
|
||||||
write_name(encoder, name) ||
|
|
||||||
write_int64(encoder, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
CODER_KILL(encoder, "write error on BSON_INT");
|
CODER_KILL(encoder, "write error on BSON_INT");
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,19 +103,22 @@ typedef int (* bson_decoder_callback)(bson_decoder_t decoder, void *priv, bson_n
|
||||||
|
|
||||||
struct bson_decoder_s {
|
struct bson_decoder_s {
|
||||||
/* file reader state */
|
/* file reader state */
|
||||||
int fd;
|
int fd{-1};
|
||||||
|
|
||||||
/* buffer reader state */
|
/* buffer reader state */
|
||||||
uint8_t *buf;
|
uint8_t *buf{nullptr};
|
||||||
size_t bufsize;
|
size_t bufsize{0};
|
||||||
unsigned bufpos;
|
unsigned bufpos{0};
|
||||||
|
size_t total_bytes_imported{0};
|
||||||
|
|
||||||
bool dead;
|
bool dead{false};
|
||||||
bson_decoder_callback callback;
|
bson_decoder_callback callback{nullptr};
|
||||||
void *priv;
|
void *priv{nullptr};
|
||||||
unsigned nesting;
|
unsigned nesting{0};
|
||||||
struct bson_node_s node;
|
struct bson_node_s node;
|
||||||
int32_t pending;
|
int32_t pending{0};
|
||||||
|
|
||||||
|
uint32_t import_scratch{0};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -179,6 +182,8 @@ typedef struct bson_encoder_s {
|
||||||
unsigned bufsize;
|
unsigned bufsize;
|
||||||
unsigned bufpos;
|
unsigned bufpos;
|
||||||
|
|
||||||
|
size_t total_written_size{0};
|
||||||
|
|
||||||
bool realloc_ok;
|
bool realloc_ok;
|
||||||
bool dead;
|
bool dead;
|
||||||
|
|
||||||
|
@ -252,7 +257,7 @@ __EXPORT int bson_encoder_append_bool(bson_encoder_t encoder, const char *name,
|
||||||
* @param name Node name.
|
* @param name Node name.
|
||||||
* @param value Value to be encoded.
|
* @param value Value to be encoded.
|
||||||
*/
|
*/
|
||||||
__EXPORT int bson_encoder_append_int(bson_encoder_t encoder, const char *name, int64_t value);
|
__EXPORT int bson_encoder_append_int32(bson_encoder_t encoder, const char *name, int32_t value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Append a double to the encoded stream
|
* Append a double to the encoded stream
|
||||||
|
|
|
@ -41,10 +41,16 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The path to the Battery Backed up SRAM */
|
||||||
|
#define BBSRAM_PATH "/fs/bbr"
|
||||||
|
|
||||||
#define HARDFAULT_REBOOT_FILENO 0
|
#define HARDFAULT_REBOOT_FILENO 0
|
||||||
#define HARDFAULT_REBOOT_PATH BBSRAM_PATH "" STRINGIFY(HARDFAULT_REBOOT_FILENO)
|
#define HARDFAULT_REBOOT_PATH BBSRAM_PATH "" STRINGIFY(HARDFAULT_REBOOT_FILENO)
|
||||||
|
|
||||||
#define HARDFAULT_ULOG_FILENO 3
|
#define HARDFAULT_ULOG_FILENO 3
|
||||||
#define HARDFAULT_ULOG_PATH BBSRAM_PATH "" STRINGIFY(HARDFAULT_ULOG_FILENO)
|
#define HARDFAULT_ULOG_PATH BBSRAM_PATH "" STRINGIFY(HARDFAULT_ULOG_FILENO)
|
||||||
|
|
||||||
#define HARDFAULT_FILENO 4
|
#define HARDFAULT_FILENO 4
|
||||||
#define HARDFAULT_PATH BBSRAM_PATH "" STRINGIFY(HARDFAULT_FILENO)
|
#define HARDFAULT_PATH BBSRAM_PATH "" STRINGIFY(HARDFAULT_FILENO)
|
||||||
|
|
||||||
|
@ -63,20 +69,18 @@
|
||||||
*/
|
*/
|
||||||
#define BBSRAM_HEADER_SIZE 20 /* This is an assumption */
|
#define BBSRAM_HEADER_SIZE 20 /* This is an assumption */
|
||||||
#define BBSRAM_USED ((5*BBSRAM_HEADER_SIZE)+(BBSRAM_SIZE_FN0+BBSRAM_SIZE_FN1+BBSRAM_SIZE_FN2+BBSRAM_SIZE_FN3))
|
#define BBSRAM_USED ((5*BBSRAM_HEADER_SIZE)+(BBSRAM_SIZE_FN0+BBSRAM_SIZE_FN1+BBSRAM_SIZE_FN2+BBSRAM_SIZE_FN3))
|
||||||
#define BBSRAM_REAMINING (PX4_BBSRAM_SIZE-BBSRAM_USED)
|
#define BBSRAM_REMAINING (PX4_BBSRAM_SIZE-BBSRAM_USED)
|
||||||
#if CONFIG_ARCH_INTERRUPTSTACK <= 3
|
#if CONFIG_ARCH_INTERRUPTSTACK <= 3
|
||||||
# define BBSRAM_NUMBER_STACKS 1
|
# define BBSRAM_NUMBER_STACKS 1
|
||||||
#else
|
#else
|
||||||
# define BBSRAM_NUMBER_STACKS 2
|
# define BBSRAM_NUMBER_STACKS 2
|
||||||
#endif
|
#endif
|
||||||
#define BBSRAM_FIXED_ELEMENTS_SIZE (sizeof(info_s))
|
#define BBSRAM_FIXED_ELEMENTS_SIZE (sizeof(info_s))
|
||||||
#define BBSRAM_LEFTOVER (BBSRAM_REAMINING-BBSRAM_FIXED_ELEMENTS_SIZE)
|
#define BBSRAM_LEFTOVER (BBSRAM_REMAINING-BBSRAM_FIXED_ELEMENTS_SIZE)
|
||||||
|
|
||||||
#define CONFIG_ISTACK_SIZE (BBSRAM_LEFTOVER/BBSRAM_NUMBER_STACKS/sizeof(stack_word_t))
|
#define CONFIG_ISTACK_SIZE (BBSRAM_LEFTOVER/BBSRAM_NUMBER_STACKS/sizeof(stack_word_t))
|
||||||
#define CONFIG_USTACK_SIZE (BBSRAM_LEFTOVER/BBSRAM_NUMBER_STACKS/sizeof(stack_word_t))
|
#define CONFIG_USTACK_SIZE (BBSRAM_LEFTOVER/BBSRAM_NUMBER_STACKS/sizeof(stack_word_t))
|
||||||
|
|
||||||
/* The path to the Battery Backed up SRAM */
|
|
||||||
#define BBSRAM_PATH "/fs/bbr"
|
|
||||||
/* The sizes of the files to create (-1) use rest of BBSRAM memory */
|
/* The sizes of the files to create (-1) use rest of BBSRAM memory */
|
||||||
#define BSRAM_FILE_SIZES { \
|
#define BSRAM_FILE_SIZES { \
|
||||||
BBSRAM_SIZE_FN0, /* For Time stamp only */ \
|
BBSRAM_SIZE_FN0, /* For Time stamp only */ \
|
||||||
|
@ -256,11 +260,9 @@ typedef struct {
|
||||||
fault_regs_s fault_regs; /* NVIC status */
|
fault_regs_s fault_regs; /* NVIC status */
|
||||||
stack_t stacks; /* Stack info */
|
stack_t stacks; /* Stack info */
|
||||||
#if CONFIG_TASK_NAME_SIZE > 0
|
#if CONFIG_TASK_NAME_SIZE > 0
|
||||||
char name[CONFIG_TASK_NAME_SIZE + 1]; /* Task name (with NULL
|
char name[CONFIG_TASK_NAME_SIZE + 1]; /* Task name (with NULL terminator) */
|
||||||
* terminator) */
|
|
||||||
#endif
|
#endif
|
||||||
char filename[MAX_FILE_PATH_LENGTH]; /* the Last of chars in
|
char filename[MAX_FILE_PATH_LENGTH]; /* the Last of chars in __FILE__ to up_assert */
|
||||||
* __FILE__ to up_assert */
|
|
||||||
} info_s;
|
} info_s;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -61,39 +61,8 @@
|
||||||
|
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
__EXPORT int hardfault_log_main(int argc, char *argv[]);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
#define OUT_BUFFER_LEN 200
|
#define OUT_BUFFER_LEN 200
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
static int genfault(int fault);
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Data
|
|
||||||
****************************************************************************/
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
/****************************************************************************
|
|
||||||
* genfault
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static int genfault(int fault)
|
static int genfault(int fault)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -213,7 +182,6 @@ static void identify(const char *caller)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* hardfault_get_desc
|
* hardfault_get_desc
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -469,8 +437,7 @@ static int write_registers_info(int fdout, info_s *pi, char *buffer, int sz)
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_interrupt_stack_info
|
* write_interrupt_stack_info
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_interrupt_stack_info(int fdout, info_s *pi, char *buffer,
|
static int write_interrupt_stack_info(int fdout, info_s *pi, char *buffer, unsigned int sz)
|
||||||
unsigned int sz)
|
|
||||||
{
|
{
|
||||||
int ret = ENOENT;
|
int ret = ENOENT;
|
||||||
|
|
||||||
|
@ -502,8 +469,7 @@ static int write_user_stack_info(int fdout, info_s *pi, char *buffer,
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_dump_info
|
* write_dump_info
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_dump_info(int fdout, info_s *info, struct bbsramd_s *desc,
|
static int write_dump_info(int fdout, info_s *info, struct bbsramd_s *desc, char *buffer, unsigned int sz)
|
||||||
char *buffer, unsigned int sz)
|
|
||||||
{
|
{
|
||||||
char fmtbuff[ TIME_FMT_LEN + 1];
|
char fmtbuff[ TIME_FMT_LEN + 1];
|
||||||
format_fault_time(HEADER_TIME_FMT, &desc->lastwrite, fmtbuff, sizeof(fmtbuff));
|
format_fault_time(HEADER_TIME_FMT, &desc->lastwrite, fmtbuff, sizeof(fmtbuff));
|
||||||
|
@ -528,11 +494,9 @@ static int write_dump_info(int fdout, info_s *info, struct bbsramd_s *desc,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TASK_NAME_SIZE
|
#ifdef CONFIG_TASK_NAME_SIZE
|
||||||
n = snprintf(buffer, sz, " in file:%s at line: %d running task: %s\n",
|
n = snprintf(buffer, sz, " in file:%s at line: %d running task: %s\n", info->filename, info->lineno, info->name);
|
||||||
info->filename, info->lineno, info->name);
|
|
||||||
#else
|
#else
|
||||||
n = snprintf(buffer, sz, " in file:%s at line: %d \n",
|
n = snprintf(buffer, sz, " in file:%s at line: %d \n", info->filename, info->lineno);
|
||||||
info->filename, info->lineno);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (n != write(fdout, buffer, n)) {
|
if (n != write(fdout, buffer, n)) {
|
||||||
|
@ -563,8 +527,7 @@ static int write_dump_info(int fdout, info_s *info, struct bbsramd_s *desc,
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_dump_time
|
* write_dump_time
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_dump_time(char *caller, char *tag, int fdout,
|
static int write_dump_time(char *caller, char *tag, int fdout, struct timespec *ts, char *buffer, unsigned int sz)
|
||||||
struct timespec *ts, char *buffer, unsigned int sz)
|
|
||||||
{
|
{
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
char fmtbuff[ TIME_FMT_LEN + 1];
|
char fmtbuff[ TIME_FMT_LEN + 1];
|
||||||
|
@ -577,27 +540,27 @@ static int write_dump_time(char *caller, char *tag, int fdout,
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_dump_footer
|
* write_dump_footer
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_dump_header(char *caller, int fdout, struct timespec *ts,
|
static int write_dump_header(char *caller, int fdout, struct timespec *ts, char *buffer, unsigned int sz)
|
||||||
char *buffer, unsigned int sz)
|
|
||||||
{
|
{
|
||||||
return write_dump_time(caller, "Begin", fdout, ts, buffer, sz);
|
return write_dump_time(caller, "Begin", fdout, ts, buffer, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_dump_footer
|
* write_dump_footer
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_dump_footer(char *caller, int fdout, struct timespec *ts,
|
static int write_dump_footer(char *caller, int fdout, struct timespec *ts, char *buffer, unsigned int sz)
|
||||||
char *buffer, unsigned int sz)
|
|
||||||
{
|
{
|
||||||
return write_dump_time(caller, "END", fdout, ts, buffer, sz);
|
return write_dump_time(caller, "END", fdout, ts, buffer, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_intterupt_satck
|
* write_intterupt_satck
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_intterupt_stack(int fdin, int fdout, info_s *pi, char *buffer,
|
static int write_intterupt_stack(int fdin, int fdout, info_s *pi, char *buffer, unsigned int sz)
|
||||||
unsigned int sz)
|
|
||||||
{
|
{
|
||||||
int ret = ENOENT;
|
int ret = ENOENT;
|
||||||
|
|
||||||
|
@ -615,12 +578,10 @@ static int write_intterupt_stack(int fdin, int fdout, info_s *pi, char *buffer,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* write_user_stack
|
* write_user_stack
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int write_user_stack(int fdin, int fdout, info_s *pi, char *buffer,
|
static int write_user_stack(int fdin, int fdout, info_s *pi, char *buffer, unsigned int sz)
|
||||||
unsigned int sz)
|
|
||||||
{
|
{
|
||||||
int ret = ENOENT;
|
int ret = ENOENT;
|
||||||
|
|
||||||
|
@ -646,7 +607,6 @@ static int write_user_stack(int fdin, int fdout, info_s *pi, char *buffer,
|
||||||
*/
|
*/
|
||||||
static int hardfault_append_to_ulog(const char *caller, int fdin)
|
static int hardfault_append_to_ulog(const char *caller, int fdin)
|
||||||
{
|
{
|
||||||
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int write_size_remaining = lseek(fdin, 0, SEEK_END);
|
int write_size_remaining = lseek(fdin, 0, SEEK_END);
|
||||||
|
|
||||||
|
@ -769,7 +729,6 @@ static int hardfault_append_to_ulog(const char *caller, int fdin)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// now append the data
|
// now append the data
|
||||||
lseek(ulog_fd, 0, SEEK_END);
|
lseek(ulog_fd, 0, SEEK_END);
|
||||||
|
|
||||||
|
@ -835,7 +794,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* commit
|
* commit
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -848,7 +806,6 @@ static int hardfault_commit(char *caller)
|
||||||
ret = hardfault_get_desc(caller, &desc, false);
|
ret = hardfault_get_desc(caller, &desc, false);
|
||||||
|
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
|
|
||||||
int fd = ret;
|
int fd = ret;
|
||||||
state = (desc.lastwrite.tv_sec || desc.lastwrite.tv_nsec) ? OK : 1;
|
state = (desc.lastwrite.tv_sec || desc.lastwrite.tv_nsec) ? OK : 1;
|
||||||
int rv = close(fd);
|
int rv = close(fd);
|
||||||
|
@ -858,7 +815,6 @@ static int hardfault_commit(char *caller)
|
||||||
syslog(LOG_INFO, "Failed to Close Fault Log (%d)\n", rv);
|
syslog(LOG_INFO, "Failed to Close Fault Log (%d)\n", rv);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (state != OK) {
|
if (state != OK) {
|
||||||
identify(caller);
|
identify(caller);
|
||||||
syslog(LOG_INFO, "Nothing to save\n", path);
|
syslog(LOG_INFO, "Nothing to save\n", path);
|
||||||
|
@ -910,12 +866,10 @@ static int hardfault_commit(char *caller)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* hardfault_dowrite
|
* hardfault_dowrite
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static int hardfault_dowrite(char *caller, int infd, int outfd,
|
static int hardfault_dowrite(char *caller, int infd, int outfd, struct bbsramd_s *desc, int format)
|
||||||
struct bbsramd_s *desc, int format)
|
|
||||||
{
|
{
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
char *line = zalloc(OUT_BUFFER_LEN);
|
char *line = zalloc(OUT_BUFFER_LEN);
|
||||||
|
@ -1009,10 +963,6 @@ static int hardfault_dowrite(char *caller, int infd, int outfd,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* hardfault_rearm
|
* hardfault_rearm
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -1101,7 +1051,6 @@ __EXPORT int hardfault_increment_reboot(char *caller, bool reset)
|
||||||
syslog(LOG_INFO, "Failed to open Fault reboot count file [%s] (%d)\n", HARDFAULT_REBOOT_PATH, ret);
|
syslog(LOG_INFO, "Failed to open Fault reboot count file [%s] (%d)\n", HARDFAULT_REBOOT_PATH, ret);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
ret = OK;
|
ret = OK;
|
||||||
|
|
||||||
if (!reset) {
|
if (!reset) {
|
||||||
|
@ -1133,10 +1082,10 @@ __EXPORT int hardfault_increment_reboot(char *caller, bool reset)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* hardfault_write
|
* hardfault_write
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
__EXPORT int hardfault_write(char *caller, int fd, int format, bool rearm)
|
__EXPORT int hardfault_write(char *caller, int fd, int format, bool rearm)
|
||||||
{
|
{
|
||||||
struct bbsramd_s desc;
|
struct bbsramd_s desc;
|
||||||
|
@ -1224,15 +1173,12 @@ __EXPORT int hardfault_log_main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(argv[1], "check")) {
|
if (!strcmp(argv[1], "check")) {
|
||||||
|
|
||||||
return hardfault_check_status(self);
|
return hardfault_check_status(self);
|
||||||
|
|
||||||
} else if (!strcmp(argv[1], "rearm")) {
|
} else if (!strcmp(argv[1], "rearm")) {
|
||||||
|
|
||||||
return hardfault_rearm(self);
|
return hardfault_rearm(self);
|
||||||
|
|
||||||
} else if (!strcmp(argv[1], "fault")) {
|
} else if (!strcmp(argv[1], "fault")) {
|
||||||
|
|
||||||
int fault = 0;
|
int fault = 0;
|
||||||
|
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
|
@ -1242,17 +1188,13 @@ __EXPORT int hardfault_log_main(int argc, char *argv[])
|
||||||
return genfault(fault);
|
return genfault(fault);
|
||||||
|
|
||||||
} else if (!strcmp(argv[1], "commit")) {
|
} else if (!strcmp(argv[1], "commit")) {
|
||||||
|
|
||||||
return hardfault_commit(self);
|
return hardfault_commit(self);
|
||||||
|
|
||||||
} else if (!strcmp(argv[1], "count")) {
|
} else if (!strcmp(argv[1], "count")) {
|
||||||
|
|
||||||
return hardfault_increment_reboot(self, false);
|
return hardfault_increment_reboot(self, false);
|
||||||
|
|
||||||
} else if (!strcmp(argv[1], "reset")) {
|
} else if (!strcmp(argv[1], "reset")) {
|
||||||
|
|
||||||
return hardfault_increment_reboot(self, true);
|
return hardfault_increment_reboot(self, true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print_usage();
|
print_usage();
|
||||||
|
|
|
@ -66,15 +66,15 @@ encode(bson_encoder_t encoder)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bson_encoder_append_int(encoder, "int1", sample_small_int) != 0) {
|
if (bson_encoder_append_int32(encoder, "int1", sample_small_int) != 0) {
|
||||||
PX4_ERR("FAIL: encoder: append int failed");
|
PX4_ERR("FAIL: encoder: append int failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bson_encoder_append_int(encoder, "int2", sample_big_int) != 0) {
|
// if (bson_encoder_append_int64(encoder, "int2", sample_big_int) != 0) {
|
||||||
PX4_ERR("FAIL: encoder: append int failed");
|
// PX4_ERR("FAIL: encoder: append int failed");
|
||||||
return 1;
|
// return 1;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (bson_encoder_append_double(encoder, "double1", sample_double) != 0) {
|
if (bson_encoder_append_double(encoder, "double1", sample_double) != 0) {
|
||||||
PX4_ERR("FAIL: encoder: append double failed");
|
PX4_ERR("FAIL: encoder: append double failed");
|
||||||
|
|
Loading…
Reference in New Issue