+/*
+ * UDP_CAPABLE definuje, zda je pouzeitelna moznost cteni
+ * referencnich informaci z jineho zarizeni po protokolu
+ * UDP. Jde zatim jen o testovaci rezim
+ */
+#define UDP_CAPABLE
+
+#ifdef UDP_CAPABLE
+#include "udp_cli.h"
+#include "misc.h"
+#include <pthread.h>
+#endif
+
+
+#define PRUM_PROUD 2061
+#define PRUM_SOUC 6183
+
+static char doPrint = 1;
+
+#ifdef UDP_CAPABLE
+static struct remote_pos_st remote_pos={
+ .stop=1
+};
+#endif
+
+/*
+ * zastavi cteni po UDP
+ */
+static inline void stop_udp_SEM(){
+ #ifdef UDP_CAPABLE
+ remote_pos.stop=1;
+ #endif
+}
+
+
+
+/*
+ * \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.");
+
+ #ifdef UDP_CAPABLE
+ puts("udp_pos:[ip] - Bude ridit pozici na hodnotu vzdaleneho zarizeni");
+ puts("udp_spd:[ip] - Bude ridit rychlost na hodnotu vzdaleneho zarizeni");
+ #endif
+
+ 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){
+ stop_udp_SEM();
+ sem_wait(&state->thd_par_sem);
+ setCommutationOff(state);
+ setRegulationOff(state);
+ 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){
+ stop_udp_SEM();
+ sem_wait(&state->thd_par_sem);
+ if (duty>MAX_DUTY) duty=MAX_DUTY;
+ if (duty<-MAX_DUTY) duty=-MAX_DUTY;/*paranoia*/
+ state->duty=duty;
+ setRegulationOff(state);
+ setCommutationOn(state);
+ 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){
+ stop_udp_SEM();
+ sem_wait(&state->thd_par_sem);
+ setRegulationPos(state);
+ setCommutationOn(state);
+ 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*/
+ stop_udp_SEM();
+ sem_wait(&state->thd_par_sem);
+ setRegulationSpeed(state);
+ setCommutationOn(state);
+ 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);
+}