printf打印的字符串顯示不同顏色-測試代碼

printf打印的字符串顯示不同顏色:https://www.cnblogs.com/jikexianfeng/p/13807231.html

ubuntu@ubuntu:~/code/log$ tree
.
├── main
├── main.c
├── user_lcd_log.c
└── user_lcd_log.h

0 directories, 4 files

main.c

// ----------------------------------------------------------------------------------
# include <stdio.h>
# include "user_lcd_log.h"
// ----------------------------------------------------------------------------------
void main(void){
    // 配置使能
    set_Status_record_value(lcd_code_log_options_Hardware_data|lcd_code_log_options_Initialization_data|lcd_code_log_options_Filter_data|lcd_code_log_options_AT_Parsing|lcd_code_log_options_Type_conversion|lcd_code_log_options_Update_interface|lcd_code_log_options_Output_interface|lcd_code_log_options_Deconstruct);
    // 輸出
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Hardware_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Initialization_data|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Filter_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_AT_Parsing|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Type_conversion|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Deconstruct|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Update_interface|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
    log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Output_interface|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal));
}

user_lcd_log.h

#ifndef __USER_LCD_LOG__H__
#define __USER_LCD_LOG__H__

// ----------------------------------------------------------------------------------
// 01是高亮度,不寫是低亮度。
// 40是背景色,40:黑,41:紅:42:綠,43:黃,44:青,45:藍,47:白。
// 32m是前景色:30:黑,31:紅,32:綠,33:黃,34:藍,35:紫,36:青,37:白。
// ----------------------------------------------------------------------------------
// printf
# define system_printf                          "printf "   // printf
// head
# define properties_head                        "\"\\033[" // 數據頭
// 添加分號
# define Control_code_add_semicolon             ";"       // 拼接
// 添加尾
# define Control_code_con_end                   "m"       // 拼接
//
# define Control_code_terminal_end              "\n\""              // 尾部
# define Control_code_file_end                  "\n>>output.txt"  // 尾部
// Control code
# define Control_code_Close_all_properties      0       // 清空all屬性
# define Control_code_brightness_High           1       // 設置高亮度
# define Control_code_Italic                    3       // 設置斜體
# define Control_code_Underscore                4       // 設置下劃線
# define Control_code_Flashing                  5       // 設置閃爍
# define Control_code_Reverse                   7       // 設置返現
# define Control_code_Blanking                  8       // 設置消隱
# define Control_code_Strikethrough_text        9       // 設置文本刪除線
# define Control_code_Double_underscore         21      // 設置雙下劃線
// 字體顏色設置
# define Control_code_Font_color_black          30      // 設置字體顏色黑色
# define Control_code_Font_color_red            31      // 設置字體顏色紅色
# define Control_code_Font_color_green          32      // 設置字體顏色綠色
# define Control_code_Font_color_yellow         33      // 設置字體顏色黃色
# define Control_code_Font_color_blue           34      // 設置字體顏色藍色
# define Control_code_Font_color_purple         35      // 設置字體顏色紫色
# define Control_code_Font_color_Dark_green     36      // 設置字體顏色深綠
# define Control_code_Font_color_gray           37      // 設置字體顏色灰白
// 背景顏色設置
# define Control_code_background_color_black        40      // 設置背景顏色黑色
# define Control_code_background_color_red          41      // 設置背景顏色紅色
# define Control_code_background_color_green        42      // 設置背景顏色綠色
# define Control_code_background_color_yellow       43      // 設置背景顏色黃色
# define Control_code_background_color_blue         44      // 設置背景顏色藍色
# define Control_code_background_color_purple       45      // 設置背景顏色紫色
# define Control_code_background_color_Dark_green   46      // 設置背景顏色深綠
# define Control_code_background_color_gray         47      // 設置背景顏色灰白
// ----------------------------------------------------------------------------------
# define par_type       long
// ----------------------------------------------------------------------------------
// 流程
# define lcd_code_log_options_Hardware_data         0x0001    // lcd硬件數據
# define lcd_code_log_options_Initialization_data   0x0002    // 數據初始化
# define lcd_code_log_options_Filter_data           0x0004    // 數據過濾
# define lcd_code_log_options_AT_Parsing            0x0008    // 指令解析
# define lcd_code_log_options_Type_conversion       0x0010    // 數據類型轉換
# define lcd_code_log_options_Deconstruct           0x0020    // 解字模
# define lcd_code_log_options_Update_interface      0x0040    // 刷界面 Interface
# define lcd_code_log_options_Output_interface      0x0080    // 輸出 Interface
// 日報位置狀態
# define lcd_code_log_options_tatus_conventional    0X0100  // 日報狀態正常
# define lcd_code_log_options_tatus_Warning         0x0200  // 日報狀態異常
// 輸出位置狀態
# define lcd_code_log_options_terminal              0X1000  // 輸出到終端
# define lcd_code_log_options_file                  0x2000  // 輸出到文件
// ----------------------------------------------------------------------------------
void set_Status_record_value(unsigned int Status_value);                // 配置
void log_Debug_Message_output(par_type sbuf_addr,unsigned int mode);
// ----------------------------------------------------------------------------------

