【PC編「2020-07-04★ソースコードリリース」と】「★CPUメータ@LINUX」と私
と題しまして小話を1つ。
以下のイメージのものが、ようやくできました。
質問は”なし”でお願いします。
BLOGに ソースコードを載せるとコードが勝手に全角になったりしますが、
ソースコードは、半角英数字 ですので、気をつけてください。
(COPY&PASTEしたあと、強制的に何かの手段で全角英数字を半角に変換するか
ソースコードを印刷して 入力し直すか・・・)
ー>ざっとみたところ、半角英数字の記載がほぼ、全滅ではないかと思われます。
ー>BLOGから単純にCOPY&PASTEして、コンパイルすると
ー>意味不明のエラーコードの洪水に見舞われる可能性が高いです。
BLOGにCOPY&PASTEしたとたん、キレイにしていたインデントが一瞬でパーになりました。
途中までインデントをいれてましたが、めげてやめました。
全角、半角だけ気をつけていただければ、コンパイルはできると思います。
<追記>PRINTF文の書式について
(1)個々の数字は、半角空白1つと%2dで表示
(2)空白部分は3バイトの空白を” ”で表示
適当な".c"で終わるC言語のファイル名でSAVEした後、
全角があればすべて半角になおしていただき
問題なさそうなら。 gcc ファイル名.c -o ファイル名
としていただければ、実行モジュールができると思います。
<「縦」表示モード>
<「横」表示モード>
#include <stdio.h>
#include <stdlib.h>
/*****************************************/
/*2020.07/04 */
/* Reference ESCAPE SEQUENCE SITE
http://7ujm.net/etc/esc.html */
/*COLOR SETTINGS */
#define SET_BLACK printf("\033[30m")
#define SET_RED printf("\033[31m")
#define SET_GREEN printf("\033[32m")
#define SET_YELLOW printf("\033[33m")
#define SET_BLUE printf("\033[34m")
#define SET_MAZENTA printf("\033[35m")
#define SET_CYAN printf("\033[36m")
#define SET_WHTIE printf("\033[37m")
#define SET_DEFAULT printf("\033[39m")
#include <stdlib.h>
/*****************************************/
/*2020.07/04 */
/* Reference ESCAPE SEQUENCE SITE
http://7ujm.net/etc/esc.html */
/*COLOR SETTINGS */
#define SET_BLACK printf("\033[30m")
#define SET_RED printf("\033[31m")
#define SET_GREEN printf("\033[32m")
#define SET_YELLOW printf("\033[33m")
#define SET_BLUE printf("\033[34m")
#define SET_MAZENTA printf("\033[35m")
#define SET_CYAN printf("\033[36m")
#define SET_WHTIE printf("\033[37m")
#define SET_DEFAULT printf("\033[39m")
#define CLS printf("\033[2J")
#define SET_BLACK_BACK printf("\033[40m")
#define SET_RED_BACK printf("\033[41m")
#define SET_GREEN_BACK printf("\033[42m")
#define SET_BACK_DEFAULT printf("\033[49m")
#define SET_RED_BACK printf("\033[41m")
#define SET_GREEN_BACK printf("\033[42m")
#define SET_BACK_DEFAULT printf("\033[49m")
#define RESET_CURSOR printf("\033[1;1H")
/*****************************************/
int GetNumOfCORE(void);
void DisplayLevelBAR(int,int, float *);
void DisplayLevelBAR1(int, float *);
void DisplayLevelBAR2(int, float *);
int ReadFreqDataFromPIPE(int, float *);
/*****************************************/
int GetNumOfCORE(void);
void DisplayLevelBAR(int,int, float *);
void DisplayLevelBAR1(int, float *);
void DisplayLevelBAR2(int, float *);
int ReadFreqDataFromPIPE(int, float *);
/************************/
/*Get Num of CPU CORE's */
/************************/
int GetNumOfCORE(){
FILE *fp;
int NUMCORE;
/*Get Num of CPU CORE's */
/************************/
int GetNumOfCORE(){
FILE *fp;
int NUMCORE;
/*OPEN PIPE AS READ MODE */
fp = popen("grep \"cpu MHz\" /proc/cpuinfo | wc -l", "r");
if (fp == (FILE *) NULL) {
SET_RED_BACK;
printf("[%s:%d]PIPE for COUNT CORE's Open Failed\n",
__FILE__, __LINE__);
exit(1);
}
/*GET NUM OF CORE */
fscanf(fp, "%d", &NUMCORE);
fp = popen("grep \"cpu MHz\" /proc/cpuinfo | wc -l", "r");
if (fp == (FILE *) NULL) {
SET_RED_BACK;
printf("[%s:%d]PIPE for COUNT CORE's Open Failed\n",
__FILE__, __LINE__);
exit(1);
}
/*GET NUM OF CORE */
fscanf(fp, "%d", &NUMCORE);
/*CLOSE PIPE */
pclose(fp);
pclose(fp);
printf("[%s:%d:GetNumOfCORE]NumOfCore = %d\n",
__FILE__, __LINE__, NUMCORE);
__FILE__, __LINE__, NUMCORE);
/*RETURN*/ return (NUMCORE);
} /*end of GetNumOfCORE */
/*****************************/
/* DISPLAY LEVEL BAR */
/*****************************/
void DisplayLevelBAR(int mode, int NUMCORE,float *data){
switch (mode){
case 1: DisplayLevelBAR1(NUMCORE,data);break;
case 2: DisplayLevelBAR2(NUMCORE,data);break;
default: DisplayLevelBAR1(NUMCORE,data);break;
}
}
/* DISPLAY LEVEL BAR */
/*****************************/
void DisplayLevelBAR(int mode, int NUMCORE,float *data){
switch (mode){
case 1: DisplayLevelBAR1(NUMCORE,data);break;
case 2: DisplayLevelBAR2(NUMCORE,data);break;
default: DisplayLevelBAR1(NUMCORE,data);break;
}
}
#define GYOU_SIZE (13)
#define RETSU_SIZE (61)
void DisplayLevelBAR2(int NUMCORE, float *data)
{
static int A[GYOU_SIZE][RETSU_SIZE];/*ATTRIBUTE ARRAY*/
int i ;/*NUMOFCORE*/
int j ;/*LEVEL BAR */
static int val2[128];/*MAX 128 PROCESSORS*/
/*INITIALIZE GAMEN ARRAY DATA*/
for(i=0;i<GYOU_SIZE;i++){
for(j=0;j<RETSU_SIZE;j++) A[i][j]= -1;/*SPACE */
}
/*WRITE LEVEL DATA TO ARRAY*/
/*ASSGNING -1 IS SPACE ,OTHER IS REAL FREQ INFO*/
#define OFFSET_GHZ (34)
for(i=0;i<NUMCORE;i++){
val2[i] = (int)(data[i]/100.0);/*MEMORIZE GHz TO %2d ARRAY*/
int val3 = (int)val2[i] - OFFSET_GHZ ; /*GHz - 34GHz*/
for(j=0;j<val3;j++) A[j][i] = val2[i];
}
/*DISPLAY CHAR GRAPHIC IMAGE */
SET_GREEN_BACK;
RESET_CURSOR;
CLS;
SET_RED;
/**PRINT HEADER*/ ★以下のプリント文は全部半角でOK
printf(
" +------------------------------------------------------------------------+\n");
#define RETSU_SIZE (61)
void DisplayLevelBAR2(int NUMCORE, float *data)
{
static int A[GYOU_SIZE][RETSU_SIZE];/*ATTRIBUTE ARRAY*/
int i ;/*NUMOFCORE*/
int j ;/*LEVEL BAR */
static int val2[128];/*MAX 128 PROCESSORS*/
/*INITIALIZE GAMEN ARRAY DATA*/
for(i=0;i<GYOU_SIZE;i++){
for(j=0;j<RETSU_SIZE;j++) A[i][j]= -1;/*SPACE */
}
/*WRITE LEVEL DATA TO ARRAY*/
/*ASSGNING -1 IS SPACE ,OTHER IS REAL FREQ INFO*/
#define OFFSET_GHZ (34)
for(i=0;i<NUMCORE;i++){
val2[i] = (int)(data[i]/100.0);/*MEMORIZE GHz TO %2d ARRAY*/
int val3 = (int)val2[i] - OFFSET_GHZ ; /*GHz - 34GHz*/
for(j=0;j<val3;j++) A[j][i] = val2[i];
}
/*DISPLAY CHAR GRAPHIC IMAGE */
SET_GREEN_BACK;
RESET_CURSOR;
CLS;
SET_RED;
/**PRINT HEADER*/ ★以下のプリント文は全部半角でOK
printf(
" +------------------------------------------------------------------------+\n");
/**PRINT GHz TAG*/ ★怪しいので半角で打ち直してください。
printf(
"[GHz] |\n");
"[GHz] |\n");
/////////////////////////////////////////////////////////////////////////////////////////////////////
//★注意★
//以下のマクロの文字●、■は半角ではなく全角です。
//ので、COPY&PASTEされた場合は、再入力が必要です。
#define CIRCLE "○ "
#define DOUBLE_CIRCLE "◎ "
#define FILLED_CIRCLE "●a"
#define FILLED_RECT "■k"
#define CIRCLE "○ "
#define DOUBLE_CIRCLE "◎ "
#define FILLED_CIRCLE "●a"
#define FILLED_RECT "■k"
////////////////////////////////////////////////////////////////////////////////////////////////////
int flag=1;/*CTRL FLAG*/
float fval=4.6;/*MAX GHz*/
#define MAXFREQ_RANGE (12)
for(int i=MAXFREQ_RANGE;i>=0;i--){
SET_RED;
printf("%1.1fG|",fval);
for(j=0;j<NUMCORE;j++){
switch(A[i][j]){
case 35:
case 36:
case 37:SET_CYAN;
printf(" %2s",FILLED_RECT);
break;
case 38:
case 39:SET_YELLOW;
printf(" %2s",FILLED_RECT);
break;
case 40:
case 41:
case 43:SET_MAZENTA;
printf(" %2s",FILLED_RECT);
break;
case 44:
case 45:
case 46:SET_RED;
printf(" %2s",FILLED_RECT);
break;
case -1:/*SPACE */
/* NEXT COLUMN IS NOT -1 THEN DISPLAY GHZ*/
#ifdef OLD
int flag=1;/*CTRL FLAG*/
float fval=4.6;/*MAX GHz*/
#define MAXFREQ_RANGE (12)
for(int i=MAXFREQ_RANGE;i>=0;i--){
SET_RED;
printf("%1.1fG|",fval);
for(j=0;j<NUMCORE;j++){
switch(A[i][j]){
case 35:
case 36:
case 37:SET_CYAN;
printf(" %2s",FILLED_RECT);
break;
case 38:
case 39:SET_YELLOW;
printf(" %2s",FILLED_RECT);
break;
case 40:
case 41:
case 43:SET_MAZENTA;
printf(" %2s",FILLED_RECT);
break;
case 44:
case 45:
case 46:SET_RED;
printf(" %2s",FILLED_RECT);
break;
case -1:/*SPACE */
/* NEXT COLUMN IS NOT -1 THEN DISPLAY GHZ*/
#ifdef OLD
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//レベルバーの上に周波数を2桁の整数値で入れるべく工事中です。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(A[i-1][j] != -1 && flag !=0){
printf(" %2d",A[i-1][j]);
flag = 0;
}else printf(" ");
break;
if(A[i-1][j] != -1 && flag !=0){
printf(" %2d",A[i-1][j]);
flag = 0;
}else printf(" ");
break;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
#endif
default:printf(" ");break;
}/*End of switch*/
}/*End of for */
SET_RED;
printf("|\n");/*End of LINE*/
fval = fval - (0.1);
}/*End of for */
SET_RED;
/**PRINT FUTTER*/
printf(
" +---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n");
printf(
"[CPU] 00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|\n");
}/*End of function*/
}/*End of switch*/
}/*End of for */
SET_RED;
printf("|\n");/*End of LINE*/
fval = fval - (0.1);
}/*End of for */
SET_RED;
/**PRINT FUTTER*/
printf(
" +---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n");
printf(
"[CPU] 00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|\n");
}/*End of function*/
void DisplayLevelBAR1(int NUMCORE, float *data)
{
/* READ FROM ARRAY AND DISPLAY */
for (int j = 0; j < NUMCORE; j++) {
int val = (int)(data[j]);
int val2 = *1 == -1) {
SET_RED_BACK;
printf("[%s:%d] GetNumOfCORE Failed\n",
__FILE__, __LINE__);
exit(1);
}
{
/* READ FROM ARRAY AND DISPLAY */
for (int j = 0; j < NUMCORE; j++) {
int val = (int)(data[j]);
int val2 = *1 == -1) {
SET_RED_BACK;
printf("[%s:%d] GetNumOfCORE Failed\n",
__FILE__, __LINE__);
exit(1);
}
while (1) {
/* CLEAR SCREEN and RESET CURSOR */
SET_BLACK_BACK;
CLS;
RESET_CURSOR;
/* CLEAR SCREEN and RESET CURSOR */
SET_BLACK_BACK;
CLS;
RESET_CURSOR;
/* READ FROM PIPE to ARRAY */
ReadFreqDataFromPIPE(NUMCORE, data);
ReadFreqDataFromPIPE(NUMCORE, data);
/* READ FROM ARRAY AND DISPLAY */
DisplayLevelBAR(2,NUMCORE, data);
DisplayLevelBAR(2,NUMCORE, data);
/*WAIT*/
system("sleep 2");
}/*End of while */
}/* End of main */
}/* End of main */
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
現状の最新のソースコードは、以上でございます。
コメント以外は、半角英数字です。もし、COPY&PASTEされる場合は、
英数字が勝手に全角になってないか確認ください。
いらぬ コンパイルエラーにみまわれ、ドツボにはまります。
MAIN関数の引数で、縦表示、横表示を切り替えようかと思いましたが、
めんどくさくなったので、現状は横表示に固定しております。
DisplayLevelBAR関数の一番目の引数が”1”の時は横、”2”のときは縦になります。
レベルバーの上に、周波数値を2桁の整数で表示してやろうと思ったのですが、
まだ、工事中で#ifdef OLD 〜 #endif で囲ってあります。
300行弱になりましたが
われこそは!と思われる方は
COPY&PASTEでコンパイルに挑戦してみてください。
質問はうけつけません。
では・・また・・:_;)/
*1:int)(val+50) /100);
if (val2 < 36) { /*LOWER 3.6GHz */
SET_CYAN;
} else if (val2 < 39) { /*LOWER 3.8GHz */
SET_BLUE;
} else {
SET_RED;
}
/*PRINT BASE CORE and GHz INFO */
printf("CORE[%2d] %4d[MHz]", j, val);
SET_CYAN;
} else if (val2 < 39) { /*LOWER 3.8GHz */
SET_BLUE;
} else {
SET_RED;
}
/*PRINT BASE CORE and GHz INFO */
printf("CORE[%2d] %4d[MHz]", j, val);
/*PRINT LEVEL BAR INFO */
switch (val2) {
case 30: printf("\n"); break;
case 31: printf("\n"); break;
case 33: printf("\n"); break;
case 34: printf("\n"); break;
case 35: printf("\n"); break;
case 36: printf(":\n"); break;
case 37: printf("::\n"); break;
case 38: printf(":::\n"); break;
case 39: printf("::::\n"); break;
case 40: printf("=====\n"); break;
case 41: printf("======\n"); break;
case 42: printf("=======\n"); break;
case 43: printf("********X\n"); break;
case 44: printf("*********X\n"); break;
case 45: printf("**********X\n"); break;
case 46: printf("@@@@@@@@@@@X\n"); break;
default: printf("\n"); break;
}/*End of switch */
}/*End of for */
return;
}/* end of Fuction */
switch (val2) {
case 30: printf("\n"); break;
case 31: printf("\n"); break;
case 33: printf("\n"); break;
case 34: printf("\n"); break;
case 35: printf("\n"); break;
case 36: printf(":\n"); break;
case 37: printf("::\n"); break;
case 38: printf(":::\n"); break;
case 39: printf("::::\n"); break;
case 40: printf("=====\n"); break;
case 41: printf("======\n"); break;
case 42: printf("=======\n"); break;
case 43: printf("********X\n"); break;
case 44: printf("*********X\n"); break;
case 45: printf("**********X\n"); break;
case 46: printf("@@@@@@@@@@@X\n"); break;
default: printf("\n"); break;
}/*End of switch */
}/*End of for */
return;
}/* end of Fuction */
/**************************/
/*READ FREQ DATA FROM PIPE*/
/**************************/
int ReadFreqDataFromPIPE(int NUMCORE, float *data)
{
FILE *fp = (FILE *) NULL;
/*READ FREQ DATA FROM PIPE*/
/**************************/
int ReadFreqDataFromPIPE(int NUMCORE, float *data)
{
FILE *fp = (FILE *) NULL;
/*OPEN PIPE as RESULT OF "grep command" OUTPUT */
fp = popen("grep \"cpu MHz\" /proc/cpuinfo", "r");
if (fp == (FILE *) NULL) {
SET_RED_BACK;
printf("[%s:%d] PIPE Open Failed \n", __FILE__, __LINE__);
system("date");
return (-1);
}
/* READ DATA FROM PIPE */
for (int j = 0; j < NUMCORE; j++) {
fscanf(fp, "cpu MHz : %f ", &data[j]);
}
/*CLOSE PIPE */
pclose(fp);
/* FINISHED */
return (0);
}
fp = popen("grep \"cpu MHz\" /proc/cpuinfo", "r");
if (fp == (FILE *) NULL) {
SET_RED_BACK;
printf("[%s:%d] PIPE Open Failed \n", __FILE__, __LINE__);
system("date");
return (-1);
}
/* READ DATA FROM PIPE */
for (int j = 0; j < NUMCORE; j++) {
fscanf(fp, "cpu MHz : %f ", &data[j]);
}
/*CLOSE PIPE */
pclose(fp);
/* FINISHED */
return (0);
}
/***************/
/*main function*/
/***************/
void main()
{
FILE *fp;
float data[128];
int NUMCORE = -1;
/*main function*/
/***************/
void main()
{
FILE *fp;
float data[128];
int NUMCORE = -1;
if ((NUMCORE = GetNumOfCORE(