From 1c54a30f0129c135534abe7c815efed9f30fca06 Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 22 May 2014 16:48:15 +0200 Subject: [PATCH] Taranis Wizard: Ailerons configuration page added --- radio/wizard/ailerons-0.bmp | Bin 0 -> 2506 bytes radio/wizard/ailerons-1.bmp | Bin 0 -> 2554 bytes radio/wizard/ailerons-2.bmp | Bin 0 -> 2506 bytes radio/wizard/wizard.lua | 190 +++++++++++++++++++++++++++--------- 4 files changed, 143 insertions(+), 47 deletions(-) create mode 100755 radio/wizard/ailerons-0.bmp create mode 100755 radio/wizard/ailerons-1.bmp create mode 100755 radio/wizard/ailerons-2.bmp diff --git a/radio/wizard/ailerons-0.bmp b/radio/wizard/ailerons-0.bmp new file mode 100755 index 0000000000000000000000000000000000000000..7999159c692ac608547b4f842054dd7d0768cd74 GIT binary patch literal 2506 zcmb`J&5qMB5XT*XkQOd$y6N_`Qp1NT^#Ysayoe(=*{x`m7p13W38d&hO zCtXIV$-@-?GYe7%F)hi&19mO>9Jh&Y#k-1T%#yO*|9A+ zKk2@x33#thAF!Zi7fug+0~am}JkLX4=Y=Cl+AxAY2XBZkM2{Sr_z`%|5MRV*-b1DL zE%*-jV+;PCe|qX$@cx)V-Zek1W&Qq`b9VOk{0Zay;;986MuJ=Nv(OwrYkZZn(g_#i#jlglRdO{OI|L zXBUYwE~kZ0!5hOj`S-};-N)!Uc{=Y`=iTmCY40E4zXED2EdDic{#xzo)~lMIRMACu yR_cQ-46Vvbs;Ls@7k`Yu3Du20Z1jp!i?83M$#bn%pDn!XSFz2gjo$z@h5QBtAt;Fe literal 0 HcmV?d00001 diff --git a/radio/wizard/ailerons-1.bmp b/radio/wizard/ailerons-1.bmp new file mode 100755 index 0000000000000000000000000000000000000000..171d52cf1ab1c23544ed8017000e76235d83efba GIT binary patch literal 2554 zcmchZJ#P~+7{`4AfeK4anpC$`N_bIG7upmM154DF2`N|Pn-CI0^+}xwh+ZnOqPwl~ z=ueQZz|2(f1^5umC=yHg`|a-RTo74!6hHUa&(D89aeP)rFMqEQZQtQPqrE}fMT^LF zctRc_-??qtI{K;+a^*g{GkS6S@#5RB?d0oLck9c~XgC~pIOh-0Zb&KDp5OX$ZTt1b zo}Ox*QE!f5%_t%}J3C}N9+T74Q*wTOPG++ixxBn2^ZA@yU18lNhILjkvI-3LfAeu@ zLA^meB1p?{AmHPQcaeMAgwNM%BB4~H^^l(7^F~a7>@vno&v*^PdA!vUED^vh?=Rr- zRtm6^x4iTgX!1@;!{8HBgd5hqChvp--dmu-S32Mms+`gHegp7=Y7?;y6xyd$O)@5_ z&7c4x#k!H9RLYyVGVp^wz0VTedk;ZdX%vIExNP#tU@+(|@-mX7s#-wA=^uly^(9ue z786jlIer9wQ0dosDcbn~Ziaq4ukRJT4~U$82mGGnaX;w1x&R`wsW-uMU3PbPa4@vI zmzuQm!$Ssp>!G@{l;@ls{X4(UI6rx^0-t6%Uy(mc+x3fuZ`Eb{X;z%^MShC!J1xTr znlJN3zAPq0k(PbNHR({GSzED{fc}yh5XbG#6IGHTVpEh|5P<200HN(tN!)1Z< z|CpcU`2;Il(}X(l`hCRl*wiD&O&H^c2)!{d>YTdwSLh?<_>^b))bTnK+e7Vm)72@w zx}0azvamf%nupJuF##UCR>U5;oR>ZDWjSfVtNOiM59P1I3sp`Ydm6UWR=<=zY*cGG z?e$0jzEysae}`SXvkTWz+j%dnDX6Evf&UhGw^H*jgY#GVSFLCHywJ39M>c*~!-#xd pQb$>spZrz7lImq2s@MwxeU}r{XD;-gOL*D$v8uO>uYe#Re*kZ=iGctB literal 0 HcmV?d00001 diff --git a/radio/wizard/ailerons-2.bmp b/radio/wizard/ailerons-2.bmp new file mode 100755 index 0000000000000000000000000000000000000000..34a1e929b6eb1e174eba4e695f8f7f0e9b429778 GIT binary patch literal 2506 zcmb7`J#P~+7{`4AfeK4ada1lrN_bIG7ibEIfu(B8gw!i?CWM4geNra^B9}^C(cM;= z&7YuOftji57vMuMqmJe8$G%JLTo8E_`yM~f&wsz1eaiNmizP;Of%*jHJ<1c5gxy39 zL%ws@m1Q(-VeG2@QDgh{!I#sYf7Y`fYw6mz-^pMw=qRNgq1-aYEWNt(>&E)K(@pB? zE3bY%#F8Xo8yg#Je}A7H9UZab<70MqcE--n&)MbWCA+%9xN{8SEMjaC80_M_ZXZFo zuzxfR^y3iabmov)4SXCjh6|HQ&Z$SFX6GM;%y*e-38Q$VX89;&0H+NfsaZY>S)Ppa zBQ@fq0YW}hBR&jatpyv1>Wc4#{E2kf<0KDd0Xu+ojw8y#aMxvx|mc^k5sM<^Xh9c3WchwECe$g(F!(A;$+IacyXQg0Jq;yZhN>sHe8iB z|IgI8C`K6B8xi)B(0#=5Sfz-oMpCL>xIqkzJ*WQu+Di$m`Ju{-NzGG6_(NUuu1P6e zU8V9#Rr;1E-6P~(OoPX+l_DVL^QH^Fszxn%Gyfph#q<~9wVh5O0uA42o4+w#Y*g!X z+UH|5_*VH@{v&qr-cwW^yPXf>IYsm7t>C``?$*%#Yf$Pfz13;2kk>@JYR~(Rr!c&b qH@v1itPcOF-$-@y&y62Ak$#=ilb5v{KIibJ7h+9o9^U|w!~Oz1#&FsI literal 0 HcmV?d00001 diff --git a/radio/wizard/wizard.lua b/radio/wizard/wizard.lua index 95641fa78..b99e11c96 100755 --- a/radio/wizard/wizard.lua +++ b/radio/wizard/wizard.lua @@ -1,18 +1,42 @@ --- Wizard states -local TEMPLATE_CHOICE_INIT = 0 -local TEMPLATE_CHOICE_RUN = 1 -local TEMPLATE_NEXT = 2 +-- Wizard pages +local MODELTYPE_MENU = 0 +local PLANE_MENU = MODELTYPE_MENU+1 +local HELI_MENU = PLANE_MENU+10 +local DELTA_MENU = HELI_MENU+10 +local QUADRI_MENU = DELTA_MENU+10 -local state = TEMPLATE_CHOICE_INIT +local AILERONS_MENU = PLANE_MENU + +local page = MODELTYPE_MENU +local dirty = true local choice = 0 +local edit = false +local field = 0 +local fieldsMax = 0 +local aileronsMode = 0 +local aileronsCH1 = 0 +local aileronsCH2 = 4 + +local function init() + for stick = 0, 4, 1 do + local index = channelOrder(stick); + if index == 0 then + elseif index == 1 then + elseif index == 2 then + else + aileronsCH1 = stick + end + end +end + local function choiceSurround(index) lcd.drawRectangle(12+47*index, 13, 48, 48) lcd.drawPixmap(17+47*index, 8, "/TEMPLATES/mark.bmp") end -local function drawTemplateChoice() +local function drawModelChoiceMenu() lcd.clear() lcd.drawScreenTitle("", 0, 0) -- lcd.drawText(58, 13, "Select model type", 0) @@ -23,60 +47,132 @@ local function drawTemplateChoice() choiceSurround(choice) end -local function templateChoiceRun(event) - nextchoice = choice +local function keyIncDec(event, value, max, isvalue) + if isvalue then + if event == EVT_PLUS_BREAK then + if value < max then + value = (value + 1) + dirty = true + end + elseif event == EVT_MINUS_BREAK then + if value > 0 then + value = (value - 1) + dirty = true + end + end + else + if event == EVT_PLUS_BREAK then + value = (value + max) + dirty = true + elseif event == EVT_MINUS_BREAK then + value = (value + max + 2) + dirty = true + end + value = (value % (max+1)) + end + return value +end + +local function modelTypeMenu(event) + if dirty == true then + drawModelChoiceMenu() + dirty = false + end if event == EVT_ENTER_BREAK then - state = 2 - elseif event == EVT_PLUS_BREAK then - nextchoice = (nextchoice + 1) - elseif event == EVT_MINUS_BREAK then - nextchoice = (nextchoice + 3) - end - nextchoice = nextchoice % 4 - if nextchoice ~= choice then - choice = nextchoice - drawTemplateChoice() + page = PLANE_MENU+(10*choice) + dirty = true + else + choice = keyIncDec(event, choice, 3) end end -local function drawWing(x, y) - lcd.drawLine(x+1, y+1, x+54, y) - lcd.drawLine(x+1, y, x+1, y+16) - lcd.drawLine(x, y+17, x+54, y+27) - lcd.drawLine(x+1, y+11, x+33, y+17) - lcd.drawLine(x+34, y+16, x+34, y+22) - MIRROR = 128 - lcd.drawRectangle(x+55, y-8, 15, 39) - lcd.drawLine(x+MIRROR-5, y+1, x+MIRROR-58, y) - lcd.drawLine(x+MIRROR-5, y, x+MIRROR-5, y+16) - lcd.drawLine(x+MIRROR-4, y+17, x+MIRROR-58, y+27) - lcd.drawLine(x+MIRROR-5, y+11, x+MIRROR-37, y+17) - lcd.drawLine(x+MIRROR-38, y+16, x+MIRROR-38, y+22) +local function getFieldFlags(position) + flags = 0 + if field == position then + flags = INVERS + if edit then + flags = INVERS + BLINK + end + end + return flags end +local lastBlink = 0 +local function blinkChanged() + local time = getTime() % 128 + local blink = (time - time % 64) / 64 + if blink ~= lastBlink then + lastBlink = blink + return true + else + return false + end +end + +local aileronsModeItems = {"Yes...", "No...", "Yes, 2 channels..."} + +local function drawAileronsMenu() + lcd.clear() + lcd.drawText(1, 0, "Has your model got ailerons?", 0) + lcd.drawRect(0, 0, LCD_W, 8, GREY_DEFAULT+FILL_WHITE) + lcd.drawCombobox(0, 8, LCD_W/2, aileronsModeItems, aileronsMode, getFieldFlags(0)) + lcd.drawLine(LCD_W/2-1, 18, LCD_W/2-1, LCD_H, DOTTED, 0) + if aileronsMode == 2 then + -- 2 channels + lcd.drawPixmap(112, 8, "/TEMPLATES/ailerons-2.bmp") + lcd.drawText(20, LCD_H-16, "Assign channels", 0); + lcd.drawText(LCD_W/2-19, LCD_H-8, ">>>", 0); + lcd.drawText(116, LCD_H-8, "CH" .. (aileronsCH1+1), getFieldFlags(1)) + lcd.drawText(175, LCD_H-8, "CH" .. (aileronsCH2+1), getFieldFlags(2)) + fieldsMax = 2 + elseif aileronsMode == 1 then + -- No ailerons + lcd.drawPixmap(112, 8, "/TEMPLATES/ailerons-0.bmp") + fieldsMax = 0 + else + -- 1 channel + lcd.drawPixmap(112, 8, "/TEMPLATES/ailerons-1.bmp") + lcd.drawText(25, LCD_H-16, "Assign channel", 0); + lcd.drawText(LCD_W/2-19, LCD_H-8, ">>>", 0); + lcd.drawText(151, LCD_H-8, "CH" .. (aileronsCH1+1), getFieldFlags(1)) + fieldsMax = 1 + end +end + +local function aileronsMenu(event) + if not dirty then + dirty = blinkChanged() + end + if dirty then + dirty = false + drawAileronsMenu() + end + if event == EVT_ENTER_BREAK then + edit = not edit + dirty = true + end + if edit == false then + field = keyIncDec(event, field, fieldsMax) + elseif field == 0 then + aileronsMode = keyIncDec(event, aileronsMode, 2) + elseif field == 1 then + aileronsCH1 = keyIncDec(event, aileronsCH1, 7, true) + elseif field == 2 then + aileronsCH2 = keyIncDec(event, aileronsCH2, 7, true) + end +end local function run(event) if event == EVT_EXIT_BREAK then return 2 end lcd.lock() - if state == TEMPLATE_CHOICE_INIT then - drawTemplateChoice() - state = TEMPLATE_CHOICE_RUN - elseif state == TEMPLATE_CHOICE_RUN then - templateChoiceRun(event) - elseif state == 2 then - state = 3 - lcd.clear() - lcd.drawText(68, 13, "Wing config", 0) - lcd.drawScreenTitle("MODEL SETUP WIZARD", 2, 3) - drawWing(2, 33) - lcd.drawText(140, 30, "Ail", 0) - lcd.drawText(175, 30, "50%", INVERS) - lcd.drawText(140, 42, "Flp", 0) - lcd.drawText(175, 42, "30%", 0) + if page == MODELTYPE_MENU then + modelTypeMenu(event) + elseif page == AILERONS_MENU then + aileronsMenu(event) end return 0 end -return { run=run } +return { init=init, run=run }