Subversion Repositories Kolibri OS

Rev

Rev 500 | Rev 551 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
;
2
; Ghost Monitor - утилита (стресс) тестирования и мониторинга системы
313 Ghost 3
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
4
; All Right Reserved
5
;
205 heavyiron 6
; ВОЗМОЖНА ПОРЧА ОБОРУДОВАНИЯ!
7
; ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК!
8
;
9
; Заметки :
10
;	Дописать запуск тестов (rtst) (нет реакции на ошибку запуска)
11
;	Переделать обновление графика (сделать отдельным процессом)
12
;	Добавить реакцию на параметры датчиков
13
;
14
 
15
; Внешние файлы :
16
;	hwm*.inc	- процедуры работы с датчиками мониторинга
17
;	system.inc	- вычисление загрузки процессора, завершение теста, etc...
18
;	tests.inc	- тесты ;-)
19
;	diag.inc	- поддержка диаграм
223 Ghost 20
;	tab_*.inc	- процедуры отрисовки соответствуюших вкладок
205 heavyiron 21
 
22
 
23
; Идентификаторы кнопок :
24
;	01 - Exit
25
;	02 - Info tab
26
;	03 - Tests tab
27
;	04 - Config tab
28
;	05 - About tab
500 Ghost 29
;	06 - P5 test (tab_test.inc)
30
;	07 - P6 test (tab_test.inc)
31
;	08 - K6 test (tab_test.inc)
32
;	09 - K7 test (tab_test.inc)
33
;	10 - MMX test	- not used (tab_test.inc)
34
;	11 - Update time increment (tab_conf.inc)
35
;	12 - Update time decriment (tab_conf.inc)
205 heavyiron 36
;	13..17 - Изменение цвета CPU_load, Mem_usage, Temp1, Temp2, Temp3
37
 
38
include 'config.inc'
39
include 'macros.inc'
40
 
41
tcol	equ	0x5080d0
42
atcol	equ	0x4070c0
43
val_mod	equ	0x3090
44
 
45
MEOS_APP_START
46
include "tests.inc"	; <-- Много выравниваний, лучше здесь
47
CODE
48
;--- Init ------------------------------------------------------------
49
	; Очищаем неинициализированные данные
50
	mov	ecx, __memory - __udata
51
	mov	edi, __udata
52
	xor	eax, eax
53
	rep	stosb
54
 
55
	xor	eax, eax
56
	cpuid					; Узнаём производителя проца
57
	mov	[Vendor + 0], ebx
58
	mov	[Vendor + 4], edx
59
	mov	[Vendor + 8], ecx
60
	mov	eax, 1
61
	cpuid					; Есть ли MMX ?
62
	mov	ecx, eax
63
	shr	al, 4
64
	and	ax, 0x0F0F
65
	mov	[CPU_fam], ah
66
	mov	[CPU_mod], al
67
	shr	edx, 23
68
	and	dl, 1
69
	mov	[CPU_mmx], dl
70
	shr	ecx, 12
71
	and	cl, 11b
72
	mov	[CPU_type], cl
73
 
74
	; ! Цвета из массива colors
75
	mov	dword[d_cpu_load], 0xFF00	; инициализируем график загрузки АЛУ
76
	mov	dword[d_mem_usage], 0x8BA169	; -- mem usega
77
	mov	dword[d_temp1], 0xFF0000	; -- график температуры ЦПУ
78
	mov	dword[d_temp2], 0xFF		; -- график температуры МП
79
	mov	dword[d_temp3], 0xFF7E23
80
 
81
	call	hwm_init			; Инициализируем чип мониторинга
82
 
83
	jmp	draw_window
84
;--- Wait & translate event ------------------------------------------
85
wait_for_event:
86
	mov	byte[diag_add_v], 0	; добавляем данные к графику только по таймеру
87
	mov	ebx, [update_time]
88
	mov	eax, 23
89
	int	0x40
90
	test	eax, eax
91
	jnz	@f
92
	inc	byte [diag_add_v]
93
	inc	eax			; перерисуем окно (eax := 1)
94
@@:	dec	eax			; redraw request ?
95
	jz	draw_window
