View difference between Paste ID: kp6SNyAD and uFmTBdeN
SHOW: | | - or go back to the newest paste.
1
--Written by A_Tasty_Peanut
2
--Config Options########################################################################
3
--hologram options
4
local hologramScale = 3 --the size of holo
5
local rotation = false  --Should the hologram rotate
6
local rotationRate = 3 --How Fast the sign will rotate
7
8
--Colors are decimal representation of HEX value
9
local colorA=16777215 --TPS Words default 16777215 is white
10
local colorB=65280 --Color of TPS number  
11
local colorC=65793 --Black Backdrop (allows for double sided sign)
12
local ColorAdjust = true  --Do you want TPS number to change color based on value?
13
14
local timeConstant = 2 --how long it waits per measure cycle
15
16
--######################################################################################
17
18
local com = require "component"
19
local fs = require "filesystem"
20
local keyboard = require "keyboard"
21
local holo = com.hologram
22
23
--Intialaization for Hologram projector
24
local rawHoloTxtBase = ""
25
local f = io.open("TPSBaseRaw", "r")
26
rawHoloTxtBase = f:read("*all")
27
f:close()
28
holo.clear()
29
holo.setScale(hologramScale)
30
holo.setTranslation(0,0.2,0)
31
holo.setPaletteColor(1, colorA)
32
holo.setPaletteColor(2, colorB)
33
holo.setPaletteColor(3, colorC)
34
holo.setRotation(0,0,0,0)
35
holo.setRaw(rawHoloTxtBase)
36
if rotation == true then
37
holo.setRotationSpeed(rotationRate,0,1,0)
38
else
39
holo.setRotationSpeed(0,0,1,0)
40
end
41
42
--all* glyphs follow standard minecraft text pixels (*the decimal is a lil diffrent)
43
--all* glyphs are 7char High by 5char Wide (*the decumal is 7char High by 4char Wide)
44
local glyphsMath = {
45
["0"]=[[
46
 XXX 
47
X   X
48
X  XX
49
X X X
50
XX  X
51
X   X
52
 XXX 
53
]],
54
["1"]=[[
55
  X  
56
 XX  
57
  X  
58
  X  
59
  X  
60
  X  
61
XXXXX
62
]],
63
["2"]=[[
64
 XXX 
65
X   X
66
    X
67
  XX 
68
 X   
69
X   X
70
XXXXX
71
]],
72
["3"]=[[
73
 XXX 
74
X   X
75
    X
76
  XX 
77
    X
78
X   X
79
 XXX 
80
]],
81
["4"]=[[
82
   XX
83
  X X
84
 X  X
85
X   X
86
XXXXX
87
    X
88
    X
89
]],
90
["5"]=[[
91
XXXXX
92
X    
93
XXXX 
94
    X
95
    X
96
X   X
97
 XXX 
98
]],
99
["6"]=[[
100
  XX 
101
 X   
102
X    
103
XXXX 
104
X   X
105
X   X
106
 XXX 
107
]],
108
["7"]=[[
109
XXXXX
110
X   X
111
    X
112
   X 
113
  X  
114
  X  
115
  X  
116
]],
117
["8"]=[[
118
 XXX 
119
X   X
120
X   X
121
 XXX 
122
X   X
123
X   X
124
 XXX 
125
]],
126
["9"]=[[
127
 XXX 
128
X   X
129
X   X
130
 XXXX
131
    X
132
   X 
133
 XX  
134
]],
135
["."]=[[
136
    
137
    
138
    
139
    
140
    
141
    
142
 X  
143
]],
144
}
145
146
local function time() --returns realworld unix time stamp in miliseconds
147
local f = io.open("/tmp/timeFile","w")
148
f:write("test")
149
f:close()
150
return(fs.lastModified("/tmp/timeFile"))
151
end
152
153
local function cvtToGlyp(txtNum)
154
	local timeTxt = ""
155
	for row = 1, 7 do  --text code taken from https://github.com/OpenPrograms/Sangar-Programs/blob/master/holo-text.lua
156
					   --Simplified a decent bit tho since it doesn't need to do as much
157
		for col = 1, 5 do
158
			local singleChar = string.sub(txtNum, col, col)
159
			local glyph = glyphsMath[singleChar]
160
			local s = 0
161
			for _ = 2, row do
162
				s = string.find(glyph, "\n", s + 1, true)
163
				if not s then
164
					break
165
				end
166
			end
167
			if s then
168
				local line = string.sub(glyph, s + 1, (string.find(glyph, "\n", s + 1, true) or 0) - 1)
169
				timeTxt = timeTxt .. line .. " "
170
			end
171
		end
172
		timeTxt = timeTxt .. "\n"
173
	end
174
return(timeTxt)
175
end
176
177
local function getColor(tps) --Uses HSV to decide color
178
	local H, rP, gP, bP, X = tps*12-120, 0, 0, 0, 0
179
	--H is hue should range from 0 to 120
180
	if H<0 then H=0 end --forces greater then 0 but if things get wonky lets Hue go above 120 and turn blue
181
	X = (1-math.abs((H/60)%2-1))
182
	if H<60 then
183
		rP = 1
184
		gP = X
185
		bP = 0
186
	elseif H<120 then
187
		rP = X
188
		gP = 1
189
		bP = 0	
190
	elseif H<180 then
191
		rP = 0
192
		gP = 1
193
		bP = X	
194
	elseif H<240 then
195
		rP = 0
196
		gP = X
197
		bP = 1	
198
	elseif H<300 then
199
		rP = X
200
		gP = 0
201
		bP = 1
202
	else
203
		rP = 1
204
		gP = 0
205
		bP = X
206
	end
207
	return(math.floor((rP)*255)*65536+math.floor((gP)*255)*256+math.floor((bP)*255))
208
end
209
210
local function holoset(x,y,z,value,rawString)
211
	--nesting for setRaw() is x z y
212
	--holograms are 48x32x48 X-Y-Z
213
	--for x=11 z=17 y=31
214
	--then location in sting is 
215
	--loc = (x-1)*48*32	+ (z-1)*32 + y
216
	return(string.sub(rawString,1,(x-1)*1536+(z-1)*32+y-1)..tostring(value)..string.sub(rawString,(x-1)*1536+(z-1)*32+y+1))
217
end
218
219
local function writeToHolo(text, avgTPS)
220
	local timeGlyph = cvtToGlyp(text)
221
	local bm = {}
222
	
223
	for token in timeGlyph:gmatch("([^\r\n]*)") do
224
		if token ~= "" then
225
			table.insert(bm, token)
226
		end
227
	end
228
	local zDepth = 26
229
	local xStart = 10 --Space from left boundry 
230
	local yStart = 5  --Space from bottom boundry
231
	local xFront = 0
232
	local xBack = 0
233
	local rawString = rawHoloTxtBase --starts fresh with no TPS numbers on rawString
234
	if ColorAdjust==true then holo.setPaletteColor(2,getColor(avgTPS)) end
235
	for i=1, 28 do --Each number is 5 wide, and the decimal is 4 wide. Between each character is an additional space.  With 4 numbers, One decimal and 4 padds thats a length of 28
236
				   --Reads from left to right
237
		xFront = xStart + i --writes forward (so it decides which x colum it should be writing to)
238
		xBack = 48-xStart - i --writes backward (so it decides which x colum it should be writing to)
239
		for j=1, 7 do  --reads from bottom to top
240
			local y = yStart + j
241
			if bm[8-j]:sub(i, i) ~= " " then
242
				rawString = holoset(xFront, y, zDepth, 2,rawString)
243
				rawString = holoset(xBack, y, zDepth-3, 2,rawString)
244
			end
245
		end
246
	end
247
	holo.setRaw(rawString) --uses setRaw so that you dont get a flickering effect from the hologram as it redraws it pixel by pixel
248
						   --Also makes drawing on holograms faster since it does less API calls, depends on complexity of scence but can speed up by 200%
249
end
250
251
local realTimeOld = 0
252
local realTimeNew = 0
253
local realTimeDiff = 0
254
255
local TPS = {}
256
local avgTPS = 0
257
for tSlot=1,10 do
258
	TPS[tSlot]=0
259
end
260
261
print("To exit hold down Ctrl + W\n")
262
for i=1, math.huge do
263
	for tSlot = 1, 10 do --main averaging loop that measures individual TPS and puts it into a cycling table location
264
		realTimeOld = time()
265
		os.sleep(timeConstant) --waits for an estimated ammount game seconds
266
		realTimeNew = time()
267
268
		realTimeDiff = realTimeNew-realTimeOld
269
		
270
		TPS[tSlot] = 20000*timeConstant/realTimeDiff
271
		avgTPS = (TPS[1]+TPS[2]+TPS[3]+TPS[4]+TPS[5]+TPS[6]+TPS[7]+TPS[8]+TPS[9]+TPS[10])/10
272
		--print("Server is running at\n"..tostring(TPS[tSlot]).." TPS\nAveraged Value is\n"..tostring(avgTPS).." TPS")
273
		writeToHolo(string.sub(tostring(avgTPS)..".000",1,5),avgTPS) --The .000 is needed because sometimes tps is exactly 20 and writeToHolo() is expecting 5 characters, not 2
274
		
275
		if keyboard.isKeyDown(keyboard.keys.w) and keyboard.isControlDown() then
276
			print("Exiting...")
277
			holo.clear()
278
			os.exit()
279
		end
280
		
281
	end
282
end