View difference between Paste ID: p6rbajN6 and QB2uSd1V
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