Всем привет!
Мне сразу очень понравилась статья про стрелочную индикацию загрузки процессора и памяти. Бывает нужно глянуть, сколько осталось свободной памяти, запуская третий-четвертый экземпляр тяжелой программы/игры (не хочется доводить до ситуации, кода предыдущие экземпляры свопятся). Или с загрузкой процессора — раньше я думал, что современные Crysis, Call of Duty, Mass Effect и т.д. грузят и видеокарту, и проц. Теперь я знаю, что даже когда картинка подтормаживает — проц загружен не больше 30-40%. Ну или с ходу оценить, все ли ядра использует рендеринг. А какое удовольствие глазу доставляют дергающиеся стрелочки.
Вторая реализация хоть и так же наглядна, но в душу не запала — нет той зрелищности.
Поэтому я решил — когда-нибудь непременно повторю со стрелками.
Единственная проблема, из-за которой я не сделал это сразу — это лень отсутствие индикаторов конечно. И вот, разбирая старый-старый хлам в старом-старом шкафу, я нашел ИХ.
Как раз два стрелочных индикатора из старого бобинного магнитофона. Ох сколько он в свое время перемотал бобин с Кино и Modern Talking.
Итак, чтобы идея заработала, были нужны:
- красивые индикаторы с подходящей шкалой;
- аппаратная часть для подключения индикаторов к компьютеру;
- программа для вывода загрузки памяти и процессора.
Когда задачи ясны — и работать проще.
Красивые индикаторы
Корпуса головок оказались залиты клеем от души, однако тот не выстоял под обычным канцелярским ножом. Разделил пополам, достал старую шкалу, по размерам нарисовал и распечатал новую. Собрал в обратном порядке.
После написания статьи посмотрел на фотографии и разобрал их опять. Взял у жены красный лак для ногтей и покрасил стрелки. Получилось заметнее — это видно на видео.
Аппаратная часть
Тут я с контроллерами мудрить не стал. На мамке есть LPT, он мне для каких-то других целей пригодится вряд ли, так что нечего ему простаивать.
LPT это 8 бит, 4 бита на канал, 16 положений стрелки — меня вполне устроило. Простейший ЦАП — резисторы и диоды, рисуем для двух каналов (эстеты, простите за ISIS):
Точностью резисторов пренебрег, запилил то, что бывает в природе (10, 20, 39, 82 кОм). Как водится, паяем макет:
и проверяем в работе. Калибровка заключается в установке стрелок подстроечниками на максимальное деление шкалы при передаче в порт значения 255. С железом все.
Программа
Сложнее всего оказалось найти драйвер для работы с LPT (Win 8 х64). После нескольких часов поисков я наконец нашел DLPortIO (драйвер + библиотека) 32 бит, но с инструкцией по установке в 64-битные системы. Ссылку, к сожалению, уже потерял, лишь сохранил себе на Яндекс.Диск.
Дальше — проще. Через полчаса программа на Delphi (единственное, что еще как-то помню со времен учебы) была написана:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MemStatus.dwLength := sizeof( TMemoryStatus );
GlobalMemoryStatus( MemStatus );
MemVal := round(15*MemStatus.dwMemoryLoad/100) shl 4; //верхние 4 бита - память, нижние - CPU
CPUUsage3:= CPUUsage2; //небольшое
CPUUsage2:= CPUUsage1; //сглаживание
CPUUsage1:= CPUUsage; //
CPUUsage := 0;
CollectCPUData;
for i:= 0 to GetCPUCount - 1 do begin
CPUUsage:= CPUUsage + GetCPUUsage(i);
end;
CPUUsage:= CPUUsage / GetCPUCount;
CPUUsage:= (CPUUsage + CPUUsage1 + CPUUsage2 + CPUUsage3)/4; //небольшое сглаживание
CPUVal := Round(15 * CPUUsage);
CPUVal := CPUVal or MemVal;
DlPortWritePortUchar (888, CPUVal);
end;
Два раза в секунду читаются значения загрузки RAM и CPU и отправляются в порт &H378. В комментариях к оригинальной статье был вопрос про то, сколько ресурсов кушает программа, показывающая загрузку ресурсов. Отвечаю: согласно диспетчеру задач загрузки процессора более 0% не было, а вот памяти — 956к (тут бы руки мне оторвать: я пошел простейшим путем, у меня создается форма, а потом она скрывается. Ничего, еще доберусь до оптимизации и поправлю).
Точность в первой половине шкалы хромает, чем ближе к 100% — тем точнее.
Корпуса нет и не планируется, пусть себе лежат на мониторе. Подсветки нет, но планируется. Думаю откуда запитать. Конструкция носит скорее эстетический характер плюс удовольствие от сделанного/собранного/спаянного лично, а ведь это бесценно.
Напоследок небольшое видео:
Спасибо за внимание, желаю и Вам найти в шкафу стрелочный индикатор.
Автор: Sergey_Morozov