Keystick GUI

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Keystick GUI

Сообщение asutpka »

Запуская свой девайс решил попробовать сабжевый GUI .
После долгих мучений полетело но как то коряво. Ручные перемещения через ....(ну вы поняли) не работали,
гугл в одном из закоулков прятал это , сопротивлялся но отдал.
Почитав решил перекомпилить данный пример. Ошибок выдало кучу, по этому плюнул и сам по приведённой инструкции модифицировал код.
Вроде заработали ручные перемещения.
А- думаю , раз пошла такая пьянка покручу всё, что крутится
И вот накрутил.
1.png
1.png (5.98 КБ) 4400 просмотров
ИСХОДНЫЙ GUI
Bildschirmfoto-keystick.png
Bildschirmfoto-keystick.png (6.62 КБ) 4401 просмотр
Как думаете - это хоть кому-то нужно?
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

Re: Keystick GUI

Сообщение tooshka »

Вот на чем 3д принтер сляпать!
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Keystick GUI

Сообщение nkp »

а почему ручные перемещения не работали ?
в чем была причина?
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

В документе приведенном в первом посте говорится, что-
(для просмотра содержимого нажмите на ссылку)
В функции idleHandler()
анализировалось время keyrepeat.
И не той переменной
присваивалось значение 0. Раньше
было oldch = 0, а правильно нужно
ch = 0. Автор исправления Алексей
Кудрин (14 мая 2011 года)

В основной функции main() при
организации цикла while(!done)
если последняя нажатая клавиша
равна той, что нажата сейчас (при
опросе) не происходил вызов
updateStatus(). Соответственно не
происходило заполнение
изменения данных в stdscr.
Изменения в самой программе EMC
происходили но не отображались.
Поэтому пришлось добавить вызов
updateStatus() и printStatus().
Исправлено Алексеем
Иноземцевым (15 мая 2011 года).
Подправил, и вроде пошло.

Сейчас проблема. Нужна какая нибудь длинная УП на 4 оси, что бы погонять и проверить возможные баги.
Самому что-то писать неохота.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

Кстати, если запуститься без иксов, и LinuxCNC запустить на keystick из консоли latency здорово улучшается. Вроде... :)
Я как-то давно запускал latency test в консоле - там что-то вообще около 4000-6000 показывало...
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

без иксов летит только в путь. Сравнивая нагрузку на процессор при максимальных скоростях при плоской круговой интерполяции нагрузка на 1гиговый процессор составляла 10-15% + 8%htop+ 2-3 % ssh.
как только сложную длинную быструю 4x осевую программу добуду -попробую измерить максимальную частоту генератора, как на lpt-pc так и на bone black. Кстати по следам этой работы легко вписать в экран ещё одну ведомую ось . 6 уже вроде не помещается без небольшой переделки, да и хоткеи сколь нибудь логичные заканчиваются. Если время будет надо сюда код в виде патча положить, так как git ещё не освоил.

зы. Вообще можно и мышу прибубенить и раскрасить как ёлку, раз всё равно ncurses в программе заинклуден.
Последний раз редактировалось asutpka 21 янв 2014, 12:37, всего редактировалось 2 раза.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Keystick GUI

Сообщение nkp »

правильно ли я понимаю - что ошибки ,которые были исправлены тс в Keystick , даже в master версиях емс еще не исправлены??
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

именно так
кстати может это и не ошибки а художественный замысел, но мне привычнее, что нажал кнопку и поехало до тех пор пока держишь. а в исходной версии - нажал - проехало чуток, затем надо нажать что-то другое а потом снова повторить.
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

кстати о latency. Это хорошо или плохо?

Код: Выделить всё

RTT|  00:04:34  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst

RTD|      8.791|     10.291|     48.041|       0|     0|      3.666|     57.458
RTD|      8.833|      9.791|     42.166|       0|     0|      3.666|     57.458
RTD|      8.791|     10.124|     49.833|       0|     0|      3.666|     57.458
RTD|      8.708|      9.624|     45.291|       0|     0|      3.666|     57.458
RTD|      8.749|     10.124|     47.208|       0|     0|      3.666|     57.458
RTD|      8.791|     10.166|     50.666|       0|     0|      3.666|     57.458
RTD|      8.791|     10.124|     48.416|       0|     0|      3.666|     57.458
RTD|      8.708|      9.666|     51.541|       0|     0|      3.666|     57.458
RTD|      8.666|      9.999|     51.833|       0|     0|      3.666|     57.458
^X^Z
[2]+  Stopped                 /usr/xenomai/bin/latency
linuxcnc@arm:~$ 
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

1000us это я так понимаю серво период... надо как-то проверить latency на base т.е. на 25us...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Keystick GUI

Сообщение Serg »

