Commit 54c75de0 authored by 42loop's avatar 42loop
Browse files

Update mirror2.c

parent 4ecc8f10
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <stdbool.h>
#include <unistd.h>
#include <wchar.h>
#include <locale.h>
#include <math.h>
#include <termios.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <mcp3004.h>
#include <linux/input.h>
#include <bcm_host.h>
#include "VG/openvg.h"
#include "VG/vgu.h"
#include "shapes.h"
#include "digital_signage.h"
#define csPin 0
#define sclkPin 1
#define mosiPin 2
#define misoPin 3
#define CUR_SIZ 16
#define DIAL 1
#define VSLIDER 2
#define HSLIDER 3
#define CHECKBOX 4
#define BUTTON 5
#define AREA 6
#define LAREA 7
#define GREEN 0
#define ORANGE 1
#define GREY 2
#define RED 3
#define NONE 4
//äöüÄÖÜß
char umlaut[]={0xe4,0xf6,0xfc,0xc4,0xd6,0xdc,0xdf,0};
int count=12;
int seconds=3;
int lcount=0;
int commentwidth=500;
typedef struct
{
int x;
int y;
} point_t;
point_t mp;
point_t handle;
typedef struct
{
int x;
int y;
int w;
int h;
//int isactive;
//bool is_on;
} rectangle_t;
// visual controls structure:
typedef struct
{
char name[30];
int ctrltype;
rectangle_t coords;
int id;
bool isactive;
int color;
float value;
int r;
bool visible;
VGPath path;
int groupid;
} control_t;
// Mouse state structure
typedef struct {
int fd;
struct input_event ev;
VGfloat x, y;
int left, middle, right;
int max_x, max_y;
} mouse_t;
// BEGIN data structs
struct NEWS_TICKER nt = {
.pos_x = 220,
.pos_y = 20,
.screen_width = 400,
.font = &SansTypeface,
.font_size = 20,
.scroll_speed = 3, // 3 is the best balance between smoothness and readability
.fade_speed = 0.05,
.display_time = 4.0,
.cur_pos_x = 0,
.cur_msg_index = 0,
.fades_in = true,
.fades_out = false,
.scrolls = true,
.current_alpha = 0.5,
.msg_count = 6,
.content = {
L"Der Wahnsinn ist eine Reise zur Hoelle.",
L"Das Gehirn erkrankt und schwankt in immer neue Dimensionen, da, wo die boesen Maechte wohnen" ,
L"There is class warfare, all right, but it is my class, the rich class, that is making war, and we are winning.",
L"Krieg ist Frieden",
L"Freiheit ist Sklaverei",
L"Unwissenheit ist Staerke"
}
};
//dispmanx for additional layers, eg backdrop
DISPMANX_DISPLAY_HANDLE_T display;
DISPMANX_UPDATE_HANDLE_T update;
DISPMANX_RESOURCE_HANDLE_T resource;
DISPMANX_ELEMENT_HANDLE_T element;
VC_RECT_T dst_rect, src_rect;
VGImage heart;
point_t lastmouse;
mouse_t mouse; // global mouse state
int left_count = 0;
int quitState = 0;
bool mousechanged=false;
bool isresizerx=false;
bool isresizery=false;
int bcount=0;
control_t controls[100];
int currentactive=-1;
int currentover=-1;
bool doexit=false;
bool global_hide=false;
bool blank_bg=true;
int bg_layer=3;
char ltype[50];
char lcol[10];
char lvis[10];
int adcval[8];
int adcctrlid[8];
int adc_hist[8][10];
int adc_hist_index[8];
int r=1;
static void blank_background(int layer,bool enable)
{
// int ret;
if (enable)
{
update = vc_dispmanx_update_start(0);
element = vc_dispmanx_element_add(update, display, layer, &dst_rect, resource, &src_rect,
DISPMANX_PROTECTION_NONE, NULL, NULL, DISPMANX_NO_ROTATE); //DISPMANX_STEREOSCOPIC_MONO );
/*ret =*/ vc_dispmanx_update_submit_sync( update );
}
else
{
update = vc_dispmanx_update_start(0);
/*ret=*/vc_dispmanx_element_remove( update, element );
/*ret=*/vc_dispmanx_update_submit_sync( update );
}
}
// BEGIN non-blocking and utility functions
void changemode(int dir) {
static struct termios oldt, newt;
if (dir == 1) {
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
} else {
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
}
void *updaterThread(void *arg) {
//printf("key thread running\n");
while(1) {
sleep(1);
count+=1;
r=Random(1,lcount-1);
}
return 0;
}
double clamp(double d, double min, double max) {
const double t = d < min ? min : d;
return t > max ? max : t;
}
// END non-blocking and utility functions
// BEGIN common functions
double Fade(bool fades_in, bool fades_out, double current_alpha, double fade_speed) {
if (fades_in && current_alpha <= 1) {
return clamp(current_alpha + fade_speed, 0.0, 1.0);
} else if (fades_out && current_alpha >= 0) {
return clamp(current_alpha - fade_speed, 0.0, 1.0);
}
return 1.0;
}
// END common functions
// BEGIN newsticker specific functions
VGfloat MeasureCurText(struct NEWS_TICKER *nt) {
return WTextWidth(nt->content[nt->cur_msg_index], *nt->font, nt->font_size);
}
//thread for updating animated graphics, currently the ticker
int updaterinit() {
pthread_t updateThread;
return pthread_create(&updateThread, NULL, &updaterThread, NULL);
}
void setctrlcolor(int c, bool over, bool on)
{
if (c==NONE)
{Stroke(255, 255, 255, .5);
Fill(0, 0, 0, 0);
}
else if (c==GREEN)
{Stroke(0, 255, 0, 1);
if (!over)
{
if (!on) Fill(0, 255, 0, 0.1);
else Fill(0, 255, 0, 0.4);
}
else Fill(0, 255, 0, 0.4);
}
else if (c==ORANGE)
{Stroke(255, 128, 0, 1);
if (!over)
{ if (!on) Fill(255, 128,0, 0.1);
else Fill(255, 128,0, 0.4);
}
else Fill(255, 128,0, 0.6);
}
else if (c==GREY)
{Stroke(255, 255, 255, 1);
if (!over)
{ if (!on) Fill(192, 192,192, 0.1);
else Fill(192, 192,192, 0.4);
}
else Fill(192, 192,192, 0.6);
}
else if (c==RED)
{Stroke(255, 0, 0, 1);
if (!over)
{ if (!on) Fill(255, 0,0, 0.1);
else Fill(255,0,0, 0.4);
}
else Fill(255,0,0, 0.6);
}
}
///////////////////////////////////////////////////
//stolen from omxplayer.cpp:
//create additional dispmanx context
//and set up a resource 1 by 1
static void create_bglayer()
{
uint32_t vc_image_ptr;
VC_IMAGE_TYPE_T type = VC_IMAGE_RGB565;
uint16_t image = 0x0000; // black
display = vc_dispmanx_display_open(0); //m_config_video.display
// we create a 1x1 black pixel image that is added to display just behind video
resource = vc_dispmanx_resource_create( type, 1 /*width*/, 1 /*height*/, &vc_image_ptr );
vc_dispmanx_rect_set( &dst_rect, 0, 0, 1, 1);
vc_dispmanx_resource_write_data( resource, type, sizeof(image), &image, &dst_rect );
//assert(ret == 0);
vc_dispmanx_rect_set( &src_rect, 0, 0, 1<<16, 1<<16);
vc_dispmanx_rect_set( &dst_rect, 0, 0, 0, 0);
}
int Random(int lower, int upper)
{
int num = (rand() %
(upper - lower + 1)) + lower;
return num;
}
///////////////////////////////////////////////////
int main(int argc, char **argv) {
time_t rawtime;
struct tm *timeinfo;
char time_formatted[30];
char gefaellt[30];
char secondsago[30];
char number[4];
char times[4];
char msg[30];
char tempinfo[1035];
int width = 1024;
int height = 600;
int yval1=0;
int yval2=0;
float angle1=0.0f;
int min=0;
int lastmin=0;
int xoff=-30;
int yoff=70;
handle.x=0;
handle.y=0;
char line[255];
printf("hello master\n");
///init openvg
init(&width, &height);
// mcp3004Setup (100, 0); //MCP3004/MCP3008
create_bglayer();
blank_background(bg_layer,true);
updaterinit();
heart=createImageFromJpeg("heart.jpg");
FILE * fp;
char * rline=NULL;
size_t len=0;
ssize_t read;
int stat=0;
char textstore[60][110];
fp = fopen("texts.txt", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&rline, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
lcount+=1;
if (stat<read){stat=read;}
printf("%s", rline);
size_t length = strlen(rline);
size_t i=0;
char t[3]="";
char modline[150]="";
int havespecial=0;
for (i=0; i < length; i++) {
if (havespecial==1) {printf("special: %i\n", rline[i]);havespecial=0;}
if (rline[i]==195) {havespecial=1; continue;}
//printf("%c\n", rline[i]); /* Print each character of the string. */
if (rline[i]==164) sprintf(t,"%c",0xe4);
else if (rline[i]==182) sprintf(t,"%c",0xf6);
else if (rline[i]==188) sprintf(t,"%c",0xfc);
else if (rline[i]==132) sprintf(t,"%c",0xc4);
else if (rline[i]==150) sprintf(t,"%c",0xd6);
else if (rline[i]==156) sprintf(t,"%c",0xdc);
else if (rline[i]==159) sprintf(t,"%c",0xdf);
else
sprintf(t,"%c",rline[i]);
strcat(modline,t);
}
strcpy(textstore[lcount],modline);
}
fclose(fp);
/*
printf("maxlength: %i, count: %i\n",stat,lcount);
size_t length = strlen(rline);
size_t i = 0;
printf("rline len: %i\n",length);
for (; i < length; i++) {
if (rline[i]==195) continue;
printf("%i\n", rline[i]);
}
*/
if (rline)
free(rline);
///go!
Start(width, height);
// changemode(1);
//blank_background(12,true);
//main loop:
while (!doexit) {
// doexit=kbhit();
Clear(width, height);
//values for testing
yval1+=2;
if (yval1>360) yval1=0;
yval2+=2;
if (yval2>580) yval2=0;
angle1-=0.01f;
if (angle1<-1.0f) angle1=0.0f;
//checkadc();
float val=0.0;
float outval=0.0;
//time display
time(&rawtime);
timeinfo = localtime(&rawtime);
min=timeinfo->tm_min;
//strings for graphics:
strftime(time_formatted, 30, "%d.%m.%Y @ %H:%M:%S", timeinfo);
//{0xe4,0xf6,0xfc,0xc4,0xd6,0xdc,0xdf,0}
char gef[]={'g','e','f',0xe4,'l','l','t'};
strcpy(gefaellt,gef);
strcpy(times,"Mal");
sprintf(secondsago,"vor %ld Sekunden", seconds);
sprintf(number,"%ld", count);
float tw=TextWidth(number, SansTypeface, 140);
if (!global_hide)
{
vgSetPixels(0, 150, heart, 0, 0, 150, 150);
Fill(255, 255, 255, 1);
Text(100, 85, gefaellt, SansTypeface, 14);
Text(20, 45, secondsago, SansTypeface, 14);
Text(200, 45, number, SansTypeface, 140);
Text(230+tw, 45, times, SansTypeface, 14);
Text(200, 465, time_formatted, SansTypeface, 14);
//printf("r: %i\n",r);
printf("from textstore: %s\n",textstore[r]);
char tmp[120];
strcpy(tmp,textstore[r]);
float cw=TextWidth(tmp, SansTypeface, 18);
while (cw>commentwidth)
{
char * pch;
pch=strrchr(tmp,' ');
printf ("Last space found at %d \n",pch-tmp+1);
int loc=pch-tmp;
char* substr = malloc(loc+2);
strncpy(substr, tmp, loc);
substr[loc] = '\0';
printf("actual sub:%s\n",substr);
cw=TextWidth(substr, SansTypeface, 18);
printf("%f\n",cw);
strcpy(tmp,substr);
}
printf("DONE: %f\n",cw);
for (int i=0;i<5;i++)
{
Fill(255,128,0,.5);
Roundrect(1000, 1080-90-i*80,commentwidth+200,70,10,10);
Fill(0,0,0,1);
//if (cw<commentwidth) Text(1000+20, 1080-90-i*80+20, textstore[r], SansTypeface, 18);
//else Text(1000+20, 1080-90-i*80+20, "XXXXXXX", SansTypeface, 18);
Text(1000+20, 1080-90-i*80+20, tmp, SansTypeface, 18);
}
}
End(width, height);
}
//END of MAIN loop
//printf("gui exiting\n");
changemode(0);
finish();
int c=0;
for (c=0;c<bcount;c++)
{
vgDestroyPath(controls[c].path);
}
return 0;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment