public float GetParam(byte sysid, byte compid, string name = "", short index = -1, bool requireresponce = true)
{
if (name == "" && index == -1)
return 0;
log.Info("GetParam name: '" + name + "' or index: " + index + " " + sysid + ":" + compid);
MAVLinkMessage buffer;
mavlink_param_request_read_t req = new mavlink_param_request_read_t();
req.target_system = sysid;
req.target_component = compid;
req.param_index = index;
req.param_id = new byte[] {0x0};
if (index == -1)
{
req.param_id = System.Text.ASCIIEncoding.ASCII.GetBytes(name);
}
Array.Resize(ref req.param_id, 16);
generatePacket((byte) MAVLINK_MSG_ID.PARAM_REQUEST_READ, req, sysid, compid);
if (!requireresponce)
{
return 0f;
}
giveComport = true;
DateTime start = DateTime.Now;
int retrys = 3;
while (true)
{
if (!(start.AddMilliseconds(700) > DateTime.Now))
{
if (retrys > 0)
{
log.Info("GetParam Retry " + retrys);
generatePacket((byte) MAVLINK_MSG_ID.PARAM_REQUEST_READ, req, sysid, compid);
start = DateTime.Now;
retrys--;
continue;
}
giveComport = false;
throw new TimeoutException("Timeout on read - GetParam");
}
buffer = readPacket();
if (buffer.Length > 5)
{
if (buffer.msgid == (byte)MAVLINK_MSG_ID.PARAM_VALUE && buffer.sysid == req.target_system && buffer.compid == req.target_component)
{
giveComport = false;
mavlink_param_value_t par = buffer.ToStructure<mavlink_param_value_t>();
string st = System.Text.ASCIIEncoding.ASCII.GetString(par.param_id);
int pos = st.IndexOf('\0');
if (pos != -1)
{
st = st.Substring(0, pos);
}
// not the correct id
if (!(par.param_index == index || st == name))
{
log.ErrorFormat("Wrong Answer {0} - {1} - {2} --- '{3}' vs '{4}'", par.param_index,
ASCIIEncoding.ASCII.GetString(par.param_id), par.param_value,
ASCIIEncoding.ASCII.GetString(req.param_id).TrimEnd(), st);
continue;
}
// update table
if (MAVlist[sysid,compid].apname == MAV_AUTOPILOT.ARDUPILOTMEGA)
{
var offset = Marshal.OffsetOf(typeof(mavlink_param_value_t), "param_value");
MAVlist[sysid, compid].param[st] = new MAVLinkParam(st, BitConverter.GetBytes(Marshal.ReadInt32(par, offset.ToInt32())), MAV_PARAM_TYPE.REAL32, (MAV_PARAM_TYPE) par.param_type);
}
else
{
var offset = Marshal.OffsetOf(typeof(mavlink_param_value_t), "param_value");
MAVlist[sysid, compid].param[st] = new MAVLinkParam(st, BitConverter.GetBytes(Marshal.ReadInt32(par, offset.ToInt32())), (MAV_PARAM_TYPE)par.param_type, (MAV_PARAM_TYPE)par.param_type);
}
MAVlist[sysid, compid].param_types[st] = (MAV_PARAM_TYPE) par.param_type;
log.Info(DateTime.Now.Millisecond + " got param " + (par.param_index) + " of " +
(par.param_count) + " name: " + st);
return par.param_value;
}
}
}
}