SHOW:
|
|
- or go back to the newest paste.
| 1 | - | _args = { ... }
|
| 1 | + | local _args = { ... }
|
| 2 | ||
| 3 | - | m = peripheral.find("monitor")
|
| 3 | + | local m = peripheral.find("monitor")
|
| 4 | if m then | |
| 5 | m.setTextScale(0.5) | |
| 6 | end | |
| 7 | term.clear() | |
| 8 | ||
| 9 | local file_location | |
| 10 | ||
| 11 | if #_args < 1 then | |
| 12 | error("Usage: " .. shell.getRunningProgram() .. " <file location> <rate>")
| |
| 13 | return | |
| 14 | else | |
| 15 | file_location = _args[1] | |
| 16 | - | ws, err = http.websocket(file_location) |
| 16 | + | |
| 17 | local ws, err = http.websocket(file_location) | |
| 18 | if not ws then | |
| 19 | print(err) | |
| 20 | return | |
| 21 | - | fdata = "" |
| 21 | + | |
| 22 | - | jd = os.epoch() |
| 22 | + | local fdata = "" |
| 23 | - | pack = {}
|
| 23 | + | local jd = os.epoch() |
| 24 | - | bytedata = {}
|
| 24 | + | local pack = {}
|
| 25 | local bytedata = {}
| |
| 26 | sleep(1) | |
| 27 | print("Starting")
| |
| 28 | while true do | |
| 29 | ws.send("hi")
| |
| 30 | data = ws.receive() | |
| 31 | if data == "done" then | |
| 32 | break | |
| 33 | end | |
| 34 | --print("Received chunk " .. #data .. " bytes big")
| |
| 35 | for i=1, #data do | |
| 36 | table.insert(bytedata, data:sub(i,i)) | |
| 37 | if #bytedata >= 65536 then | |
| 38 | table.insert(pack, bytedata) | |
| 39 | bytedata = {}
| |
| 40 | end | |
| 41 | end | |
| 42 | if os.epoch() - jd > 72000 then | |
| 43 | print("Downloaded " .. (#(pack[1])*#pack)/1024000 .. "MB")
| |
| 44 | jd = os.epoch() | |
| 45 | end | |
| 46 | end | |
| 47 | print("Hello there")
| |
| 48 | if #bytedata > 0 then | |
| 49 | table.insert(pack, bytedata) | |
| 50 | end | |
| 51 | print("Loaded " .. #pack .. " packs with " .. #pack[1] .. "kb each")
| |
| 52 | ws.close() | |
| 53 | local seek = -1 | |
| 54 | ||
| 55 | --pack = {{111,112},{113,114}}
| |
| 56 | - | function fileread() |
| 56 | + | |
| 57 | local function fileread() | |
| 58 | seek = seek + 1 | |
| 59 | if pack[1] then | |
| 60 | local index = (seek%#pack[1])+1 | |
| 61 | if index == #pack[1] then | |
| 62 | v = pack[1][index] | |
| 63 | table.remove(pack, 1) | |
| 64 | return string.byte(v) | |
| 65 | else | |
| 66 | return string.byte(pack[1][index]) | |
| 67 | end | |
| 68 | else | |
| 69 | return nil | |
| 70 | end | |
| 71 | - | function converthex(...) |
| 71 | + | |
| 72 | local function converthex(...) | |
| 73 | local _hex_string = "" | |
| 74 | for i,k in pairs(arg) do | |
| 75 | if i ~= "n" then | |
| 76 | local _hex_val = string.format('%x', k)
| |
| 77 | _hex_val = string.rep("0", 2 - #_hex_val ) .. _hex_val
| |
| 78 | _hex_string = _hex_string .. _hex_val | |
| 79 | end | |
| 80 | end | |
| 81 | return _hex_string | |
| 82 | end | |
| 83 | - | function reverse(...) |
| 83 | + | |
| 84 | local function reverse(...) | |
| 85 | reversed = {}
| |
| 86 | for i,k in pairs(arg) do | |
| 87 | if i ~= "n" then | |
| 88 | table.insert(reversed, 1, k) | |
| 89 | end | |
| 90 | end | |
| 91 | return table.unpack(reversed) | |
| 92 | end | |
| 93 | - | function toMinutes(_nSeconds) |
| 93 | + | |
| 94 | local function toMinutes(_nSeconds) | |
| 95 | local _s = tostring(_nSeconds % 60) | |
| 96 | local _m = tostring(math.ceil(_nSeconds - _s) / 60) | |
| 97 | return ("0"):rep(2-#_m) .. _m .. ":" .. ("0"):rep(2-#_s) .. _s
| |
| 98 | end | |
| 99 | ||
| 100 | -- construct blitmap | |
| 101 | ||
| 102 | ||
| 103 | -- read image size | |
| 104 | loc = 0 | |
| 105 | local width = tonumber(converthex(reverse(fileread(), fileread())), 16) | |
| 106 | loc = loc + 2 | |
| 107 | local height = tonumber(converthex(reverse(fileread(), fileread())), 16) | |
| 108 | loc = loc + 2 | |
| 109 | local frames = {}
| |
| 110 | local framecount = 0 | |
| 111 | local jstart = os.epoch() | |
| 112 | ||
| 113 | ||
| 114 | --print("Read header to bytes" .. tostring(loc))
| |
| 115 | while true do | |
| 116 | local frameinfo = {}
| |
| 117 | local blitmap = {}
| |
| 118 | ||
| 119 | -- read palette data | |
| 120 | local palette = {}
| |
| 121 | for i=1, 16, 1 do | |
| 122 | _k = 2^(i-1) | |
| 123 | palette[_k] = {}
| |
| 124 | palette[_k]['r'] = fileread() | |
| 125 | loc = loc + 1 | |
| 126 | if palette[_k]['r'] == nil then | |
| 127 | print("Breaking")
| |
| 128 | break | |
| 129 | end | |
| 130 | palette[_k]['r'] = palette[_k]['r']/255 | |
| 131 | palette[_k]['g'] = fileread()/255 | |
| 132 | palette[_k]['b'] = fileread()/255 | |
| 133 | loc = loc + 2 | |
| 134 | end | |
| 135 | --print("Read palette to bytes " .. tostring(loc))
| |
| 136 | if palette[_k]['r'] == nil then | |
| 137 | break | |
| 138 | end | |
| 139 | ||
| 140 | -- read image data | |
| 141 | local byte = fileread() | |
| 142 | loc = loc + 1 | |
| 143 | local cstart = os.epoch() | |
| 144 | local px, py, pc = 0, 0, 0 | |
| 145 | ||
| 146 | -- px: pixel x coord | |
| 147 | -- py: pixel y coord | |
| 148 | -- pc: pixel count | |
| 149 | for i=1, ((width*height)/2)-1, 1 do | |
| 150 | breakall = false | |
| 151 | if byte then | |
| 152 | local hex_value = converthex(byte) | |
| 153 | for i=1, 2 do | |
| 154 | ||
| 155 | px = math.fmod(pc, width) | |
| 156 | py = math.floor(( pc / width ) % height) | |
| 157 | pc = pc + 1 | |
| 158 | ||
| 159 | if px == width - 1 and py == height - 1 then | |
| 160 | breakall = true | |
| 161 | elseif blitmap[py] == nil then | |
| 162 | blitmap[py] = "" | |
| 163 | end | |
| 164 | ||
| 165 | blitmap[py] = blitmap[py] .. hex_value:sub(i,i) | |
| 166 | end | |
| 167 | byte = fileread() | |
| 168 | loc = loc + 1 | |
| 169 | ||
| 170 | if os.epoch() - cstart >= 72000 then | |
| 171 | print(math.ceil((pc/(width*height))*100) .. "% Remaining: " .. toMinutes(math.ceil(((os.epoch()-cstart)/7200)*(1/(pc/(width*height))))) .. " - " .. tostring(loc)) | |
| 172 | cstart = os.epoch() | |
| 173 | sleep(0) | |
| 174 | end | |
| 175 | else | |
| 176 | breakall = true | |
| 177 | end | |
| 178 | end | |
| 179 | frameinfo['data'] = blitmap | |
| 180 | frameinfo['palette'] = palette | |
| 181 | frames[framecount] = frameinfo | |
| 182 | ||
| 183 | framecount = framecount + 1 | |
| 184 | ||
| 185 | print("Parsed frame " .. tostring(framecount) .. ". Current location: " .. tostring(loc))
| |
| 186 | if framecount % 10 == 1 then | |
| 187 | sleep(0) | |
| 188 | end | |
| 189 | end | |
| 190 | ||
| 191 | print("Load time: " .. toMinutes(math.ceil((os.epoch() - jstart)/72000)) .. ". " .. math.ceil(width*height/((os.epoch() - jstart)/72000)) .. "pps")
| |
| 192 | print(width .. "x" .. height) | |
| 193 | io.read() | |
| 194 | - | function renderLine(bytemap, x, y, w, h) |
| 194 | + | |
| 195 | local function renderLine(bytemap, x, y, w, h) | |
| 196 | for i=0, h do | |
| 197 | if bytemap[y+i-1] == nil then | |
| 198 | bytemap[y+i-1] = ("0"):rep(width)
| |
| 199 | end | |
| 200 | ldata = bytemap[y+i-1]:sub(x, x+w) | |
| 201 | ldata = ldata .. ("0"):rep(w-#ldata-1)
| |
| 202 | term.setCursorPos(1, i+1) | |
| 203 | term.blit((" "):rep(#ldata), (" "):rep(#ldata), ldata)
| |
| 204 | end | |
| 205 | end | |
| 206 | ||
| 207 | - | sw, sh = term.getSize() |
| 207 | + | |
| 208 | local sw, sh = term.getSize() | |
| 209 | frame_count = 0 | |
| 210 | while true do | |
| 211 | frame_number = frame_count % #frames | |
| 212 | ||
| 213 | for i,k in pairs(frames[frame_number]['palette']) do | |
| 214 | term.setPaletteColour(i, k['r'], k['g'], k['b']) | |
| 215 | end | |
| 216 | ||
| 217 | renderLine(frames[frame_number]['data'], 1, 1, sw, sh) | |
| 218 | frame_count = frame_count + 1 | |
| 219 | sleep(tonumber(_args[2])) | |
| 220 | end |