asutpka писал(а):RTD| 8.666| 9.999| 51.833| 0| 0| 3.666| 57.458
^X^Z
[2]+ Stopped /usr/xenomai/bin/latency
linuxcnc@arm:~$
по Ctrl-Z программа не завершается, а останавливается и остётся в памяти. Завершается по Ctrl-C.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

Nick писал(а):надо как-то проверить latency на base т.е. на 25us...
Запускал так

Код: Выделить всё

linuxcnc@arm:~$ /usr/xenomai/bin/latency -B 25us -t1 > latency.log
результат при работе компилятора и загрузки процессора на 100% в течении 15 минут.
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

= Sampling period: 1000 us
== Test mode: in-kernel periodic task
== All results in microseconds
warming up...
RTT|  00:07:28  (in-kernel periodic task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|      4.643|     12.066|     38.560|       0|     0|      0.350|     53.290
RTD|      4.601|      7.044|     35.601|       0|     0|      0.350|     53.290
RTD|      4.643|      5.695|     34.559|       0|     0|      0.350|     53.290
RTD|      4.600|      7.960|     37.309|       0|     0|      0.350|     53.290
RTD|      4.642|      7.227|     34.267|       0|     0|      0.350|     53.290
RTD|      4.600|      9.099|     35.975|       0|     0|      0.350|     53.290
RTD|      4.600|      6.649|     37.141|       0|     0|      0.350|     53.290
RTD|      4.600|      6.693|     34.225|       0|     0|      0.350|     53.290
RTD|      4.641|     20.759|     43.349|       0|     0|      0.350|     53.290
RTD|      6.932|     20.931|     37.099|       0|     0|      0.350|     53.290
RTD|      8.891|     23.449|     38.474|       0|     0|      0.350|     53.290
RTD|      6.349|     21.937|     38.765|       0|     0|      0.350|     53.290
RTD|      4.890|     23.370|     38.057|       0|     0|      0.350|     53.290
RTD|      4.640|     19.715|     36.806|       0|     0|      0.350|     53.290
RTD|      8.390|     22.903|     37.556|       0|     0|      0.350|     53.290
RTD|      6.473|     22.902|     41.014|       0|     0|      0.350|     53.290
RTD|      8.764|     22.136|     36.889|       0|     0|      0.350|     53.290
RTD|      6.931|     23.464|     39.764|       0|     0|      0.350|     53.290
RTD|      8.305|     22.184|     37.972|       0|     0|      0.350|     53.290
RTD|      8.055|     23.985|     39.430|       0|     0|      0.350|     53.290
RTD|      6.513|     22.845|     39.804|       0|     0|      0.350|     53.290
---|-----------|-----------|-----------|--------|------|-------------------------
RTS|     -0.382|     15.334|     53.429|       0|     0|    00:15:20/00:15:20
UAVpilot писал(а):о Ctrl-Z программа не завершается,
Да ясно, просто за 2 дня редактор NANO приучил так, что отучаться ещё долго . ;)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

asutpka писал(а):in-kernel periodic task, 1000 us period, priority 99
Вроде всеравно не оно...
щас погоди переделаем latency-test от linuxcnc...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

Вот как-то так...
Вложения
latency-test-cli.tar.gz
(1.39 КБ) 1150 скачиваний
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

Nick писал(а):Вот как-то так...
спасибо, но на моём девайсе чтото не так отрабатывает. Сеть при запуске скрипта отваливается и по этому результат пока не знаю, но скоро руки дойдут и до этого.
А пока публикую последний проверенный вариант патча.
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

--- /home/linuxcnc/linuxcnc/src/emc/usr_intf/keystick.cc.old	2013-12-28 18:09:41.000000000 +0000
+++ /home/linuxcnc/linuxcnc/src/emc/usr_intf/keystick.cc	2014-01-26 17:02:38.593313741 +0000
@@ -123,12 +123,14 @@
 static int xJogPol = 1;
 static int yJogPol = 1;
 static int zJogPol = 1;
+static int aJogPol = 1;
 
 typedef enum {
   AXIS_NONE = 1,
   AXIS_X,
   AXIS_Y,
-  AXIS_Z
+  AXIS_Z,
+  AXIS_A
 } AXIS_TYPE;
 
 static AXIS_TYPE axisSelected = AXIS_X;
@@ -144,6 +146,9 @@
       return "    Y SELECTED    ";
     case AXIS_Z:
       return "    Z SELECTED    ";
+    case AXIS_A:
+      return "    A SELECTED    ";
+
     default:
       return "    ? SELECTED    ";
     }
@@ -157,6 +162,8 @@
     return 1;
   if (a == AXIS_Z)
     return 2;
+  if (a == AXIS_A)
+    return 3;
 
   return 0;
 }
