Вкладки в pyvcp. Автопереключение

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

вот такие ошибки сразу не видятся:

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

def __init__(self, master, pycomp, cnf={}, ha[color=#FF00BF]pl[/color]in=None, **kw):
:)
емс что то пишет - что с halpin не в порядке ,и на автомате не смотришь ,
что в ошибке хаплин стоит))
Выделение_004.png (2759 просмотров) <a class='original' href='./download/file.php?id=21420&sid=9a6a5a90cd28685a64dbc100155745d9&mode=view' target=_blank>Загрузить оригинал (102.49 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

так переключает:
(для просмотра содержимого нажмите на ссылку)

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

class pyvcp_tabs(bwidget.NoteBook ):
   n = 0
   def __init__(self, master, pycomp, cnf={}, halpin=None, **kw):
      self.names = kw.pop("names", [])
      self.idx = 0
      self._require(master)
      Widget.__init__(self, master, "NoteBook", cnf, kw)
      
      if halpin == None :
         halpin = "tabs."+str(pyvcp_tabs.n)
         pyvcp_tabs.n += 1

      self.current_pin = halpin+".current"
      self.raise_pin = halpin+".raise"
      pycomp.newpin(self.current_pin, HAL_S32, HAL_OUT)
      pycomp.newpin(self.raise_pin, HAL_S32, HAL_IN)

   def update(self, pycomp):
       u = bwidget.NoteBook.raise_page(self,self.names[pycomp[self.raise_pin]])
 
   def add(self, container, child):
      child.pack(side="top", fill="both", anchor="ne")
      if self.idx == 1:
         self.raise_page(self.names[0])
 
   def getcontainer(self):
      if len(self.names) < self.idx:
         self.names.append("Tab-%d" % self.idx)
      name = self.names[self.idx]
      self.idx += 1
      return self.insert("end", name, text=name)
если pyvcp.tabs.0.raise ==0 - первая вкладка
pyvcp.tabs.0.raise ==1 - вторая в, и т.д.
костль конечно - но вроде работает)))
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Nick »

А чем костыль? Имхо самое правильное решение. Так мы получаем дополнительные опции управления панельками, при этом ничего не теряем и все на стандартном интерфейсе.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

еще как то просто не скоммутируешь пины в хал...
halui.mode.is-manual допустим у нас BIT,а
pyvcp.tabs.0.raise S32 :shock:
чет выдумывать надо...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

ну для двух вкладок (а именно столько стояло в ТЗ :) ) можно обойтись :

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

loadrt conv_bit_s32 
addf conv-bit-s32.0 servo-thread 
net cin  halui.mode.is-manual  conv-bit-s32.0.in  
net  ftab  conv-bit-s32.0.out  pyvcp.tabs.0.raise 
зы
это все пишем конечно в POSTGUI_HALFILE =
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Nick »

Вроде был подходящий компонент, вот обратный:

http://linuxcnc.org/docs/html/man/man9/select8.9.html
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

компонент tceles8 : :)

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

 component select8 ;
pin out s32 out; 
pin in bit in#[8];
function _ nofp;
license "GPL";
;;
FUNCTION(_) {
	int i;
	for (i=0;i<8;i++) {
		if (in(i) == 1)
			out = i;
	}
}
true может быть только один пин - поэтому требуется дописать проверку что ли ...
(проверено - работает ;) )
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Serg »

Nick писал(а):Вроде был подходящий компонент, вот обратный:

http://linuxcnc.org/docs/html/man/man9/select8.9.html
http://linuxcnc.org/docs/html/man/man9/ ... sum.9.html
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

ну у меня покомпактней получилось :)
weighted_sum.c:
(для просмотра содержимого нажмите на ссылку)

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

