Code:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#define ALL_NORMAL "\033[0m"
#define FG_BLACK "\033[22;30m" // dark colours
#define FG_MAROON "\033[22;31m"
#define FG_GREEN "\033[22;32m"
#define FG_OLIVE "\033[22;33m"
#define FG_NAVY "\033[22;34m"
#define FG_PURPLE "\033[22;35m"
#define FG_TEAL "\033[22;36m"
#define FG_SILVER "\033[22;37m"
#define FG_GRAY "\033[1;30m" // light colours
#define FG_RED "\033[1;31m"
#define FG_LIME "\033[1;32m"
#define FG_YELLOW "\033[1;33m"
#define FG_BLUE "\033[1;34m"
#define FG_FUCHSIA "\033[1;35m"
#define FG_AQUA "\033[1;36m"
#define FG_WHITE "\033[1;37m"
#define BG_BLACK "\033[40m"
#define BLACKBACK BG_BLACK " " ALL_NORMAL
#define MAGENTA FG_FUCHSIA BG_BLACK "#" ALL_NORMAL
#define CYAN FG_TEAL BG_BLACK "#" ALL_NORMAL
#define RED FG_RED BG_BLACK "#" ALL_NORMAL
#define YELLOW FG_YELLOW BG_BLACK "#" ALL_NORMAL
#define BRIGHT_RED BG_BLACK FG_RED "M" ALL_NORMAL
#define BRIGHT_GREEN BG_BLACK FG_LIME "E" ALL_NORMAL
#define BRIGHT_YELLOW BG_BLACK FG_YELLOW "R" ALL_NORMAL
#define BRIGHT_BLUE BG_BLACK FG_BLUE "R" ALL_NORMAL
#define BRIGHT_MAGENTA BG_BLACK FG_FUCHSIA "Y" ALL_NORMAL
#define BRIGHT_MAGENTA2 BG_BLACK FG_FUCHSIA "X" ALL_NORMAL
#define BRIGHT_CYAN BG_BLACK FG_AQUA "M" ALL_NORMAL
#define BRIGHT_WHITE BG_BLACK FG_WHITE "A" ALL_NORMAL
#define BRIGHT_RED2 BG_BLACK FG_RED "S" ALL_NORMAL
#define DIM_RED BG_BLACK FG_MAROON "M" ALL_NORMAL
#define DIM_GREEN BG_BLACK FG_GREEN "E" ALL_NORMAL
#define DIM_YELLOW BG_BLACK FG_OLIVE "R" ALL_NORMAL
#define DIM_BLUE BG_BLACK FG_NAVY "R" ALL_NORMAL
#define DIM_MAGENTA BG_BLACK FG_PURPLE "Y" ALL_NORMAL
#define DIM_MAGENTA2 BG_BLACK FG_PURPLE "X" ALL_NORMAL
#define DIM_CYAN BG_BLACK FG_TEAL "M" ALL_NORMAL
#define DIM_WHITE BG_BLACK FG_SILVER "A" ALL_NORMAL
#define DIM_RED2 BG_BLACK FG_MAROON "S" ALL_NORMAL
/********************************************************/
/* */
/* Flashing XMAS Sign. */
/* */
/* */
/* */
/* */
/* */
/* gemera 24th Dec 2012 */
/* */
/********************************************************/
#define COLS 80
#define ROWS 25
#define START_X 8 // x start position of sign
#define START_Y 9 // y start position of sign
void set_coord(int x, int y);
void plot_char(int x,int y,char *colour);
void* tinsel_func(void * id);
void sleep_seconds(long seconds);
pthread_mutex_t mutex1;
int main(void)
{
int x,y;
pthread_t thread1;
pthread_mutex_init(&mutex1,NULL);
srand(time(NULL));
system("clear");
system("setterm -cursor off");
pthread_create(&thread1,NULL,&tinsel_func,NULL);
while(1)
{
pthread_mutex_lock(&mutex1);
plot_char(START_X,START_Y,BRIGHT_RED);
plot_char(START_X+16,START_Y,BRIGHT_GREEN);
plot_char(START_X+32,START_Y,BRIGHT_YELLOW);
plot_char(START_X+48,START_Y,BRIGHT_BLUE);
plot_char(START_X+64,START_Y,BRIGHT_MAGENTA);
plot_char(START_X+8,START_Y+6,BRIGHT_MAGENTA2);
plot_char(START_X+24,START_Y+6,BRIGHT_CYAN);
plot_char(START_X+40,START_Y+6,BRIGHT_WHITE);
plot_char(START_X+56,START_Y+6,BRIGHT_RED2);
pthread_mutex_unlock(&mutex1);
sleep_seconds(1);
pthread_mutex_lock(&mutex1);
plot_char(START_X,START_Y,DIM_RED);
plot_char(START_X+16,START_Y,DIM_GREEN);
plot_char(START_X+32,START_Y,DIM_YELLOW);
plot_char(START_X+48,START_Y,DIM_BLUE);
plot_char(START_X+64,START_Y,DIM_MAGENTA);
plot_char(START_X+8,START_Y+6,DIM_MAGENTA2);
plot_char(START_X+24,START_Y+6,DIM_CYAN);
plot_char(START_X+40,START_Y+6,DIM_WHITE);
plot_char(START_X+56,START_Y+6,DIM_RED2);
/*plot_char(START_X,START_Y,BLACKBACK); //alternate
plot_char(START_X+16,START_Y,BLACKBACK);
plot_char(START_X+32,START_Y,BLACKBACK);
plot_char(START_X+48,START_Y,BLACKBACK);
plot_char(START_X+64,START_Y,BLACKBACK);
plot_char(START_X+8,START_Y+6,BLACKBACK);
plot_char(START_X+24,START_Y+6,BLACKBACK);
plot_char(START_X+40,START_Y+6,BLACKBACK);
plot_char(START_X+56,START_Y+6,BLACKBACK);*/
pthread_mutex_unlock(&mutex1);
sleep_seconds(1);
}
return 0;
}
void set_coord(int x, int y)
{
printf("\033[%d;%dH",y,x); /* move cursor (row y, col x) */
}
void plot_char(int x,int y,char * colour)
{
set_coord(x,y);
fputs(colour,stdout);
}
void* tinsel_func(void *id)
{
int x,y,i;
char *tinsel_colour[] = {MAGENTA,CYAN,RED,YELLOW};
while(1)
{
pthread_mutex_lock(&mutex1);
// plot_char(0,0,FG_BLACK BG_BLACK "." ALL_NORMAL); for flashing sign only
i = rand() % 4; // to access random colour for tinsel
y = 3;
x = rand() % COLS;
plot_char(x,y,tinsel_colour[i]);
y = 22;
x = rand() % COLS;
plot_char(x,y,tinsel_colour[i]);
pthread_mutex_unlock(&mutex1);
}
return NULL;
}
void sleep_seconds(long seconds)
{
clock_t limit,now = clock();
limit = now + seconds * CLOCKS_PER_SEC;
while(limit > now)
{
now = clock();
}
}