@@ -229,8 +236,7 @@
 static int wmaxy, wmaxx;
 
 static void printFkeys()
-{
-  wattrset(window, A_BOLD);
+{ wattrset(window, A_BOLD);
   mvwaddstr(window, 0, 1,  "F1 ");
   mvwaddstr(window, 1, 1,  "F2 ");
   mvwaddstr(window, 2, 1,  "F3 ");
@@ -269,7 +275,6 @@
   mvwaddstr(window, 2, 65,     "Quits Display ");
   mvwaddstr(window, 3, 65,     "Toggles Help  ");
 }
-
 #define ERR_Y ((wmaxy) - 2)
 #define ERR_X (wbegx)
 
@@ -331,6 +336,7 @@
 
 static void printStatus()
 {
+//Кое что надо пораскрашивать
   int savey, savex;
   int t;
   int line;
@@ -345,17 +351,18 @@
       printFkeys();
 
       wattrset(window, 0);
-      mvwaddstr(window, 5, 1, "x/X y/Y z/Z");
+      mvwaddstr(window, 5, 1, "x/X y/Y z/Z a/A");
       mvwaddstr(window, 6, 1, "HOME");
       mvwaddstr(window, 7, 1, "< > or , .");
       mvwaddstr(window, 8, 1, "1-9, 0");
       mvwaddstr(window, 9, 1, "<- arrow keys ->");
       mvwaddstr(window, 10, 1, "^ arrow keys V");
       mvwaddstr(window, 11, 1, "PageUp/PageDown");
-      mvwaddstr(window, 12, 1, "c/C");
-      mvwaddstr(window, 13, 1, "i/I");
-      mvwaddstr(window, 14, 1, "#");
-      mvwaddstr(window, 15, 1, "@");
+      mvwaddstr(window, 12, 1, " + / - ");
+      mvwaddstr(window, 13, 1, "c/C");
+      mvwaddstr(window, 14, 1, "i/I");
+      mvwaddstr(window, 15, 1, "#");
+      mvwaddstr(window, 16, 1, "@");
 
       wattrset(window, A_UNDERLINE);
       mvwaddstr(window, 5, 19, "selects axis");
@@ -365,10 +372,11 @@
       mvwaddstr(window, 9, 19, "jog X");
       mvwaddstr(window, 10, 19, "jog Y");
       mvwaddstr(window, 11, 19, "jog Z");
-      mvwaddstr(window, 12, 19, "sets continuous jog");
-      mvwaddstr(window, 13, 19, "toggles incr jog");
-      mvwaddstr(window, 14, 19, "toggles abs/rel");
-      mvwaddstr(window, 15, 19, "toggles cmd/act");
+      mvwaddstr(window, 12, 19, "jog A");
+      mvwaddstr(window, 13, 19, "sets continuous jog");
+      mvwaddstr(window, 14, 19, "toggles incr jog");
+      mvwaddstr(window, 15, 19, "toggles abs/rel");
+      mvwaddstr(window, 16, 19, "toggles cmd/act");
 
       wattrset(window, 0);
       mvwaddstr(window, 5, 41, "B");
@@ -377,7 +385,7 @@
       mvwaddstr(window, 8, 41, "r/R");
       mvwaddstr(window, 9, 41, "p/P");
       mvwaddstr(window, 10, 41, "s/S");
-      mvwaddstr(window, 11, 41, "quote/XYZGM");
+      mvwaddstr(window, 11, 41, "quote/XYZAGM");
       mvwaddstr(window, 12, 41, "l/L");
       mvwaddstr(window, 13, 41, "u/U");
 
@@ -434,6 +442,7 @@
       mvwaddstr(window, 13, 1, "X Scale:");
       mvwaddstr(window, 14, 1, "Y Scale:");
       mvwaddstr(window, 15, 1, "Z Scale:");
+      mvwaddstr(window, 15, 1, "A Scale:");
 
       mvwaddstr(window, 17, 1, "V/Max V:");
       mvwaddstr(window, 18, 1, "A/Max A:");
@@ -497,13 +506,20 @@
       line = 4;
       for (t = 0; t < CANON_POCKETS_MAX; t++)
         {
-          if (emcStatus->io.tool.toolTable[t].toolno)
+         /* if (emcStatus->io.tool.toolTable[t].toolno)*/
+           if (emcStatus->io.tool.toolTable[t].toolno != -1) /* AIKE */
             {
-              sprintf(scratch_string, "%4d%10d%10.4f%10.4f",
+              //sprintf(scratch_string, "%4d%10d%10.4f%10.4f",
+              sprintf(scratch_string, "%2d%8d%11.4f%10.4f%13d%12.4f%12.4f",
                       t,
                       emcStatus->io.tool.toolTable[t].toolno,
                       emcStatus->io.tool.toolTable[t].offset.tran.z,
-                      emcStatus->io.tool.toolTable[t].diameter);
+                      emcStatus->io.tool.toolTable[t].diameter,
+                           //add nev
+                      emcStatus->io.tool.toolTable[t].orientation,
+                      emcStatus->io.tool.toolTable[t].frontangle,
+                      emcStatus->io.tool.toolTable[t].backangle);
+                      //end nev
               mvwaddstr(window, line++, 3, scratch_string);
             }
         }
@@ -524,6 +540,11 @@
     }
   else if (window == progwin)
     {
+//      start_color();
+//            init_pair(1, COLOR_YELLOW, COLOR_BLACK);
+//            init_pair(2, COLOR_WHITE, COLOR_GREEN);
+//            init_pair(3, COLOR_BLACK, COLOR_RED);
+
       mvwaddstr(window, 0, 0, line_blank);
       wattrset(window, A_BOLD);
       if (emcStatus->task.file[0] == 0)
@@ -651,7 +672,7 @@
         scratch_string[3] = '*';
       if (emcStatus->motion.axis[0].maxHardLimit)
         scratch_string[4] = '*';
-      mvwaddstr(window, 10, 27, scratch_string);
+      mvwaddstr(window, 10, 23, scratch_string);
 
       strcpy(scratch_string, "--Y--");
       if (emcStatus->motion.axis[1].minHardLimit)
@@ -662,7 +683,7 @@
         scratch_string[3] = '*';
       if (emcStatus->motion.axis[1].maxHardLimit)
         scratch_string[4] = '*';
-      mvwaddstr(window, 10, 47, scratch_string);
+      mvwaddstr(window, 10, 39, scratch_string);
 
       strcpy(scratch_string, "--Z--");
       if (emcStatus->motion.axis[2].minHardLimit)
@@ -673,7 +694,18 @@
         scratch_string[3] = '*';
       if (emcStatus->motion.axis[2].maxHardLimit)
         scratch_string[4] = '*';
-      mvwaddstr(window, 10, 67, scratch_string);
+      mvwaddstr(window, 10, 55, scratch_string);
+
+      strcpy(scratch_string, "--A--");
+      if (emcStatus->motion.axis[3].minHardLimit)
+        scratch_string[0] = '*';
+      if (emcStatus->motion.axis[3].minSoftLimit)
+        scratch_string[1] = '*';
+      if (emcStatus->motion.axis[3].maxSoftLimit)
+        scratch_string[3] = '*';
+      if (emcStatus->motion.axis[3].maxHardLimit)
+        scratch_string[4] = '*';
+      mvwaddstr(window, 10, 70, scratch_string);
 
       if (coords == COORD_ABSOLUTE)
         {
@@ -729,18 +761,22 @@
 
       switch(emcStatus->task.state)
         {
-        case EMC_TASK_STATE_OFF:
+         
+         case EMC_TASK_STATE_OFF:
           sprintf(state_string, "       OFF        ");
           break;
         case EMC_TASK_STATE_ON:
+          wattrset(window, COLOR_PAIR(2));
           sprintf(state_string, "       ON         ");
+          wattrset(window, 0);
           break;
         case EMC_TASK_STATE_ESTOP:
           sprintf(state_string, "      ESTOP       ");
           break;
+//Сделать красным мигающим
         case EMC_TASK_STATE_ESTOP_RESET:
-          sprintf(state_string, "   ESTOP RESET    ");
-          break;
+          sprintf(state_string, "   ESTOP RESET    ");  
+        break;
         default:
           sprintf(state_string, "        ?         ");
           break;
@@ -798,7 +834,7 @@
       else
         sprintf(lube_level_string,    "     LUBE LOW     ");
 
-      sprintf(home_string, "    --- HOMED     ");
+      sprintf(home_string, "    ---- HOMED    ");
       if (emcStatus->motion.axis[0].homed)
         {
           home_string[4] = 'X';
@@ -811,22 +847,32 @@
         {
           home_string[6] = 'Z';
         }
+      if (emcStatus->motion.axis[3].homed)
+        {
+          home_string[7] = 'A';
+        }
 
+/*      if (emcStatus->motion.axis[2].homed)
+        {
+          home_string[6] = 'A';
+        }                       здесь надо основательно повозиться*/
       if (coords == COORD_ABSOLUTE)
         {
           if (posDisplay == POS_DISPLAY_ACT)
             {
-              sprintf(pos_string, "%13.4f  %18.4f  %18.4f",
+              sprintf(pos_string, "%9.4f  %14.4f  %14.4f %14.4f",
                       emcStatus->motion.traj.actualPosition.tran.x,
                       emcStatus->motion.traj.actualPosition.tran.y,
-                      emcStatus->motion.traj.actualPosition.tran.z);
+                      emcStatus->motion.traj.actualPosition.tran.z,
+                      emcStatus->motion.traj.actualPosition.a);
             }
           else
             {
-              sprintf(pos_string, "%13.4f  %18.4f  %18.4f",
+              sprintf(pos_string, "%9.4f  %14.4f  %14.4f %14.4f",
                       emcStatus->motion.traj.position.tran.x,
                       emcStatus->motion.traj.position.tran.y,
-                      emcStatus->motion.traj.position.tran.z);
+                      emcStatus->motion.traj.position.tran.z,
+                      emcStatus->motion.traj.position.a);
             }
         }
       else
@@ -834,24 +880,27 @@
           coords = COORD_RELATIVE;
           if (posDisplay == POS_DISPLAY_ACT)
             {
-              sprintf(pos_string, "%13.4f  %18.4f  %18.4f",
+              sprintf(pos_string, "%9.4f  %14.4f  %14.4f %14.4f",
                       emcStatus->motion.traj.actualPosition.tran.x - emcStatus->task.g5x_offset.tran.x - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.x,
                       emcStatus->motion.traj.actualPosition.tran.y - emcStatus->task.g5x_offset.tran.y - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.y,
-                      emcStatus->motion.traj.actualPosition.tran.z - emcStatus->task.g5x_offset.tran.z - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.z);
+                      emcStatus->motion.traj.actualPosition.tran.z - emcStatus->task.g5x_offset.tran.z - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.z,
+                      emcStatus->motion.traj.actualPosition.a - emcStatus->task.g5x_offset.a - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.a);
             }
           else
             {
-              sprintf(pos_string, "%13.4f  %18.4f  %18.4f",
+              sprintf(pos_string, "%9.4f  %14.4f  %14.4f %14.4f",
                       emcStatus->motion.traj.position.tran.x - emcStatus->task.g5x_offset.tran.x - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.x,
                       emcStatus->motion.traj.position.tran.y - emcStatus->task.g5x_offset.tran.y - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.y,
-                      emcStatus->motion.traj.position.tran.z - emcStatus->task.g5x_offset.tran.z - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.z);
+                      emcStatus->motion.traj.position.tran.z - emcStatus->task.g5x_offset.tran.z - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.tran.z,
+                      emcStatus->motion.traj.position.a - emcStatus->task.g5x_offset.a - emcStatus->task.g92_offset.tran.x - emcStatus->task.toolOffset.a);
             }
         }
 
-      sprintf(origin_string, "%13.4f  %18.4f  %18.4f",
+      sprintf(origin_string, "%9.4f  %14.4f  %14.4f %14.4f",
               emcStatus->task.g5x_offset.tran.x + emcStatus->task.g92_offset.tran.x,
               emcStatus->task.g5x_offset.tran.y + emcStatus->task.g92_offset.tran.y,
-              emcStatus->task.g5x_offset.tran.z + emcStatus->task.g92_offset.tran.z);
+              emcStatus->task.g5x_offset.tran.z + emcStatus->task.g92_offset.tran.z,
+              emcStatus->task.g5x_offset.a + emcStatus->task.g92_offset.a);
 
       sprintf(speed_string, "%10.1f", jogSpeed);
       if (jogMode == JOG_INCREMENTAL)
@@ -931,6 +980,7 @@
         }
 
       switch (emcStatus->task.interpState)
+// Надо раскрасить
         {
         case EMC_TASK_INTERP_IDLE:
           sprintf(interp_string, "%s", "IDLE    ");
@@ -985,6 +1035,7 @@
       if (override < 100)
         wattrset(window, A_BOLD);
       else
+	start_color();
         wattrset(window, A_UNDERLINE);
       mvwaddstr(window, 6, 14, scratch_string);
 
@@ -997,7 +1048,6 @@
       mvwaddstr(window, 8, 11, scratch_string);
 
       wattrset(window, A_REVERSE);
-
       mvwaddstr(window, 5, 1, state_string);
       mvwaddstr(window, 5, 21, mode_string);
       mvwaddstr(window, 6, 21, lube_on_string);
@@ -1225,7 +1275,8 @@
   if (keyup_count < 0)
     {
       keyup_count = 0;
-      oldch = 0;
+      /* oldch = 0;*/
+      ch = 0;
     }
 
   /*
@@ -1545,6 +1596,16 @@
       zJogPol = 0;
     }
 
+//надо добавить
+  aJogPol = 1;                  // set to default
+  if ((inistring = inifile.Find("JOGGING_POLARITY", "AXIS_3")) &&
+      1 == sscanf(inistring, "%d", &jogPol) &&
+      jogPol == 0)
+    {
+      // it read as 0, so override default
+      aJogPol = 0;
+    }
+
   // close it
   inifile.Close();
 
@@ -1845,6 +1906,10 @@
       else
         {
           keyup_count = NEXT_KEYUP_DELAY;
+         //**************************************************************
+         // read NML status */
+          updateStatus();
+          printStatus();
         }
 
       // set up a first switch on ch, for those characters that
@@ -2301,6 +2366,80 @@
               axisSelected = AXIS_Z;
             }
           break;
+//и сюда кое чего дописать**********************************************/
+        case '+':
+          if (oldch != ch &&
+              axisJogging == AXIS_NONE)
+            {
+              if (jogMode == JOG_INCREMENTAL)
+                {
+                  emc_axis_incr_jog_msg.serial_number = ++emcCommandSerialNumber;
+                  emc_axis_incr_jog_msg.axis = axisIndex(AXIS_A);
+                  if (aJogPol)
+                    emc_axis_incr_jog_msg.vel = jogSpeed / 60.0;
+                  else
+                    emc_axis_incr_jog_msg.vel = - jogSpeed / 60.0;
+                  emc_axis_incr_jog_msg.incr = jogIncrement;
+                  emcCommandBuffer->write(emc_axis_incr_jog_msg);
+                  emcCommandWait(emcCommandSerialNumber);
+                  // don't set axisJogging, since key up will abort
+                }
+              else
+                {
+                  jogMode = JOG_CONTINUOUS;
+                  emc_axis_jog_msg.serial_number = ++emcCommandSerialNumber;
+                  emc_axis_jog_msg.axis = axisIndex(AXIS_A);
+                  if (aJogPol)
+                    emc_axis_jog_msg.vel = jogSpeed / 60.0;
+                  else
+                  jogMode = JOG_CONTINUOUS;
+                  emc_axis_jog_msg.serial_number = ++emcCommandSerialNumber;
+                  emc_axis_jog_msg.axis = axisIndex(AXIS_A);
+                  if (aJogPol)
+                    emc_axis_jog_msg.vel = jogSpeed / 60.0;
+                  else
+                    emc_axis_jog_msg.vel = - jogSpeed / 60.0;
+                  emcCommandBuffer->write(emc_axis_jog_msg);
+                  emcCommandWait(emcCommandSerialNumber);
+                  axisJogging = AXIS_A;
+                }
+              axisSelected = AXIS_A;
+            }
+          break;
+
+        case '-':
+          if (oldch != ch &&
+              axisJogging == AXIS_NONE)
+            {
+              if (jogMode == JOG_INCREMENTAL)
+                {
+                  emc_axis_incr_jog_msg.serial_number = ++emcCommandSerialNumber;
+                  emc_axis_incr_jog_msg.axis = axisIndex(AXIS_A);
+                  if (aJogPol)
+                    emc_axis_incr_jog_msg.vel = - jogSpeed / 60.0;
+                  else
+                    emc_axis_incr_jog_msg.vel = jogSpeed / 60.0;
+                  emc_axis_incr_jog_msg.incr = jogIncrement;
+                  emcCommandBuffer->write(emc_axis_incr_jog_msg);
+                  emcCommandWait(emcCommandSerialNumber);
+                  // don't set axisJogging, since key up will abort
+                }
+              else
+                {
+                  jogMode = JOG_CONTINUOUS;
+                  emc_axis_jog_msg.serial_number = ++emcCommandSerialNumber;
+                  emc_axis_jog_msg.axis = axisIndex(AXIS_A);
+                  if (aJogPol)
+                    emc_axis_jog_msg.vel = - jogSpeed / 60.0;
+                  else
+                    emc_axis_jog_msg.vel = jogSpeed / 60.0;
+                  emcCommandBuffer->write(emc_axis_jog_msg);
+                  emcCommandWait(emcCommandSerialNumber);
+                  axisJogging = AXIS_A;
+                }
+              axisSelected = AXIS_A;
+            }
+          break;
 
         case KEY_HOME:          // home selected axis
           if (oldch != ch)
@@ -2610,6 +2749,32 @@
                 }
             }
           break;