/********************************************************************
* Description: weighted_sum.c
*   Weighted summer for HAL
*
*   See the "Users Manual" at emc2/docs/Hal_Introduction.pdf
*
* This component is a "weighted summer".  It has a (user specified)
* number of HAL_BIT input pins, and a HAL_S32 parameter corresponding
* to each bit input.
* There is one HAL_S32 output.  The output value is the sum of the
* parameters for which the corresponding bit input is true.
*
* The default value for the parameters is 2^n, where n is the bit number.
* Default behavior results in a binary -> unsigned conversion.
*
* There is one array parameter at module load time, the number of bits for
* each weighted summer.  There is a limit of 8 weighted summers, and each
* may have up to 16 input bits.
*
*********************************************************************
*
* Author: Stephen Wille Padnos (swpadnos AT sourceforge DOT net)
*       Based on a work by John Kasunich
* License: GPL Version 2
* Created on: May 17, 2006
* System: Linux
*
* Copyright (c) 2006 All rights reserved.
*
********************************************************************/

#include "rtapi.h"		/* RTAPI realtime OS API */
#include "rtapi_app.h"		/* RTAPI realtime module decls */
#include "hal.h"		/* HAL public API decls */

#define MAX_SUMMERS	8
#define MAX_SUM_BITS	16

/* module information */
MODULE_AUTHOR("Stephen Wille Padnos");
MODULE_DESCRIPTION("Weighted Summer for EMC HAL");
MODULE_LICENSE("GPL");
int wsum_sizes[MAX_SUMMERS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
RTAPI_MP_ARRAY_INT(wsum_sizes, MAX_SUMMERS, "Sizes of up to 8 weighted summers");

/***********************************************************************
*                STRUCTURES AND GLOBAL VARIABLES                       *
************************************************************************/

/* Data needed for each bit of a weighted summer */
typedef struct {
    hal_bit_t *bit;		/* pin: the input bit HAL pin */
    hal_s32_t *weight;		/* pin: the numeric weight of this pin */
} wsum_bit_t;

/* Base data for a weighted summer. */
typedef struct {
    hal_s32_t *sum;		/* output pin: the calculated sum */
    hal_s32_t *offset;		/* pin: offset for this summer */
    hal_bit_t *hold;		/* input pin: hold value if 1, update if 0 */
    int num_bits;		/* internal: How many bits are in this summer */
    wsum_bit_t *bits;		/* internal: pointer to the input bits and weights */
} wsum_t;

/* pointer to array of wsum structs in shmem */
static wsum_t *wsum_array;
static wsum_bit_t *wsum_bit_array;

/* other globals */
static int comp_id;		/* component ID */
static int num_summers;		/* number of summers created */

/***********************************************************************
*                  LOCAL FUNCTION DECLARATIONS                         *
************************************************************************/

static int export_wsum(int num, int num_bits, wsum_t *addr, wsum_bit_t *bitaddr);
static void process_wsums(void *arg, long period);

/***********************************************************************
*                       INIT AND EXIT CODE                             *
************************************************************************/

int rtapi_app_main(void)
{
    int n, total_bits, retval;

    total_bits = 0;

    /* check that there's at least one valid summer requested */
    for (n = 0; n < MAX_SUMMERS && wsum_sizes[n] != -1 ; n++) {
	if ((wsum_sizes[n] > MAX_SUM_BITS) || (wsum_sizes[n]<1)) {
	    rtapi_print_msg(RTAPI_MSG_ERR,
			    "WEIGHTED_SUM: ERROR: Invalid number of bits '%i' for summer %i\n",
			    wsum_sizes[n], n);
	    return -1;
	} else {
	    num_summers++;
	    total_bits += wsum_sizes[n];
	}
    }

    if (num_summers == 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: no summers specified\n");
	return -1;
    }

    /* have good config info, connect to the HAL */
    comp_id = hal_init("weighted_sum");
    if (comp_id < 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: hal_init() failed\n");
	return -1;
    }
    /* allocate shared memory for summer base info */
    wsum_array = hal_malloc(num_summers * sizeof(wsum_t));
    if (wsum_array == 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: hal_malloc() for summer array failed\n");
	hal_exit(comp_id);
	return -1;
    }
    /* allocate shared memory for summer bit arrays */
    wsum_bit_array = hal_malloc(total_bits * sizeof(wsum_bit_t));
    if (wsum_bit_array == 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: hal_malloc() for summer bit array failed\n");
	hal_exit(comp_id);
	return -1;
    }

    /* export pins/params for all summers */
    total_bits = 0;
    for (n = 0; n < num_summers; n++) {
	/* export all vars */
	retval = export_wsum(n, wsum_sizes[n], &(wsum_array[n]), &(wsum_bit_array[total_bits]));
	if (retval != 0) {
	    rtapi_print_msg(RTAPI_MSG_ERR,
		"WEIGHTED_SUM: ERROR: group %d export failed\n", n);
	    hal_exit(comp_id);
	    return -1;
	}
	total_bits += wsum_array[n].num_bits;
    }

    /* export update function */
    retval = hal_export_funct("process_wsums", process_wsums, wsum_array, 1, 0, comp_id);
    if (retval != 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: process_wsums funct export failed\n");
	return -1;
    }

    rtapi_print_msg(RTAPI_MSG_INFO,
	"WEIGHTED_SUM: installed %d weighted summers\n", num_summers);
    hal_ready(comp_id);
    return 0;
}

void rtapi_app_exit(void)
{
    hal_exit(comp_id);
}

/***********************************************************************
*                     REALTIME DELAY FUNCTION                          *
************************************************************************/

/*  The summer works by checking the input bits, and adding the
    weight to the sum if the input is true.
*/
static void process_wsums(void *arg, long period)
{
    wsum_t *wsums, *thissum;
    int n, b, running_total;

    /* point to filter group */
    wsums = (wsum_t *)arg;

    for (n=0 ; n<num_summers ; n++) {
	thissum = &(wsums[n]);
	if (*(thissum->hold)) continue;
	else {
	    running_total = *(thissum->offset);
	    for (b=0 ; b<thissum->num_bits ; b++) {
		if (*(thissum->bits[b].bit)) {
		    running_total += *(thissum->bits[b].weight);
		}
	    }
	}
	*(thissum->sum) = running_total;
    }
}

/***********************************************************************
*                   LOCAL FUNCTION DEFINITIONS                         *
************************************************************************/

static int export_wsum(int num, int num_bits, wsum_t *addr, wsum_bit_t *bitaddr)
{
    int retval, i, w;
    char buf[HAL_NAME_LEN+1], base[HAL_NAME_LEN+1];

    rtapi_snprintf(base, sizeof(base), "wsum.%d", num);
    /* export pin for offset (input) */
    rtapi_snprintf(buf, sizeof(buf), "%s.offset", base);
    retval = hal_pin_s32_new(buf, HAL_IO, &(addr->offset), comp_id);
    if (retval != 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: '%s' param export failed\n", buf);
	return retval;
    }

    /* export pin for output sum */
    rtapi_snprintf(buf, sizeof(buf), "%s.sum", base);
    retval = hal_pin_s32_new(buf, HAL_OUT, &(addr->sum), comp_id);
    if (retval != 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: '%s' pin export failed\n", buf);
	return retval;
    }

    /* export pin for update hold */
    rtapi_snprintf(buf, sizeof(buf), "%s.hold", base);
    retval = hal_pin_bit_new(buf, HAL_IN, &(addr->hold), comp_id);
    if (retval != 0) {
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: '%s' pin export failed\n", buf);
	return retval;
    }

    addr->bits = bitaddr;
    addr->num_bits = num_bits;
    /* export the input bits and weight parameters, and set the default weights */
    w = 1;
    for (i=0;i<num_bits;i++) {
	rtapi_snprintf(buf, sizeof(buf), "%s.bit.%d.in", base, i);
	retval = hal_pin_bit_new(buf, HAL_IN, &(addr->bits[i].bit), comp_id);
	if (retval != 0) {
	    rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: '%s' pin export failed\n", buf);
	    return retval;
	}
	rtapi_snprintf(buf, sizeof(buf), "%s.bit.%d.weight", base, i);
	retval = hal_pin_s32_new(buf, HAL_IO, &(addr->bits[i].weight), comp_id);
	if (retval != 0) {
	    rtapi_print_msg(RTAPI_MSG_ERR,
	    "WEIGHTED_SUM: ERROR: '%s' param export failed\n", buf);
	    return retval;
	}
	*(addr->bits[i].weight) = w;
	w <<= 1;
    }

    /* set initial parameter and pin values */
    *(addr->offset) = 0;
    *(addr->sum) = 0;
    return 0;
}
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Serg »

Не, ну можно собрать на мультиплексорах/сумматорах...

P.S. А твой разве правильно работает?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

UAVpilot писал(а):А твой разве правильно работает?
на трех вкладках вроде бы нормально(конечно проверка эта - пару раз попереключал туда-сюда)))
зы
вот так в хал:

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

