--[[
 script implementing pre-arm check that batteries are well balanced
--]]

---@diagnostic disable: param-type-mismatch

local MAX_CELL_DEVIATION = 0.2

local auth_id = arming:get_aux_auth_id()

local NCELLS_MAX = 16

function check_cell_balance(bnum)
   local min_volt = -1
   local max_volt = -1
   for c=0,NCELLS_MAX do
      local voltage = battery:get_cell_voltage(bnum, c)
      if not voltage then
         break
      end
      if min_volt == -1 or min_volt > voltage then
         min_volt = voltage
      end
      if max_volt == -1 or max_volt < voltage then
         max_volt = voltage
      end
   end
   local vdiff = max_volt - min_volt
   if vdiff > MAX_CELL_DEVIATION then
      arming:set_aux_auth_failed(auth_id, string.format("Batt[%u] imbalance %.1fV", bnum+1, vdiff))
      return false
   end
   return true
end

function update()
   local num_batts = battery:num_instances()
   local ok = true
   for i=0,num_batts do
      if not check_cell_balance(i) then
         ok = false
      end
   end
   if ok then
      arming:set_aux_auth_passed(auth_id)
   end
   return update, 500
end

return update()