---- #########################################################################
---- #                                                                       #
---- # Copyright (C) OpenTX                                                  #
-----#                                                                       #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html               #
---- #                                                                       #
---- # This program is free software; you can redistribute it and/or modify  #
---- # it under the terms of the GNU General Public License version 2 as     #
---- # published by the Free Software Foundation.                            #
---- #                                                                       #
---- # This program is distributed in the hope that it will be useful        #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of        #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
---- # GNU General Public License for more details.                          #
---- #                                                                       #
---- #########################################################################


--###############################################################################
-- Multi buffer for HoTT description
-- To start operation:
--   Write "HoTT" at address 0..3
--   Write 0xFF at address 4 will request the buffer to be cleared
--   Write 0x0F at address 5
-- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters
--    by 8 lines
-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page,
--    0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor
--    to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM
-- Write at address 4 the value 0xFF will request the buffer to be cleared
-- !! Before exiting the script must write 0 at address 0 for normal operation !!
--###############################################################################

HoTT_Sensor = 0
Timer_128 = 100

local function HoTT_Release()
  multiBuffer( 0, 0 )
end

local function HoTT_Send(button)
  multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button)
end

local function HoTT_Sensor_Inc()
  local detected_sensors=multiBuffer( 4 )
  local a
  if detected_sensors ~= 0xFF then
    repeat
        HoTT_Sensor=(HoTT_Sensor+1)%7	-- Switch to next sensor
        if HoTT_Sensor ~= 0 then
          a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right
        end
    until HoTT_Sensor==0 or a % 2 == 1
    HoTT_Send( 0x0F )
  end
end

local function HoTT_Draw_LCD()
  local i
  local value
  local line
  local result
  local offset=0
  
  local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" }

  lcd.clear()

  if LCD_W == 480 then
    --Draw title
    lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR)
    lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR)
    --Draw RX Menu
    if multiBuffer( 4 ) == 0xFF then
      lcd.drawText(10,50,"No HoTT telemetry...", BLINK)
    else
      for line = 0, 7, 1 do
        for i = 0, 21-1, 1 do
          value=multiBuffer( line*21+6+i )
          if value > 0x80 then
            value = value - 0x80
            lcd.drawText(10+i*16,32+20*line,string.char(value).."   ",INVERS)
          else
            lcd.drawText(10+i*16,32+20*line,string.char(value))
          end
        end
      end
    end
  else
    --Draw RX Menu on LCD_W=128
    if multiBuffer( 4 ) == 0xFF then
      lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE)
    else
      if Timer_128 ~= 0 then
        --Intro page
        Timer_128 = Timer_128 - 1
        lcd.drawScreenTitle("Graupner Hott",0,0)
        lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE)
        lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE)
      else
        --Menu page
        for line = 0, 7, 1 do
          for i = 0, 21-1, 1 do
            value=multiBuffer( line*21+6+i )
            if value > 0x80 then
              value = value - 0x80
              lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS)
            else
              lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE)
            end
          end
        end
      end
    end
  end
end

-- Init
local function HoTT_Init()
  --Set protocol to talk to
  multiBuffer( 0, string.byte('H') )
  --test if value has been written
  if multiBuffer( 0 ) ~=  string.byte('H') then
    error("Not enough memory!")
    return 2
  end
  multiBuffer( 1, string.byte('o') )
  multiBuffer( 2, string.byte('T') )
  multiBuffer( 3, string.byte('T') )
  --Request init of the RX buffer
  multiBuffer( 4, 0xFF )
  --Request RX to send the config menu
  HoTT_Send( 0x0F )
  HoTT_Sensor = 0;
  HoTT_Detected_Sensors=0;
  Timer_128 = 100
end

-- Main
local function HoTT_Run(event)
  if event == nil then
    error("Cannot be run as a model script!")
    return 2
  elseif event == EVT_VIRTUAL_EXIT then
    HoTT_Release()
    return 2
  else
    if event == EVT_VIRTUAL_PREV_PAGE then
      killEvents(event)
      HoTT_Send( 0x07 )
    elseif event == EVT_VIRTUAL_ENTER then
      HoTT_Send( 0x09 )
    elseif event == EVT_VIRTUAL_PREV then
      HoTT_Send( 0x0B )
    elseif event == EVT_VIRTUAL_NEXT then
      HoTT_Send( 0x0D )
    elseif event == EVT_VIRTUAL_NEXT_PAGE then
      HoTT_Send( 0x0E )
    elseif event == EVT_VIRTUAL_MENU then
      Timer_128 = 100
      HoTT_Sensor_Inc()
    else
      HoTT_Send( 0x0F )
    end
    HoTT_Draw_LCD()
    return 0
  end
end

return { init=HoTT_Init, run=HoTT_Run }