loadrt select8 
addf select8.0 servo-thread  
net cin0  halui.mode.is-manual select8.0.in0
net cin1  halui.mode.is-mdi    select8.0.in1
net cin2  halui.mode.is-auto   select8.0.in2
net  ftab  select8.0.out  pyvcp.tabs.0.raise
(здесь в select8 просто внес изменения)
Последний раз редактировалось nkp 22 ноя 2013, 15:55, всего редактировалось 1 раз.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Сергей Саныч »

Если я правильно понял, тут нужен шифратор, который номер входа преобразует в двоичный код. В принципе, если назначить входам WEIGHTED_SUM веса 0, 1, 2, 3, 4... то работать должен. Только если одновременно на несколько входов подать 1, будет слегка неправильно :thinking:
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение nkp »

Serg-tmn писал(а):будет слегка неправильно
ну конкретно в твоем случае это не страшно (да и в других тоже)
ну не та вкладка откроется - на безопасности это не отразится...
==========
да и не могут сразу два режима емс быть активными...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Сергей Саныч »

nkp писал(а):ну конкретно в твоем случае это не страшно (да и в других тоже)
Кстати, твой select8 более корректно сработает - выдаст максимальный номер из задействованных.

PS: Всем спасибо за помощь. Попробовать, скорее всего раньше понедельника не получится.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Сергей Саныч »

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

Re: Вкладки в pyvcp. Автопереключение

Сообщение Nick »

Serg-tmn писал(а):Один момент - не работает ручное переключение. Точнее, переключается, но немедленно возвращается в состояние, указанное в raise.
Не совсем понял... поясни подробнее...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Сергей Саныч »

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

Re: Вкладки в pyvcp. Автопереключение

Сообщение Nick »

Serg-tmn писал(а):Ну то есть вот у нас две вкладки. Какая активна - задается raise. И мы жестко к этому сигналу привязаны. Щелкаем по табам - на мгновение высвечивается другая вкладка и сразу возвращается первая. В общем, хотелось бы более гибкого управления. Но для этого нужен пин, дающий информацию о номере текущей вкладки.
хммм... это наверно баг, шас посмотрим...


Эт все потому, что nkp кое что убрал из моего кода :)
вот сюда:
nkp писал(а):

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

def update(self, pycomp):
       u = bwidget.NoteBook.raise_page(self,self.names[pycomp[self.raise_pin]])
надо бы добавить проверку изменения пина...
Т.е. что-то вроде

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

   def update(self, pycomp): 
      newvalue = pycomp[self.raise_pin]
      if newvalue != self.raise_pin_value:
         u = bwidget.NoteBook.raise_page(self,self.names[pycomp[self.raise_pin]])
         self.raise_pin_value = newvalue
      pycomp[self.current_pin] = bwidget.NoteBook.raise_page(self)
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Сергей Саныч »

Ругается при запуске

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

  File "/usr/lib/pymodules/python2.6/pyvcp_widgets.py", line 748, in update
    if newvalue != self.raise_pin_value:
AttributeError: pyvcp_tabs instance has no attribute 'raise_pin_value'
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Вкладки в pyvcp. Автопереключение

Сообщение Nick »

в __init__ добавь:

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

       self.raise_pin_value = 0
Ответить

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