bool MixerTest::load_mixer(const char *filename, const char *buf, unsigned loaded, unsigned expected_count, const unsigned chunk_size, bool verbose) { /* load the mixer in chunks, like * in the case of a remote load, * e.g. on PX4IO. */ /* load at once test */ unsigned xx = loaded; mixer_group.reset(); mixer_group.load_from_buf(&buf[0], xx); if (expected_count > 0) { ut_compare("check number of mixers loaded", mixer_group.count(), expected_count); } unsigned empty_load = 2; char empty_buf[2]; empty_buf[0] = ' '; empty_buf[1] = '\0'; mixer_group.reset(); mixer_group.load_from_buf(&empty_buf[0], empty_load); if (verbose) { PX4_INFO("empty buffer load: loaded %u mixers, used: %u", mixer_group.count(), empty_load); } ut_compare("empty buffer load", empty_load, 0); /* reset, load in chunks */ mixer_group.reset(); char mixer_text[PX4IO_MAX_MIXER_LENGHT]; /* large enough for one mixer */ unsigned mixer_text_length = 0; unsigned transmitted = 0; unsigned resid = 0; while (transmitted < loaded) { unsigned text_length = (loaded - transmitted > chunk_size) ? chunk_size : loaded - transmitted; /* check for overflow - this would be really fatal */ if ((mixer_text_length + text_length + 1) > sizeof(mixer_text)) { PX4_ERR("Mixer text length overflow for file: %s. Is PX4IO_MAX_MIXER_LENGHT too small? (curr len: %d)", filename, PX4IO_MAX_MIXER_LENGHT); return false; } /* append mixer text and nul-terminate */ memcpy(&mixer_text[mixer_text_length], &buf[transmitted], text_length); mixer_text_length += text_length; mixer_text[mixer_text_length] = '\0'; //fprintf(stderr, "buflen %u, text:\n\"%s\"\n", mixer_text_length, &mixer_text[0]); /* process the text buffer, adding new mixers as their descriptions can be parsed */ resid = mixer_text_length; mixer_group.load_from_buf(&mixer_text[0], resid); /* if anything was parsed */ if (resid != mixer_text_length) { //PX4_INFO("loaded %d mixers, used %u\n", mixer_group.count(), mixer_text_length - resid); /* copy any leftover text to the base of the buffer for re-use */ if (resid > 0) { memmove(&mixer_text[0], &mixer_text[mixer_text_length - resid], resid); /* enforce null termination */ mixer_text[resid] = '\0'; } mixer_text_length = resid; } transmitted += text_length; if (verbose) { PX4_INFO("transmitted: %d, loaded: %d", transmitted, loaded); } } if (verbose) { PX4_INFO("chunked load: loaded %u mixers", mixer_group.count()); } if (expected_count > 0 && mixer_group.count() != expected_count) { PX4_ERR("Load of mixer failed, last chunk: %s, transmitted: %u, text length: %u, resid: %u", mixer_text, transmitted, mixer_text_length, resid); ut_compare("check number of mixers loaded (chunk)", mixer_group.count(), expected_count); } return true; }