96
	dec	eax			; key in buffer ?
97
	jz	key
98
	dec	eax			; button in buffer ?
99
	jz	button
100
	jmp	wait_for_event
101
;--- Key pressed -----------------------------------------------------
102
key:
103
	mov	eax, 2
104
	int	0x40
105
	cmp	ah, 27			; Esc - завершение работы
106
	je	exit
107
	jmp	wait_for_event
108
;--- Button down -----------------------------------------------------
109
button:
110
	mov	eax, 17			; get id
111
	int	0x40
112
	cmp	ah, 1			; button id == 1 ?
113
	jne	noexit
114
exit:	cmp	byte[test_id], 0
115
	je	@f
116
	call	stop_test
117
@@:	mov	eax, -1		; close this program
118
	int	0x40
119
noexit:
120
	; кнопки вкладок (2 .. 5)
121
	cmp	ah, 5
122
	jg	no_tabs
123
	mov	byte[act_tab], ah
124
	jmp	draw_window
125
no_tabs:
126
	; кнопки запуска тество (6 .. 10)
127
	cmp	ah, 10
128
	jg	no_test_bt
129
	; если нет запущеных тестов - запускаем выбранный
130
	cmp	byte[test_id], 0
131
	je	run_test
132
	; если кнопка активного теста - останавливаем тест, иначе ничего не делаем
133
	cmp	[test_id], ah
134
	jne	wait_for_event
135
	call	stop_test
136
	jmp	draw_window
137
 
138
tsts:	dd	p5, p6, k6, k7
139
run_test:
140
	push	eax
141
	movzx	ecx, ah
142
	mov	ecx, [tsts + (ecx * 4) - (6 * 4)]
143
rtst:	mov	eax, 51
144
	mov	edx, stp
145
	mov	ebx, 1
146
	int	0x40
147
	cmp	eax, 0xFFFFFFF0	; -16
148
	je	wait_for_event	; <-- ошибка запуска теста, ПЕРЕПИСАТЬ
149
	mov	[test_pid], eax
150
	pop	eax
151
	mov	byte [test_id], ah
152
	jmp	draw_window
153
	;-------------------------
154
	; кнопки изменения времени обновления
155
no_test_bt:
156
	cmp	ah, 11
157
	jne	no_ut_inc
158
	add	dword[update_time], 10
159
	jmp	draw_window
160
no_ut_inc:
161
	cmp	ah, 12
162
	jne	no_ut_dec
163
	cmp	dword[update_time], 10
164
	jng	wait_for_event
165
	sub	dword[update_time], 10
166
	jmp	draw_window
167
no_ut_dec:
168
	;-------------------------
169
	; кнопки изменения цвета графиков (13..17)
170
	cmp	ah, 17
171
	jg	no_change_color
172
	sub	ah, 13
173
	movzx	ecx, ah
174
	mov	esi, [d_colors + ecx * 4]
175
	mov	eax, [esi]
223 Ghost 176
	mov	ecx, (colors_end - colors) / 4	; количество цветов
177
@@:	dec	ecx
178
	cmp	eax, [colors + ecx * 4]
179
	jne	@b
180
	mov	ebx, [colors + ecx * 4 - 4]
205 heavyiron 181
	mov	[esi], ebx
182
	jmp	draw_window
183
no_change_color:
184
	jmp	wait_for_event
185
;---------------------------------------------------------------------
186
draw_window:
187
	mov	eax,12
188
	mov	ebx,1
189
	int	0x40
190
	; Создаём окно
191
	xor	eax, eax
192
	mov	ebx, 300 * 65536 + 309
223 Ghost 193
	mov	ecx, 150 * 65536 + 450
340 heavyiron 194
	mov	edx, tcol + 0x13000000	; color of work area RRGGBB,8->color
195
	mov	edi, title		; color of frames    RRGGBB
205 heavyiron 196
	int	0x40
197
	; Создаём рамку графика
198
	mov	eax, 13
199
	mov	ebx, 10 * 65536 + 290
223 Ghost 200
	mov	ecx, 138 * 65536 + 105
205 heavyiron 201
	mov	edx, atcol
202
	int	0x40