#endif

user_lcd_log.c

// ----------------------------------------------------------------------------------
# include <stdio.h>
# include <string.h>
# include <time.h>
# include <stdlib.h>
# include "user_lcd_log.h"
// ----------------------------------------------------------------------------------
struct Debug_Message_data{
    unsigned long logo_out_Sign;
    unsigned int  length;
    unsigned char logo_out_sbus[4096];
};
// ----------------------------------------------------------------------------------
// 清除調試數據
void Clean_Debug_Message_Module_data(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    Debug_Message->logo_out_Sign = 0;
    Debug_Message->length = 0;
    memset((void*)Debug_Message->logo_out_sbus,0,4096);
}
// printf
void log_Debug_Message_Module_add_printf(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&(Debug_Message->logo_out_sbus[Debug_Message->length]),"%s",system_printf);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}

// 添加數據頭
void log_Debug_Message_Module_add_head(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&(Debug_Message->logo_out_sbus[Debug_Message->length]),"%s",properties_head);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加參數
void log_Debug_Message_Module_add_data(par_type Debug_data_addr,char parameter){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%d",parameter);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加分號
void log_Debug_Message_Module_code_semicolon(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_add_semicolon);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加尾部
void log_Debug_Message_Module_code_end(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_con_end);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加時間
void log_Debug_Message_Module_add_Time(par_type Debug_data_addr,par_type label_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    char * label = (char *)label_addr;
    time_t t_time;
    struct tm *tm_time;
    // 時間轉換
    t_time = time(NULL);
    tm_time = localtime(&t_time);
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%4d:%02d:%02d-%02d:%02d:%02d -- %s:",1900+tm_time->tm_year,tm_time->tm_mon,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec,label);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加字符串
void log_Debug_Message_Module_add_string(par_type Debug_data_addr,unsigned char * data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",data_addr);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加尾部 output終端
void log_Debug_Message_Module_terminal_end(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_terminal_end);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加尾部 output 文件output.txt
void log_Debug_Message_Module_file_end(par_type Debug_data_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_file_end);
    Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// ----------------------------------------------------------------------------------
void printfss(par_type Debug_data_addr){
    int count = 0;
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
    for(count = 0; count < 4096;count++){
        printf("%c",Debug_Message->logo_out_sbus[count]);
    }
}
// ----------------------------------------------------------------------------------
// 正常日報
void log_Debug_Message_conventional_output(par_type Debug_Message_addr,par_type label_addr,par_type sbuf_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
    char * sbuf = (char *)sbuf_addr;
    unsigned int Output_Sign = (Debug_Message->logo_out_Sign)&0xf000;
    Clean_Debug_Message_Module_data(Debug_Message_addr);                                        // 清理數據
    log_Debug_Message_Module_add_printf(Debug_Message_addr);                                    // 添加指令printf
    log_Debug_Message_Module_add_head(Debug_Message_addr);                                      // 添加數據頭
    log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_black);        // 添加參數
    log_Debug_Message_Module_code_end(Debug_Message_addr);                                      // 添加尾部
    log_Debug_Message_Module_add_Time(Debug_Message_addr,label_addr);                           // 添加時間
    log_Debug_Message_Module_add_string(Debug_Message_addr,sbuf);                               // 添加字符串
     switch(Output_Sign){                                                                       // 文件存儲位置
        case lcd_code_log_options_terminal:{log_Debug_Message_Module_terminal_end(Debug_Message_addr);}break;
        case lcd_code_log_options_file:{log_Debug_Message_Module_file_end(Debug_Message_addr);}break;
        default:{;}break;
    }
    system((const char *)(Debug_Message->logo_out_sbus));                                       // 輸出日誌
}
// 警告日報
void log_Debug_Message_Warning_output(par_type Debug_Message_addr,par_type label_addr,par_type sbuf_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
    char * sbuf = (char *)sbuf_addr;
    unsigned int Output_Sign = (Debug_Message->logo_out_Sign)&0xf000;
    Clean_Debug_Message_Module_data(Debug_Message_addr);                                        // 清理數據
    log_Debug_Message_Module_add_printf(Debug_Message_addr);                                    // 添加指令printf
    log_Debug_Message_Module_add_head(Debug_Message_addr);                                      // 添加數據頭
    log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_brightness_High);         // 添加參數
    log_Debug_Message_Module_code_semicolon(Debug_Message_addr);                                // 添加分號
    log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_red);          // 添加參數
    log_Debug_Message_Module_code_end(Debug_Message_addr);                                      // 添加尾部
    log_Debug_Message_Module_add_Time(Debug_Message_addr,label_addr);                           // 添加時間
    log_Debug_Message_Module_add_string(Debug_Message_addr,sbuf);                               // 添加字符串
    switch(Output_Sign){                                                                       // 文件存儲位置
        case lcd_code_log_options_terminal:{log_Debug_Message_Module_terminal_end(Debug_Message_addr);}break;
        case lcd_code_log_options_file:{log_Debug_Message_Module_file_end(Debug_Message_addr);}break;
        default:{;}break;
    }
    system((const char *)(Debug_Message->logo_out_sbus));                                       // 輸出日誌
}
// ----------------------------------------------------------------------------------
// lcd硬件數據
# define log_conventional_lcd_hardware_data(Debug_Message_addr,sbuf_addr)           log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"硬件數據",sbuf_addr)        // 正常日報
# define log_Warning_lcd_hardware_data(Debug_Message_addr,sbuf_addr)                log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"硬件數據",sbuf_addr)             // 警告日報
// 數據初始化
# define log_conventional_Data_initialization(Debug_Message_addr,sbuf_addr)         log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"數據初始",sbuf_addr)        // 正常日報
# define log_Warning_Data_initialization(Debug_Message_addr,sbuf_addr)              log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"數據初始",sbuf_addr)             // 警告日報
// 數據過濾
# define log_conventional_lcd_Data_filtering(Debug_Message_addr,sbuf_addr)          log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"數據過濾",sbuf_addr)        // 正常日報
# define log_Warning_lcd_Data_filtering(Debug_Message_addr,sbuf_addr)               log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"數據過濾",sbuf_addr)             // 警告日報
// 指令解析
# define log_conventional_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr)    log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"指令解析",sbuf_addr)        // 正常日報
# define log_Warning_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr)         log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"指令解析",sbuf_addr)             // 警告日報
// 數據類型轉換
# define log_conventional_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr)    log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"編碼轉換",sbuf_addr)        // 正常日報
# define log_Warning_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr)         log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"編碼轉換",sbuf_addr)             // 警告日報
// 解字模
# define log_conventional_lcd_Deconstruct(Debug_Message_addr,sbuf_addr)             log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"解析字模",sbuf_addr)        // 正常日報
# define log_Warning_lcd_Deconstruct(Debug_Message_addr,sbuf_addr)                  log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"解析字模",sbuf_addr)             // 警告日報
// 刷界面 Update Interface
# define log_conventional_lcd_Update_Interface(Debug_Message_addr,sbuf_addr)        log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"刷新界面",sbuf_addr)        // 正常日報
# define log_Warning_lcd_Update_Interface(Debug_Message_addr,sbuf_addr)             log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"刷新界面",sbuf_addr)             // 警告日報
// 輸出界面 Interface
# define log_conventional_lcd_output_Interface(Debug_Message_addr,sbuf_addr)        log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"輸出界面",sbuf_addr)        // 正常日報
# define log_Warning_lcd_output_Interface(Debug_Message_addr,sbuf_addr)             log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"輸出界面",sbuf_addr)             // 警告日報
// ----------------------------------------------------------------------------------
// 配置使能
unsigned int Status_record_value;
void set_Status_record_value(unsigned int Status_value){
    Status_record_value = Status_value;
}
// 正常
void log_Debug_Message_Module_conventional_Process_Sign(par_type Debug_Message_addr,par_type sbuf_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
    unsigned int Process_Sign = (Debug_Message->logo_out_Sign)&0x00ff;                                                      // 流程
    switch(Process_Sign&Status_record_value){
        case lcd_code_log_options_Hardware_data:{log_conventional_lcd_hardware_data(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Initialization_data:{log_conventional_Data_initialization(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Filter_data:{log_conventional_lcd_Data_filtering(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_AT_Parsing:{log_conventional_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Type_conversion:{log_conventional_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Deconstruct:{log_conventional_lcd_Deconstruct(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Update_interface:{log_conventional_lcd_Update_Interface(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Output_interface:{log_conventional_lcd_output_Interface(Debug_Message_addr,sbuf_addr);}break;
        default :{;}break;
    }
}
// 警告日報
void log_Debug_Message_Module_Warning_Process_Sign(par_type Debug_Message_addr,par_type sbuf_addr){
    struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
     unsigned int Process_Sign = (Debug_Message->logo_out_Sign)&0x00ff;                                                      // 流程
    switch(Process_Sign&Status_record_value){
        case lcd_code_log_options_Hardware_data:{log_Warning_lcd_hardware_data(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Initialization_data:{log_Warning_Data_initialization(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Filter_data:{log_Warning_lcd_Data_filtering(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_AT_Parsing:{log_Warning_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Type_conversion:{log_Warning_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Deconstruct:{log_Warning_lcd_Deconstruct(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Update_interface:{log_Warning_lcd_Update_Interface(Debug_Message_addr,sbuf_addr);}break;
        case lcd_code_log_options_Output_interface:{log_Warning_lcd_output_Interface(Debug_Message_addr,sbuf_addr);}break;
        default :{;}break;
    }
}
// ----------------------------------------------------------------------------------
void log_Debug_Message_output(par_type sbuf_addr,unsigned int mode){
    struct Debug_Message_data Debug_Message;
    unsigned int status_Sign = mode&0x0f00;
    Debug_Message.logo_out_Sign = mode;
    // 日誌
    switch(status_Sign){
        case lcd_code_log_options_tatus_conventional:{
            log_Debug_Message_Module_conventional_Process_Sign((par_type)(&Debug_Message),sbuf_addr);  // 正常
        }break;
        case lcd_code_log_options_tatus_Warning:{
            log_Debug_Message_Module_Warning_Process_Sign((par_type)(&Debug_Message),sbuf_addr);       // 異常
        }break;
        default :{log_Debug_Message_Warning_output((par_type)&Debug_Message,(par_type)"logo Warning",(par_type)"status_Sign Parameter error");}break;
    }
}
// ----------------------------------------------------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章