Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
Merung

Draconic Energy Core Monitor

Recommended Posts

Program I wrote to monitor my Draconic Evolution Energy Core:

 

-- Original by Merung (October, 2018)

local component = require("component")
local term = require("term")
local gpu = component.gpu

-- Setup components

if not component.isAvailable("draconic_rf_storage") then
  print("Draconic Energy Core not connected.  Please connect computer to Energy Core with an Adapter")
  os.exit()
end

storage = component.draconic_rf_storage

if not component.isAvailable("screen") then
  print("How do you expect to view this?")
  os.exit()
end

-- Set Resolution
res_x = 120
res_y = 25
gpu.setResolution(res_x, res_y)

-- Set Max Value and increment for bottom bars
io_max_rate = 600000
io_increment = io_max_rate / 100

-- Functions

function exit_msg(msg)
  term.clear()
  print(msg)
  os.exit()
end

function get_tier_level(maxrf)
  local tier_level = 0
  if maxrf == 45500000 then
    tier_level = 1
  elseif maxrf == 273000000 then
    tier_level = 2
  elseif maxrf == 1640000000 then
    tier_level = 3
  elseif maxrf == 9880000000 then
    tier_level = 4
  elseif maxrf == 59300000000 then
    tier_level = 5
  elseif maxrf == 356000000000 then
    tier_level = 6
  elseif maxrf == 2140000000000 then
    tier_level = 7
  else
    tier_level = 8
  end
  return tier_level
end

function convert_value(rf)
  if rf == 0 then return "0 RF" end
  local i, units = 1, { "RF", "K RF", "M RF", "G RF", "T RF", "P RF", "E RF", "Y RF" }
  while rf >= 1000 do
    rf = rf / 1000
    i = i + 1
  end
  local unit = units[ i ] or "?"
  local fstr
  if unit == "RF" then
    fstr = "%.0f %s"
  else
    fstr = "%.2f %s"
  end
  return string.format( fstr, rf, unit )
end

function get_percent_color(energy)
  local energycolor
  if energy <= 5 then
    energycolor = RED
  elseif energy <= 25 then
    energycolor = ORANGE
  elseif energy <= 50 then
    energycolor = YELLOW
  elseif energy <= 75 then
    energycolor = GREEN
  elseif energy <= 99 then
    energycolor = BLUE
  else
    energycolor = BLACK
  end
  return energycolor
end

function draw_legend(io)
  gpu.setForeground(fg_default)

  for loc = 0, 100, 10
  do
    term.setCursor(offset + loc, visual_y_start + 11)
    term.write(loc)
    term.setCursor(offset + loc, visual_y_start + 12)
    term.write("|")
  end

  draw_direction(io)

end

function draw_direction(io)

local is_neg
local pos_num

  if io == 0
  then
    return
  elseif io > 0
  then
    is_neg = 0
    pos_num = io
  elseif io < 0
  then
    is_neg = 1
    pos_num = io * -1
  end

  -- Determine how many "="
  local num_col = pos_num / io_increment
  if num_col > 100 then num_col = 100 end
  if num_col < 1 then num_col = 1 end

  -- Create the bars

  local base_bar = ""
  local base_bar1 = ""
  local base_bar2 = ""
  local base_bar3 = ""
  local num_spaces = 100 - num_col
  local space_offset = num_spaces / 2


  for int_space = 0, space_offset, 1
  do
    base_bar = base_bar .. " "
  end

  if is_neg == 1
  then
    base_bar1 = base_bar .. "/"
    base_bar2 = base_bar .. "<="
    base_bar3 = base_bar .. "\\"
  else
    base_bar1 = base_bar
    base_bar2 = base_bar
    base_bar3 = base_bar
  end

  for int_eq = 0, num_col, 1
  do
    base_bar1 = base_bar1 .. "="
    base_bar2 = base_bar2 .. "="
    base_bar3 = base_bar3 .. "="
  end

  if is_neg == 0
  then
    base_bar1 = base_bar1 .. "\\"
    base_bar2 = base_bar2 .. "=>"
    base_bar3 = base_bar3 .. "/"
  end

  -- Draw the actual bars
  if is_neg == 1
  then
    gpu.setForeground(RED)
    term.setCursor(offset, visual_y_start + 15)
    term.write(base_bar1)
    term.setCursor(offset - 1, visual_y_start + 16)
    term.write(base_bar2)
    term.setCursor(offset, visual_y_start + 17)
    term.write(base_bar3)
    gpu.setForeground(fg_default)
  else
    gpu.setForeground(GREEN)
    term.setCursor(offset, visual_y_start + 15)
    term.write(base_bar1)
    term.setCursor(offset, visual_y_start + 16)
    term.write(base_bar2)
    term.setCursor(offset, visual_y_start + 17)
    term.write(base_bar3)
    gpu.setForeground(fg_default)
  end

end

function draw_visuals(percent)

  term.setCursor(offset, visual_y_start + 13)
  for check = 0, 100, 1
  do
    if check <= percent
    then
      gpu.setForeground(get_percent_color(check))
      term.write("|")
      gpu.setForeground(fg_default)
    else
      gpu.setForeground(fg_default)
      term.write(".")
    end
  end
end

-- Define Colors

RED = 0xFF0000
BLUE = 0x0000FF
GREEN = 0x00FF00
BLACK = 0x000000
WHITE = 0xFFFFFF
PURPLE = 0x800080
YELLOW = 0xFFFF00
ORANGE = 0xFFA500
DARKRED = 0x880000

-- Main Code

loopdelay = 1

event_loop = true
while event_loop do

  if not component.isAvailable( "draconic_rf_storage" ) then
    exit_msg("Energy Core disconnected.  Exiting.")
  end

  local storedenergyinit = storage.getEnergyStored()
  local maxenergyinit = storage.getMaxEnergyStored()
  local iorate = storage.getTransferPerTick()
  local tier = get_tier_level(maxenergyinit)

  local percentenergy = storedenergyinit / maxenergyinit * 100

  local convstored = convert_value( storedenergyinit )
  local convmax = convert_value( maxenergyinit )

  offset = 10
  visual_y_start = 5
  fg_default = WHITE
  fg_color_max = PURPLE
  local fg_color_stored = get_percent_color(percentenergy)
  local fg_color_percent = fg_color_stored

  local fg_color_io

  if iorate <= 0 then
    fg_color_io = RED
  else
    fg_color_io = GREEN
  end

  if percentenergy <= 99 then
    gpu.setBackground(BLACK)
  else
    gpu.setBackground(DARKRED)
  end

  term.clear()
  gpu.setForeground(fg_color_max)
  term.setCursor(48, visual_y_start)
  term.write("Energy Storage Tier: " .. tier)
  gpu.setForeground(fg_default)
  term.setCursor(30, visual_y_start + 1)
  term.write("Current Stored Energy / Max Energy: ")
  gpu.setForeground(fg_color_stored)
  term.write(convstored)
  gpu.setForeground(fg_default)
  term.write (" / ")
  gpu.setForeground(fg_color_max)
  term.write(convmax)
  gpu.setForeground(fg_default)
  term.setCursor(44,visual_y_start + 2)
  term.write("Percent Full: ")
  gpu.setForeground(fg_color_percent)
  term.write(string.format("%.12f %s", percentenergy, " %"))
  gpu.setForeground(fg_default)
  term.setCursor(48,visual_y_start + 3)
  term.write("RF/Tick Change: ")
  gpu.setForeground(fg_color_io)
  term.write(iorate)

  draw_visuals(percentenergy)
  draw_legend(iorate)

  os.sleep(loopdelay)

end

 

2018-10-21_01.14.01.png

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.