+/* сюда дописать про А*/
+        case 'a':
+        case 'A':
+          if (oldch != ch)
+            {
+              if (emcStatus->task.mode == EMC_TASK_MODE_MDI)
+                {
+                  typing = 1;
+                  typeindex = 1;
+                  typebuffer[0] = ch;
+                  typebuffer[1] = 0;
+                  interactive = IACT_MDI;
+
+                  critFlag = 1;
+                  mvwaddstr(window, wmaxy, wbegx, line_blank);
+                  mvwaddstr(window, wmaxy, wbegx, "mdi command: ");
+                  waddch(window, ch);
+                  wrefresh(window);
+                  critFlag = 0;
+                }
+              else
+                {
+                  axisSelected = AXIS_A;
+                }
+            }
+          break;
 
         case 'i':               // incremental jog toggle
         case 'I':
@@ -2695,7 +2860,7 @@
                 }
             }
           break;
-
+//надо по другому распределить скорости до 150%
         case '0':
         case '1':
         case '2':
@@ -2804,9 +2969,13 @@
               emcCommandWait(emcCommandSerialNumber);
             }
           break;
+/* И что удивительно в хелпе про это по другому
+ надо по другому переделать потому, что перекекаются хоткеи */
+//        case 'a':
+//        case 'A':
+        case 'f':
+        case 'F':
 
