diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 0a0a6a7b2..84780e552 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -198,12 +198,14 @@ void TelemetryAnalog::on_CalibSB_editingFinished() } if (alarm2value(ratio+calib)) { + } + else if (alarm2value>(ratio+calib)) { alarm2value=ratio+calib; } analog.alarms[0].value=round(((alarm1value-calib)*255)/ratio); analog.alarms[1].value=round(((alarm2value-calib)*255)/ratio); - } else { + } + else { analog.offset=0; analog.alarms[0].value=0; analog.alarms[1].value=0; diff --git a/radio/src/lua.cpp b/radio/src/lua.cpp index ff84ee595..25d3b8512 100644 --- a/radio/src/lua.cpp +++ b/radio/src/lua.cpp @@ -1051,6 +1051,120 @@ static int luaModelSetGlobalVariable(lua_State *L) return 0; } +static int luaModelGetTelemetryChannel(lua_State *L) +{ + int idx = luaL_checkunsigned(L, 1); + if (idx < MAX_FRSKY_A_CHANNELS) { + FrSkyChannelData & channel = g_model.frsky.channels[idx]; + lua_newtable(L); + double range = applyChannelRatio(idx, 255-channel.offset); + double offset = applyChannelRatio(idx, 0); + double alarm1 = applyChannelRatio(idx, channel.alarms_value[0]); + double alarm2 = applyChannelRatio(idx, channel.alarms_value[1]); + if (ANA_CHANNEL_UNIT(idx) >= UNIT_RAW) { + range /= 10; + offset /= 10; + alarm1 /= 10; + alarm2 /= 10; + } + else { + range /= 100; + offset /= 100; + alarm1 /= 100; + alarm2 /= 100; + } + lua_pushtablenumber(L, "range", range); + lua_pushtablenumber(L, "offset", offset); + lua_pushtablenumber(L, "alarm1", alarm1); + lua_pushtablenumber(L, "alarm2", alarm2); + lua_pushtableinteger(L, "unit", channel.type); + } + else { + lua_pushnil(L); + } + return 1; +} + +int findmult(float value, float base) +{ + int vvalue = value*10; + int vbase = base*10; + vvalue--; + + int mult = 0; + for (int i=8; i>=0; i--) { + if (vvalue/vbase >= (1<= UNIT_RAW) { + range /= 10; + offset /= 10; + alarm1 /= 10; + alarm2 /= 10; + } + else { + range /= 100; + offset /= 100; + alarm1 /= 100; + alarm2 /= 100; + } + luaL_checktype(L, -1, LUA_TTABLE); + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + luaL_checktype(L, -2, LUA_TSTRING); // key is string + const char * key = luaL_checkstring(L, -2); + if (!strcmp(key, "unit")) { + channel.type = luaL_checkinteger(L, -1); + } + else if (!strcmp(key, "range")) { + range = luaL_checknumber(L, -1); + double value = range; + if (ANA_CHANNEL_UNIT(idx) < UNIT_RAW) { + value *= 10; + } + channel.multiplier = findmult(value, 255); + channel.ratio = (int)(round(value)) / (1< 0) { + channel.offset = round((offset * 255) / range); + channel.alarms_value[0] = limit(0, round((alarm1-offset)*255/range), 255); + channel.alarms_value[1] = limit(0, round((alarm2-offset)*255/range), 255); + } + else { + channel.offset = 0;; + channel.alarms_value[0] = 0; + channel.alarms_value[1] = 0; + } + eeDirty(EE_MODEL); + } + return 0; +} + static int luaPopupInput(lua_State *L) { uint8_t event = luaL_checkinteger(L, 2); @@ -1190,6 +1304,8 @@ static const luaL_Reg modelLib[] = { { "setOutput", luaModelSetOutput }, { "getGlobalVariable", luaModelGetGlobalVariable }, { "setGlobalVariable", luaModelSetGlobalVariable }, + { "getTelemetryChannel", luaModelGetTelemetryChannel }, + { "setTelemetryChannel", luaModelSetTelemetryChannel }, { NULL, NULL } /* sentinel */ }; diff --git a/radio/src/tests/lua.cpp b/radio/src/tests/lua.cpp index 77113e8ec..ab2b0ff9a 100755 --- a/radio/src/tests/lua.cpp +++ b/radio/src/tests/lua.cpp @@ -60,4 +60,19 @@ TEST(Lua, testSetModelId) EXPECT_EQ(g_model.header.modelId, 2); } +TEST(Lua, testSetTelemetryChannel) +{ + luaExecStr("channel = model.getTelemetryChannel(0)"); + luaExecStr("channel.range = 100.0"); + luaExecStr("channel.offset = -10.0"); + luaExecStr("channel.alarm1 = 60"); + luaExecStr("channel.alarm2 = 50"); + luaExecStr("model.setTelemetryChannel(0, channel)"); + EXPECT_EQ(g_model.frsky.channels[0].multiplier, 2); + EXPECT_EQ(g_model.frsky.channels[0].ratio, 250); + EXPECT_EQ(g_model.frsky.channels[0].offset, -26); + EXPECT_EQ(g_model.frsky.channels[0].alarms_value[0], 179); + EXPECT_EQ(g_model.frsky.channels[0].alarms_value[1], 153); +} + #endif