+#include "logs.h"
+
+#define PRUM_PROUD 2061
+#define PRUM_SOUC 6183
+
+static char doPrint = 1;
+static char error = 0;
+
+/*
+ * \brief
+ * Help
+ */
+static void printHelp(){
+ doPrint=0;
+ puts("start - Pripravi rizeni, zapne enable bity pwm.");
+ puts("stop - Vypne komutaci, pwm a rizeni.");
+ puts("0 - Vypne komutaci, pwm a rizeni.");
+ puts("ga:[hodnota] - Zapne rizeni na zvolenou absolutni pozici.");
+ puts("duty:[hodnota] - Nastavi pevnou sirku plneni.");
+ puts("spd:[hodnota] - Zapne rizeni na danou rychlost.");
+ puts("log - Spusti nebo ulozi logovani.");
+ puts("ao:[hodnota] - Prenastavi alpha offset.");
+
+ puts("print - Zapne nebo vypne pravidelne vypisovani hodnot.");
+ puts("help - Vypne vypisovani hodnot a zobrazi tuto napovedu.");
+ puts("exit - Bezpecne ukonci program.");
+}
+
+
+/*
+ * \brief
+ * V prikazech je hodnota od zneni prikazu delena dvojteckou
+ * tato funkce dvojtecku nahradi mezerou
+ */
+static void delCol(char * txt){
+ unsigned i=0;
+ while(txt[i]!='\0'){
+ if (txt[i]==':') txt[i]=' ';
+ i++;
+ }
+}
+
+/*
+ * Nastavi enable bity na pwm,
+ * zapne komutaci
+ */
+static void start(struct rpi_state* state){
+ sem_wait(&state->thd_par_sem);
+ state->test=0x70; /*konfiguracni byte*/
+ sem_post(&state->thd_par_sem);
+}
+
+/*
+ * \brief
+ * Zastavi komutaci, vypne pwm
+ */
+static void stop(struct rpi_state* state){
+ sem_wait(&state->thd_par_sem);
+ state->commutate=0;
+ state->pos_reg_ena=0;
+ state->spd_reg_ena=0;
+ state->duty=0;
+ state->pwm1=0;
+ state->pwm2=0;
+ state->pwm3=0;
+ sem_post(&state->thd_par_sem);
+}
+
+/*
+ * \brief
+ * Nastavi pevnou sirku plneni
+ */
+static void dutySet(struct rpi_state* state, int duty){
+ sem_wait(&state->thd_par_sem);
+ if (duty>MAX_DUTY) duty=MAX_DUTY;
+ if (duty<-MAX_DUTY) duty=-MAX_DUTY;/*paranoia*/
+ state->duty=duty;
+ state->pos_reg_ena=0;
+ state->spd_reg_ena=0;
+ state->commutate=1;
+ sem_post(&state->thd_par_sem);
+}
+
+/*
+ * \brief
+ * Zapne rizeni na zvolenou polohu vztazenou k pozici pri startu
+ */
+static void goAbsolute(struct rpi_state* state, int pos){
+ sem_wait(&state->thd_par_sem);
+ state->spd_reg_ena=0;
+ state->pos_reg_ena=1;
+ state->commutate=1;
+ state->desired_pos=pos;
+ sem_post(&state->thd_par_sem);
+}
+
+/*
+ * \brief
+ * Zapne nebo vypne pravidelne vypisovani hodnot.
+ */
+static void changePrint(){
+ doPrint=!doPrint;
+}
+
+/*
+ * \brief
+ * Bezpecne ukonci program.
+ */
+static void exitApp(struct rpi_state* state){
+ stop(state);
+ /* Note: atexit() is set before*/
+ exit(0);
+}
+/*
+ * \brief
+ * Set speed.
+ */
+static void setSpeed(struct rpi_state* state, int speed){
+ if (speed>MAX_SPEED) speed=MAX_SPEED;
+ if (speed<-MAX_SPEED) speed=-MAX_SPEED;/*paranoia*/
+ sem_wait(&state->thd_par_sem);
+ state->pos_reg_ena=0;
+ state->spd_reg_ena=1;
+ state->commutate=1;
+ state->desired_spd=speed;
+ sem_post(&state->thd_par_sem);
+}
+
+/*
+ * \brief
+ * Set alpha offset.
+ */
+static void setAlphaOff(struct rpi_state* state, int offset){
+ if (offset<0) offset*=-1;
+ offset%=1000;
+ sem_wait(&state->thd_par_sem);
+ state->alpha_offset=(unsigned short)offset;
+ sem_post(&state->thd_par_sem);
+}
+
+/*
+ * \brief
+ * Initialize logs
+ */
+static void logInit(struct rpi_state* state){
+ int r;
+ state->log_col=0;
+ state->log_col_count=LOG_DEF_COL;
+ for (r=0;r<LOG_ROWS;r++){
+ state->logs[r]=malloc(state->log_col_count*sizeof(int));
+ if (state->logs[r]==NULL){
+ error=1;
+ state->log_col_count=-1;
+ return;
+ }
+ }
+ state->doLogs=1;
+}
+