-        case 'a':
-        case 'A':
           if (oldch != ch)
             {
               task_plan_step_msg.serial_number = ++emcCommandSerialNumber;
Есть проблема
на скриншоте самые последние строки
1.png
1.png (4.31 КБ) 4229 просмотров
формируются кодом
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

sprintf(scratch_string, "%10.3f%10.3f",
              emcStatus->motion.traj.velocity, emcStatus->motion.traj.maxVelocity);
      mvwaddstr(window, 17, 28, scratch_string);
      sprintf(scratch_string, "%10.3f%10.3f",
              emcStatus->motion.traj.acceleration, emcStatus->motion.traj.maxAcceleration);
      mvwaddstr(window, 18, 28, scratch_string);
Так вот предельные значения отображаются а текущие стоят на месте и не меняются никогда а хотелось бы
Если есть информация о том по каким именам получить emcStatus строку о текущей скорости и ускорении , может поможете?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

asutpka писал(а):Сеть при запуске скрипта отваливается и по этому результат пока не знаю, но скоро руки дойдут и до этого.
Ну так можно его запустить с >1.log, чтобы вывод в локальный файл писался, и потом посмотреть, что там будет.
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

Nick писал(а):Ну так можно его запустить с >1.log,
Запустил но только через колено. Оказывается оно просто висло.
То-ли вмешались врождённые особенности этого недостойного отпрыска славного семейства микропроцессорных устройств Вычислительного назначения, то-ли одно из двух, но с настройками данными в скрипте оно работать напрочь отказывалась.
Речь идёт о строке

Код: Выделить всё

BASE=$(parse_time 25us); SERVO=$(parse_time 1ms)
Исправил так как сделано в родном файле latency-test найденым в папке scripts

Код: Выделить всё

BASE=0; SERVO=$(parse_time 1ms)
И что характерно - тест с выведенным окном показал около 76000, а тест на питоне

Код: Выделить всё

linuxcnc@arm:~$ linuxcnc/scripts/latency-test-cli
rtapi:0 stopped
msgd:0 stopped
All times are in ns
                  Servo thread       |                     Base thread     
Max Interv | Max Jitter | Last inter | Max Interv | Max Jitter | Last inter
   1038459 |     144250 |     991292 |          0 |          0 |          0
   1041625 |     144250 |     990916 |          0 |          0 |          0
   1041625 |     144250 |     999833 |          0 |          0 |          0
   1044584 |     144250 |    1001459 |          0 |          0 |          0
   1044584 |     144250 |    1000208 |          0 |          0 |          0
   1044584 |     144250 |     998709 |          0 |          0 |          0
   1044584 |     144250 |    1000250 |          0 |          0 |          0
   1044584 |     144250 |    1011000 |          0 |          0 |          0
   1044584 |     144250 |    1006458 |          0 |          0 |          0
   1044584 |     144250 |    1026583 |          0 |          0 |          0
   1044584 |     144250 |    1001209 |          0 |          0 |          0
   1044584 |     144250 |    1014583 |          0 |          0 |          0
   1044584 |     144250 |    1000209 |          0 |          0 |          0
^C
linuxcnc@arm:~$python -V
Python 2.7.3
Возникло несколько вопросов.
1-Может питон поновее пересобрать?
2-И как на этой штуке 50kHz выжимали?

зы пока измерить нечем
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

Это джиттер servo-thread - т.е. медленного потока который работает с floating point. 50кГц генерируется в base-thread он работает быстрее.
Щас что-нибудь еще придумаем...

PS кто-нибудь знает, что это за компонент: latencybins http://linuxcnc.org/docs/html/man/man9/ ... ins.9.html ?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Keystick GUI

Сообщение Nick »

Вот еще вариант - запускае halrun и туда копируем вот это:
(это тоже самое, что делает latency-test, только на чистом hal :) )