203
	mov	ebx, 12 * 65536 + 286
223 Ghost 204
	mov	ecx, 140 * 65536 + 101
205 heavyiron 205
	mov	edx, tcol
206
	int	0x40
207
	mov	eax, 38
208
	mov	edx, atcol
209
	mov	ebx, 12 * 65536 + 286 + 12
223 Ghost 210
	mov	ecx, 140 * 65536 + 140
205 heavyiron 211
@@:	add	ecx, 10 * 65536 + 10
212
	int	0x40
223 Ghost 213
	cmp	cx, 230			; привязано к координатам окна
205 heavyiron 214
	jl	@b
215
 
216
	; Пишим названия параметров (Cpu load, temper, etc...)
217
	mov	edx, msgs_mon
218
	mov	ebx, 17 * 65536 + 30
219
	call	show_text
220
 
221
	mov	edx, msgs_mon2
222
	mov	ebx, 156 * 65536 + 30
223
	call	show_text
224
 
225
	; Рисуем кнопки смены цвета
226
	mov	eax, 8
227
	mov	ebx, 112 * 65536 + 5
228
	mov	ecx, 30 * 65536 + 6
229
	mov	edx, 13
230
@@:	mov	esi, [d_colors - 13 * 4 + edx * 4]
231
	mov	esi, [esi]
232
	int	0x40
233
	add	ecx, 10 * 65536
234
	inc	edx
235
	cmp	edx, 13 + 5		; 5 кнопок
236
	jne	@b
237
 
238
	; Пишим загрузку процессора
239
	call	cpu_usage
240
	;--- добавляем на график ---
241
	mov	esi, d_cpu_load
242
	call	d_add
243
	call	d_show
244
	;---------------------------
245
	movzx	ecx, al
246
	mov	eax, 47
247
	mov	edx, 121 * 65536 + 30
248
	xor	esi, esi
249
	call	digit_len
250
	int	0x40
251
 
252
	; Пишим используемую память
253
	call	mem_usage
254
	;--- добавляем на график ---
255
	mov	esi, d_mem_usage
256
	call	d_add
257
	call	d_show
258
	;---------------------------
259
	movzx	ecx, al
260
	mov	eax, 47
261
	mov	edx, 121 * 65536 + 40
262
	xor	esi, esi
263
	call	digit_len
264
	int	0x40
265
 
266
	cmp	byte[hwm_enable], 0
267
	jne	show_mon
268
	; Нет датчиков - пишем NO
223 Ghost 269
	mov	ecx, 8	;<- количество параметров
205 heavyiron 270
	mov	eax, 4
271
	mov	ebx, 121 * 65536 + 50
272
	mov	edx, msg_no
273
	mov	esi, 3
274
@@:	int	0x40
275
	add	ebx, 10
276
	loop	@b
277
 
278
	mov	ecx, 7	;<- количество параметров
279
	mov	ebx, 260 * 65536 + 30
280
@@:	int	0x40
281
	add	ebx, 10
282
	loop	@b
283
 
284
	jmp	no_monitor
285
show_mon:
286
	;Есть датчики пишим инфу
287
	call	hwm_get_params
288
	;---------------------------
289
	; Температуру
290
	mov	ecx, 3
223 Ghost 291
	mov	esi, hwm_temps
205 heavyiron 292
	mov	edx, 121 * 65536 + 50
293
	xor	eax, eax
294
sh_temp:push	ecx
295
	lodsw
296
	push	esi
297
	; реакция на изменения
298
	xor	esi, esi
299
	cmp	[old_t1 + ecx * 4 - 4], eax
300
	je	@f
301
	mov	[old_t1 + ecx * 4 - 4], eax
302
	mov	esi, val_mod
303
@@:	movzx	ecx, al
304
	push	eax
305
	mov	eax, 47
306
	mov	ebx, 0x20000
307
	int	0x40
308
	pop	eax
309
	mov	cl, ah
310
	mov	eax, 47
311
	mov	ebx, 0x10000
312
	add	edx, 15 * 65536
313
	int	0x40
314
	sub	edx, 15 * 65536 - 10
315
	pop	esi
316
	pop	ecx
317
	loop	sh_temp
318
	;;--- добавляем на график temp1 ---
223 Ghost 319
	movzx	eax, word[hwm_temps]
205 heavyiron 320
	mov	esi, d_temp1
321
	call	d_add
322
	call	d_show
323
	;;--- добавляем на график temp2 ---
223 Ghost 324
	movzx	eax, word[hwm_temps + 2]
205 heavyiron 325
	mov	esi, d_temp2
326
	call	d_add
327
	call	d_show
328
	;;--- добавляем на график temp3 ---
223 Ghost 329
	movzx	eax, word[hwm_temps + 4]
205 heavyiron 330
	mov	esi, d_temp3
331
	call	d_add
332
	call	d_show
333
 
334
	;---------------------------
335
	; Скорости врашения вентилей
223 Ghost 336
	mov	ecx, 5
337
	mov	esi, hwm_rpms
205 heavyiron 338
	mov	edx, 121 * 65536 + 80
339
sh_fan:	push	ecx
340
	lodsd
341
	push	esi
342
	;реакция на изменения
343
	xor	esi, esi
344
	cmp	[old_f1 + ecx * 4 - 4], eax
345
	je	@f
346
	mov	[old_f1 + ecx * 4 - 4], eax
347
	mov	esi, val_mod
348
@@:	mov	ecx, eax
349
	call	digit_len
350
	mov	eax, 47
351
	int	0x40
352
	add	edx, 10
353
	pop	esi
354
	pop	ecx
355
	loop	sh_fan
356
 
357
	;---------------------------
358
	; Напруги
223 Ghost 359
	mov	esi, hwm_voltages
205 heavyiron 360
	mov	edi, old_volts
361
	mov	ecx, 7
362
	mov	ebx, 260 * 65536 + 30
363
	mov	edx, Data_String
364
volt_nxt:
365
	push	ecx
366
	push	esi
367
	call	ftoa
368
	;реакция на изменения
369
	xor	ecx, ecx
370
	fld	dword [esi]
371
	fsub	dword [edi]
372
	fabs
373
 
374
	; fcomp	dword [c_eps]	; bug in MeOsEmul
375
	; fstsw	ax
376
	fcom	dword [c_eps]	; 0xBADCODE
377
	fstsw	ax
378
	finit
379
 
380
	sahf
381
	jc	@f
382
	mov	ecx, val_mod
383
@@:	mov	esi, Data_String	; считаем кол-во символов
384
@@:	lodsb
385
	test	al, al
386
	jnz	@b
387
	sub	esi, Data_String
388
 
389
	mov	eax, 4
390
	int	0x40
391
	add	ebx, 10
392
	pop	esi
393
	pop	ecx
394
	movsd
395
	loop	volt_nxt
396
 
397
no_monitor:
398
	;---------------------------
399
	; Создаём кнопки вкладок
223 Ghost 400
	mov	edi, 250 * 65536 + 25
205 heavyiron 401
	mov	ecx, 4
402
	mov	eax, 8
403
	mov	ebx, 10 * 65536 + 70
404
	mov	edx, 2
405
n_bt:	push	ecx
406
	mov	ecx, edi
407
	mov	esi, tcol
408
	cmp	byte [act_tab], dl
409
	jne	na1
410
	mov	esi, atcol
411
na1:	int	0x40
412
	inc	edx
413
	add	ebx, 73 * 65536
414
	pop	ecx
415
	loop	n_bt
416
	; Пишим названия вкладок
417
	mov	eax, 4
223 Ghost 418
	mov	ebx, 35 * 65536 + 260
205 heavyiron 419
	mov	edx, tab_lab
420
	mov	ecx, 0x10000000
421
	mov	esi, 39
422
	int	0x40
423
	; создаём рамку внизу экрана
424
	mov	eax, 13
425
	mov	ebx, 10 * 65536 + 290
223 Ghost 426
	mov	ecx, 275 * 65536 + 160
205 heavyiron 427
	mov	edx, atcol
428
	int	0x40
429
	mov	ebx, 12 * 65536 + 286
223 Ghost 430
	mov	ecx, 277 * 65536 + 156
