Lua Telemetry scripts
Posted: Tue Jul 01, 2014 4:13 pm
One very simple example that will work in next release (2.0.6)
Custom Firmwares Hacks and General RC Electronic Projects
https://openrcforums.com/forum/
Code: Select all
static void luaGetValueAndPush(int src)
{
/*
Hint about dividers are taken from putsTelemetryChannel()
*/
if (!TELEMETRY_STREAMING() && src>=MIXSRC_FIRST_TELEM && src<=MIXSRC_LAST_TELEM) {
//telemetry not working, return zero for telemetry sources
lua_pushinteger(L, (int)0);
return;
}
switch (src) {
case MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE:
case MIXSRC_FIRST_TELEM-1+TELEM_VFAS:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_VFAS:
case MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_CELLS_SUM:
case MIXSRC_FIRST_TELEM-1+TELEM_CURRENT:
case MIXSRC_FIRST_TELEM-1+TELEM_MAX_CURRENT:
case MIXSRC_FIRST_TELEM-1+TELEM_VSPEED:
//theese need to be divided by 10
lua_pushnumber(L, getValue(src)/10.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_A1:
case MIXSRC_FIRST_TELEM-1+TELEM_A2:
//convert raw A1/2 values to calibrated values
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_A1), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2:
//convert raw A1/2 values to calibrated values
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_CELL:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_CELL:
case MIXSRC_FIRST_TELEM-1+TELEM_ALT:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCx:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCy:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCz:
//theese need to be divided by 100
lua_pushnumber(L, getValue(src)/100.0);
break;
//TODO: add other values that need special treatment
default:
lua_pushinteger(L, getValue(src));
}
}
struct LuaField {
const char * name;
const uint8_t id;
const uint8_t attr;
};
const LuaField luaFields[] = {
{ "altitude-max", MIXSRC_FIRST_TELEM+TELEM_MAX_ALT-1, 0 },
{ "altitude", MIXSRC_FIRST_TELEM+TELEM_ALT-1, PREC2 },
{ "vario", MIXSRC_FIRST_TELEM+TELEM_VSPEED-1, PREC2 },
{ "tx-voltage", MIXSRC_FIRST_TELEM+TELEM_TX_VOLTAGE-1, PREC1 },
{ "rpm", MIXSRC_FIRST_TELEM+TELEM_RPM-1, 0 },
{ NULL, 0, 0 },
};
Code: Select all
case MIXSRC_FIRST_TELEM-1+TELEM_A1:
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_A1), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_A2:
//convert raw A1/2 values to calibrated values
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_A2), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1:
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1), getValue(src))/100.0);
break ;
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2:
//convert raw A1/2 values to calibrated values
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2), getValue(src))/100.0);
break;
Code: Select all
const LuaField luaFields[] = {
{ "altitude-max", MIXSRC_FIRST_TELEM+TELEM_MAX_ALT-1, 0 },
{ "altitude", MIXSRC_FIRST_TELEM+TELEM_ALT-1, PREC2 },
{ "vario", MIXSRC_FIRST_TELEM+TELEM_VSPEED-1, PREC2 },
{ "tx-voltage", MIXSRC_FIRST_TELEM+TELEM_TX_VOLTAGE-1, PREC1 },
{ "rpm", MIXSRC_FIRST_TELEM+TELEM_RPM-1, 0 },
{ "vfas", MIXSRC_FIRST_TELEM+TELEM_VFAS-1, 0 },
{ "vfas-min", MIXSRC_FIRST_TELEM+TELEM_MIN_VFAS-1, 0 },
{ "cells", MIXSRC_FIRST_TELEM+TELEM_CELLS_SUM-1, 0 },
{ "cell-min", MIXSRC_FIRST_TELEM+TELEM_MIN_CELLS-1, 0 },
{ "current", MIXSRC_FIRST_TELEM+TELEM_CURRENT-1, 0 },
{ "current-max", MIXSRC_FIRST_TELEM+TELEM_MAX_CURRENT-1, 0 },
{ "A1", MIXSRC_FIRST_TELEM+TELEM_TELEM_A1-1, 0 },
{ "A1-min", MIXSRC_FIRST_TELEM+TELEM_TELEM_A1_MIN-1, 0 },
{ "A2", MIXSRC_FIRST_TELEM+TELEM_TELEM_A2-1, 0 },
{ "A2-min", MIXSRC_FIRST_TELEM+TELEM_TELEM_A2_MIN-1, 0 },
{ "cell", MIXSRC_FIRST_TELEM+TELEM_TELEM_CELL-1, 0 },
{ "cell-min", MIXSRC_FIRST_TELEM+TELEM_TELEM_MIN_CELL-1, 0 },
{ "accx", MIXSRC_FIRST_TELEM+TELEM_TELEM_ACCx-1, 0 },
{ "accy", MIXSRC_FIRST_TELEM+TELEM_TELEM_ACCy-1, 0 },
{ "accz", MIXSRC_FIRST_TELEM+TELEM_TELEM_ACCz-1, 0 },
{ NULL, 0, 0 },
};
Code: Select all
static void luaGetValueAndPush(int src)
{
/*
Hint about dividers are taken from putsTelemetryChannel()
*/
if (!TELEMETRY_STREAMING() && src>=MIXSRC_FIRST_TELEM && src<=MIXSRC_LAST_TELEM) {
//telemetry not working, return zero for telemetry sources
lua_pushinteger(L, (int)0);
return;
}
switch (src) {
case MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE:
case MIXSRC_FIRST_TELEM-1+TELEM_VFAS:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_VFAS:
case MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_CELLS_SUM:
case MIXSRC_FIRST_TELEM-1+TELEM_CURRENT:
case MIXSRC_FIRST_TELEM-1+TELEM_MAX_CURRENT:
case MIXSRC_FIRST_TELEM-1+TELEM_VSPEED:
//theese need to be divided by 10
lua_pushnumber(L, getValue(src)/10.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_A1:
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_A1), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_A2:
//convert raw A1/2 values to calibrated values
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_A2), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1:
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1), getValue(src))/100.0);
break ;
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2:
//convert raw A1/2 values to calibrated values
lua_pushnumber(L, applyChannelRatio(src-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2), getValue(src))/100.0);
break;
case MIXSRC_FIRST_TELEM-1+TELEM_CELL:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_CELL:
case MIXSRC_FIRST_TELEM-1+TELEM_ALT:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCx:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCy:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCz:
//theese need to be divided by 100
lua_pushnumber(L, getValue(src)/100.0);
break;
//TODO: add other values that need special treatment
default:
lua_pushinteger(L, getValue(src));
}
}
Code: Select all
const LuaField luaFields[] = {
{ "altitude-max", MIXSRC_FIRST_TELEM+TELEM_MAX_ALT-1, 0 },
{ "altitude", MIXSRC_FIRST_TELEM+TELEM_ALT-1, PREC2 },
{ "vario", MIXSRC_FIRST_TELEM+TELEM_VSPEED-1, PREC2 },
{ "tx-voltage", MIXSRC_FIRST_TELEM+TELEM_TX_VOLTAGE-1, PREC1 },
{ "rpm", MIXSRC_FIRST_TELEM+TELEM_RPM-1, 0 },
{ "vfas", MIXSRC_FIRST_TELEM+TELEM_VFAS-1, 0 },
{ "vfas-min", MIXSRC_FIRST_TELEM+TELEM_MIN_VFAS-1, 0 },
{ "cells", MIXSRC_FIRST_TELEM+TELEM_CELLS_SUM-1, 0 },
{ "cell-min", MIXSRC_FIRST_TELEM+TELEM_MIN_CELL-1, 0 },
{ "cell", MIXSRC_FIRST_TELEM+TELEM_CELL-1, 0 },
{ "current", MIXSRC_FIRST_TELEM+TELEM_CURRENT-1, 0 },
{ "current-max", MIXSRC_FIRST_TELEM+TELEM_MAX_CURRENT-1, 0 },
{ "A1", MIXSRC_FIRST_TELEM+TELEM_A1-1, 0 },
{ "A1-min", MIXSRC_FIRST_TELEM+TELEM_MIN_A1-1, 0 },
{ "A2", MIXSRC_FIRST_TELEM+TELEM_A2-1, 0 },
{ "A2-min", MIXSRC_FIRST_TELEM+TELEM_MIN_A2-1, 0 },
{ "accx", MIXSRC_FIRST_TELEM+TELEM_ACCx-1, 0 },
{ "accy", MIXSRC_FIRST_TELEM+TELEM_ACCy-1, 0 },
{ "accz", MIXSRC_FIRST_TELEM+TELEM_ACCz-1, 0 },
{ NULL, 0, 0 },
};
Code: Select all
-- This helps me move the individual elements around the screen without having to recalculate all the coodinates!
local timer_xoffset = 5
local timer_yoffset = 4
local tx_x = 5
local tx_y = 48
local function run(event)
local timer = model.getTimer(0)
lcd.drawTimer(timer_xoffset,timer_yoffset,timer.value,XXLSIZE)
lcd.drawRectangle(timer_xoffset - 2,timer_yoffset - 2,111,42)
lcd.drawChannel(tx_x, tx_y, "tx-voltage", LEFT+MIDSIZE)
local txt_x = lcd.getLastPos()
local settings = getGeneralSettings()
local percent = (getValue("tx-voltage")-settings.battMin) * 100 / (settings.battMax-settings.battMin)
lcd.drawNumber(txt_x+5, tx_y, percent, LEFT+MIDSIZE)
lcd.drawText(lcd.getLastPos(), tx_y, "%", MIDSIZE)
lcd.drawGauge(txt_x, tx_y - 2, 89, 16, percent, 100)
if getValue(MIXSRC_SA)<0 then
lcd.drawText(120,4,"Attitude",SMLSIZE)
elseif getValue(MIXSRC_SA) == 0 then
lcd.drawText(120,4,"Part Rate",SMLSIZE)
else
lcd.drawText(120,4,"Full Rate",SMLSIZE)
end
end
return { run=run }
Currently only available on Linux platforms, if you run Companion or stand-alone simulator from a command line window (terminal) you get output from Lua print() statements in terminal. The software also has to be build with the DEBUG=YES option. We are working on something to provide this output on all systems https://github.com/opentx/opentx/issues/1489paulj wrote:I notice as welll in the tracker #1480, there are some test scripts to get the list of constants. Are these run in the simulator, and if so, where does the output go?
As I am running Linux, and compile everything from source, this is fine for me! Thankyou very much.dinamich wrote:Currently only available on Linux platforms, if you run Companion or stand-alone simulator from a command line window (terminal) you get output from Lua print() statements in terminal. The software also has to be build with the DEBUG=YES option.paulj wrote:I notice as welll in the tracker #1480, there are some test scripts to get the list of constants. Are these run in the simulator, and if so, where does the output go?