Код: Выделить всё

loadrt threads name1=fast period1=25000 name2=slow period2=1000000 name3=sample period3=1000000000

loadrt timedelta count=2
addf timedelta.0 fast
addf timedelta.1 slow

loadrt sampler depth=1000 cfg="SSSSSS"
loadusr halsampler
addf sampler.0 sample

net sl timedelta.1.max      => sampler.0.pin.0
net sj timedelta.1.jitter   => sampler.0.pin.1
net st timedelta.1.out      => sampler.0.pin.2
net bl timedelta.0.max      => sampler.0.pin.3
net bj timedelta.0.jitter   => sampler.0.pin.4
net bt timedelta.0.out      => sampler.0.pin.5
# All times are in ns
#     Servo thread     |    Base thread
#MaxInt|MaxJitt|LastInt|MaxInt|MaxJitt|LastInt
start
Только надо бы еще придумать, как при этом нагрузить комп, чтобы результат был адекватным....
asutpka
Мастер
Сообщения: 294
Зарегистрирован: 17 апр 2013, 14:27
Репутация: 78
Контактная информация:

Re: Keystick GUI

Сообщение asutpka »

Не получается
period1=25000 вешает систему

Код: Выделить всё

linuxcnc@arm:~$ halrun
rtapi:0 stopped
msgd:0 stopped
halcmd: loadrt threads name1=fast period1=25000 name2=slow period2=1000000 name3=sample period3=1000000000
halcmd: 
halcmd: loadrt timedelta count=2
halcmd: addf timedelta.0 fast
halcmd: addf timedelta.1 slow
halcmd: 
halcmd: loadrt sampler depth=1000 cfg="SSSSSS"
halcmd: loadusr halsampler
halcmd: addf sampler.0 sample
halcmd: 
halcmd: net sl timedelta.1.max  => sampler.0.pin.0
<stdin>:11: Pin 'timedelta.1.max ' does not exist
halcmd: net sj timedelta.1.jitter  => sampler.0.pin.1
<stdin>:12: Pin 'timedelta.1.jitter ' does not exist
halcmd: net st timedelta.1.out  => sampler.0.pin.2
<stdin>:13: Pin 'timedelta.1.out ' does not exist
halcmd: net bl timedelta.0.max  => sampler.0.pin.3
<stdin>:14: Pin 'timedelta.0.max ' does not exist
halcmd: net bj timedelta.0.jitter  => sampler.0.pin.4
<stdin>:15: Pin 'timedelta.0.jitter ' does not exist
halcmd: net bt timedelta.0.out  => sampler.0.pin.5
<stdin>:16: Pin 'timedelta.0.out ' does not exist
halcmd: # All times are in ns
halcmd: #  Servo thread  |  Base thread
halcmd: #MaxInt|MaxJitt|LastInt|MaxInt|MaxJitt|LastInt
halcmd: start 
подобрал наименьший period1=30000 но всё равно не то