205 heavyiron 431
	mov	edx, tcol
432
	int	0x40
433
	; рисуем выбранную вкладку
434
	mov	al, [act_tab]
435
	cmp	al, 2
436
	je	info_tab
437
	cmp	al, 3
438
	je	test_tab
439
	cmp	al, 4
440
	je	config_tab
441
	jmp	about_tab
442
end_drow_tab:
443
	mov	eax, 12
444
	mov	ebx, 2
445
	int	0x40
446
	jmp	wait_for_event
447
;--- Drow Info tab ---------------
448
info_tab:
223 Ghost 449
	include	"tab_info.inc"
205 heavyiron 450
;--- Drow test tab ---------------
451
test_tab:
223 Ghost 452
	include "tab_test.inc"
205 heavyiron 453
;--- Drow Config tab -------------
454
config_tab:
223 Ghost 455
	include "tab_conf.inc"
205 heavyiron 456
;--- Drow About tab --------------
457
about_tab:
223 Ghost 458
	include "tab_about.inc"
205 heavyiron 459
;---------------------------------------------------------------------
460
	include	"system.inc"
461
	include "hwm.inc"
462
	include "diag.inc"
463
 
464
 
465
DATA
466
act_tab		db	2 			; Номер активной вкладки
467
tab_lab		db	'Info       Tests      Configs     About'
518 Ghost 468
title		db	'Ghost Monitor v0.4 [23/05/07]',0
205 heavyiron 469
 
470
msgs_mon mls \
471
	'CPU Load (%)',\
472
	'Mem Usage(%)',\
473
	'Temp1',\
474
	'Temp2',\
475
	'Temp3',\
476
	'Fan1',\
477
	'Fan2',\
223 Ghost 478
	'Fan3',\
479
	'Fan4',\
480
	'Fan5'
205 heavyiron 481
 
482
msgs_mon2 mls \
483
	'Vcore',\
484
	'AGP',\
485
	'+3.3V',\
486
	'AVcc (+5V)',\
487
	'+12V',\
488
	'-12V',\
489
	'-5V'
490
 
491
msg_yes		db	'Yes'
492
msg_no		db	'N/A'
493
 
494
update_time	dd	300			; период обновления в сотых долях секунды
495
d_colors	dd	d_cpu_load, d_mem_usage, d_temp1, d_temp2, d_temp3
496
c_eps		dd	0.01
223 Ghost 497
 
498
; Цвета графиков
499
colors:		dd	0xff0000, 0xff00, 0xff, 0xffffff, tcol, 0xFF7E23, 0x8BA169, 0xff0000	; первый и последний равны
500
colors_end:
205 heavyiron 501
;---------------------------------------------------------------------
502
UDATA
503
 
504
test_pid	dd	?			; если test_id == 0 - не имеет смысла
505
test_id		db	?			; 0 - тест не запушен (соответствует № кнопки 6..10)
506
diag_add_v	db	?			; 0 - не добавлять данные на график, !0 - добавлять
507
 
508
Vendor:		times	12 db ?
509
CPU_fam:	db	?
510
CPU_mod:	db	?
511
CPU_type:	db	?
512
CPU_mmx:	db	?
513
 
514
; Для реакции на изменения
515
old_t1:		dd	?	; последнее значение temp1
516
old_t2:		dd	?	; ...
517
old_t3:		dd	?
518
old_f1:		dd	?
519
old_f2:		dd	?
520
old_f3:		dd	?
521
old_volts:	times	7 dd ?
522
 
523
; Грфики
524
diag_beg:
525
d_cpu_load:	dd	?
526
		times 286 db ?
527
 
528
d_mem_usage:	dd	?
529
		times 286 db ?
530
 
531
d_temp1:	dd	?
532
		times 286 db ?
533
 
534
d_temp2:	dd	?
535
		times 286 db ?
536
 
537
d_temp3:	dd	?
538
		times 286 db ?
539
diag_end:
540
 
541
; --- стек теста, воизбежание глюков не переносить в другое место ----
542
th_stack:	times	1024 db ?
543
stp:
544
;---------------------------------------------------------------------
545
MEOS_APP_END