Код: Выделить всё

linuxcnc@arm:~$ halrun
rtapi:0 stopped
msgd:0 stopped
halcmd: loadrt threads name1=fast period1=30000 name2=slow period2=1000000 name3=sample period3=1000000000
halcmd: 
halcmd: loadrt timedelta count=2
halcmd: addf timedelta.0 fast
halcmd: addf timedelta.1 slow
halcmd: 
halcmd: loadrt sampler depth=1000 cfg="SSSSSS"
halcmd: loadusr halsampler
halcmd: addf sampler.0 sample
halcmd: 
halcmd: net sl timedelta.1.max  => sampler.0.pin.0
<stdin>:11: Pin 'timedelta.1.max ' does not exist
halcmd: net sj timedelta.1.jitter  => sampler.0.pin.1
<stdin>:12: Pin 'timedelta.1.jitter ' does not exist
halcmd: net st timedelta.1.out  => sampler.0.pin.2
<stdin>:13: Pin 'timedelta.1.out ' does not exist
halcmd: net bl timedelta.0.max  => sampler.0.pin.3
<stdin>:14: Pin 'timedelta.0.max ' does not exist
halcmd: net bj timedelta.0.jitter  => sampler.0.pin.4
<stdin>:15: Pin 'timedelta.0.jitter ' does not exist
halcmd: net bt timedelta.0.out  => sampler.0.pin.5
<stdin>:16: Pin 'timedelta.0.out ' does not exist
halcmd: # All times are in ns
halcmd: #  Servo thread  |  Base thread
halcmd: #MaxInt|MaxJitt|LastInt|MaxInt|MaxJitt|LastInt
halcmd: start
halcmd: 0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
linuxcnc@arm:~$ ^C
Ник перенеси посты 9,10,,12,13,14,,16,17,18,19,20, сюда так правильней будет. И афтаеву скоро пригодится.
Ответить

Вернуться в «LinuxCNC»