[GTER] Display ServerU

Patrick Tracanelli eksffa at freebsdbrasil.com.br
Mon Feb 1 19:49:37 -02 2016


Exatamente, o primeiro passo é como o Alexandre mencionou, ter o device.
Tanto LCM, keypad quanto controle programável de bypass vão precisar de modulos complementares.

Ja passou dessa fase? Os downloads dos módulos de kernel tanto pro display quanto do keypad em:

http://main.mia.serveru.us/pub/l/ServerU/plcm/

Voce precisa compilar para a mesma versão de kernel do VyOS, uma vez passando essa fase basta scriptar ou programar.

O pacote tem 2 demos escritos em C que permitem manipular, e o próprio utility que voce pode usar via shell script mesmo.

Prepare o ambiente com mesma glibc e kernel e envie o modulo pra la. O pacote ja vem com modulo compilado mas sabe como é, o ideal é vc sempre compilar vc mesmo. Se tiver problemas abra um ticket conosco :-)

http://support.serveru.us/index.php?/ServerU/Knowledgebase/Article/View/62/0/how-to-control-serveru-plcm-device-your-self
http://support.serveru.us/index.php?/ServerU/Knowledgebase/Article/View/74/0/controle-das-interfaces-bypass-no-serveru

Temos alguns usuarios de Linux que reportaram sucesso ao usar também o lcdproc quanto utility quanto daemon, ja que ele suporta uma gama de LCDs de 2 linhas em porta paralela, serial e UART. Mas o que recomendamos é o driver acima e fazer acesso direto pela utility adequada.

Seguem samples.


/*
 * ServerU PLCM Utility
 *
 * ServerU - http://www.ServerU.com.br http://www.ServerU.us
 * PLCM with 2 lines with 4 keys pad model Netmap L100 & Netmap L800
 *
 * Developed and teste for/on FreeBSD RELENG_8, RELENG_9, RELENG_10
 * Ported and tested on Linux 2.4, Linux 2.6, Linux 3.0, 3.1 and 3.2
 *
 * Porting Notes: parei de usar a &plcm e passei a mandar o (int) direto;
 * os valores dos botoes do keypad sao diferentes tambem o retorno do
 * hardware;
 *
 *
 */

#include <sys/file.h>
#include <stdio.h>
#include <string.h>
//#include "serveru-plcm-util.h"
#include "../serveru-plcm-util.h"

int main(int argc,char *argv[])
{
	int devfd;
	unsigned char tmp_str[20];
	
        if (argc < 2) {
         printf("Erro! Exemplo de uso:\n %s \"Valor na PLCM1...\" \"Valor na PLCM2...\"\n",argv[0]);
         return(1);
        }


	iopl(3);
	printf("ServerU PCL Test Sample - Write @LCM1 and @LCM2\n");
	devfd = open("/dev/plcm_drv",O_RDWR);
	if( devfd == -1 )
	{
		printf("Can not open /dev/plcm_drv\n");
		return -1;
	}
	ioctl(devfd,PLCM_IOCTL_CLEARDISPLAY,0);
	//show input string
	printf("Input1: %s\n",argv[1]);
	printf("Input2: %s\n",argv[2]);
	memset(tmp_str,0,20);
	strcpy(tmp_str,argv[1]);
	ioctl(devfd,PLCM_IOCTL_SET_LINE,1);
	write(devfd,tmp_str,20);
	memset(tmp_str,0,20);
	strcpy(tmp_str,argv[2]);
	ioctl(devfd,PLCM_IOCTL_SET_LINE,2);
	write(devfd,tmp_str,20);

	close(devfd);
	return 0;
}


#!/bin/sh
#
# ServerU PLCM Utility
#
# ServerU - http://www.ServerU.com.br http://www.ServerU.us
# PLCM with 2 lines with 4 keys pad model Netmap L100 & Netmap L800
#
# Example useless shell script
#
# Remember LCM display 1 and 2 has 21 chars limit.
#
 ./serveru-plcm-util -LCM1
 /bin/echo -n "Attention! Important!" > /dev/plcm_drv
 ./serveru-plcm-util -LCM2
 /bin/echo -n "This is just a test. " > /dev/plcm_drv

count=20

while [ $count -gt 0 ] ; do
 ./serveru-plcm-util -Off
 sleep 0.3
 ./serveru-plcm-util -On
 sleep 0.3
 count=$(( $count -1 ))
done

 ./serveru-plcm-util -On

/*
 * ServerU PLCM Utility 
 *
 * ServerU - http://www.ServerU.com.br http://www.ServerU.us
 * PLCM with 2 lines with 4 keys pad model Netmap L100 & Netmap L800
 *
 * Developed and teste for/on FreeBSD RELENG_8, RELENG_9, RELENG_10
 * Ported and tested on Linux 2.4, Linux 2.6, Linux 3.0, 3.1 and 3.2
 *
 * Porting Notes: parei de usar a &plcm e passei a mandar o (int) direto;
 * os valores dos botoes do keypad sao diferentes tambem o retorno do
 * hardware;
 *
 *
 */
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <err.h>
#include "serveru-plcm-util.h"

int usage(int devfd) {
  printf("Comando Invalido\n");
  printf("Uso: serveru-plcm-util [-stop|-On|-Off|-DispOff|-DispOn|-LCM1|-LCM2|-Keypad|-Read1|-Read2|-Clear]\n");
  printf("ServerU LCM Utility by ServerU Inc\n");
  close(devfd);
  return 0;
}

int main(int argc, char *argv[])
{
	struct _plcm plcm;
	int devfd;
	unsigned char Ret_Message1[40] = "";
	unsigned char Ret_Message2[40] = "";
	int i = 0;
	unsigned char Keypad_Value = 0, Pre_Value = 0, Counter = 0;
	unsigned char Keypad_Message[40] = "";
	unsigned char Up[]    = "Up   ";
	unsigned char Down[]  = "Down ";
	unsigned char Left[]  = "Left ";
	unsigned char Right[] = "Right"; 
	unsigned char detect_press;
	unsigned char detect_dir;
	int MaxTestTime = 1 ; // 15 Sec

	devfd = open("/dev/plcm_drv", O_RDWR);
	if(devfd == -1)
	{
		printf("Cant open: /dev/plcm_drv\n");
		return -1;
	}
	if(argc == 2)
	{
		// Inicializa Defaults ServerU
		Keypad_Message[40] = "";
		plcm.amg=0;
		ioctl(devfd, PLCM_IOCTL_DISPLAY_B, 0); // desliga blink
		ioctl(devfd, PLCM_IOCTL_DISPLAY_C, 0);

		if(strcmp("-stop", argv[1]) == 0)
		{
		    plcm.amg=0;
			ioctl(devfd, PLCM_IOCTL_STOP_THREAD, 0);
			printf("plcm_drv stopped.\n");
			close(devfd);
			return 0;
		}
		if(strcmp("-On", argv[1]) == 0)
		{
			plcm.amg=1;
			ioctl(devfd, PLCM_IOCTL_BACKLIGHT, 1);
			close(devfd);
			return 0;
		}
		if(strcmp("-Off", argv[1]) == 0)
		{
			plcm.amg=0;
			ioctl(devfd, PLCM_IOCTL_BACKLIGHT, 0);
			close(devfd);
			return 0;
		}
		if(strcmp("-LCM1", argv[1]) == 0)
		{
			plcm.amg=1;
			ioctl(devfd, PLCM_IOCTL_SET_LINE, 1);
			close(devfd);
			return 0;
		}
		if(strcmp("-LCM2", argv[1]) == 0)
		{
			
			plcm.amg=2;
			ioctl(devfd, PLCM_IOCTL_SET_LINE, 2);
			close(devfd);
			return 0;
		}
		if(strcmp("-Keypad", argv[1]) == 0)
		{
			Keypad_Message[40] = "";
			plcm.amg=1;
			ioctl(devfd, PLCM_IOCTL_SET_LINE, 1);
			do{
				plcm.amg=0;
                                //ioctl(devfd, PLCM_IOCTL_GET_KEYPAD, &plcm);
				ioctl(devfd, PLCM_IOCTL_GET_KEYPAD, 0); // Linux
				//Keypad_Value=plcm.key_value;
                                Keypad_Value=ioctl(devfd, PLCM_IOCTL_GET_KEYPAD, 0); // Linux
				detect_press=(Keypad_Value & 0x40);
				detect_dir=(Keypad_Value & 0x28);
				switch(detect_dir)
				{
                                	case 0x00:
						strcpy(Keypad_Message,"2-");
						break;
					case 0x20:
						strcpy(Keypad_Message,"1-");
						break;
					case 0x08:
						strcpy(Keypad_Message,"3-");
						break;
					case 0x28:
						strcpy(Keypad_Message,"4-");
						break;
                                
                                // Mas no Linux os valores podem ser outros
                                /*
                                        case 0xC7:
                                                strcpy(Keypad_Message, "1-");
                                                break;
                                        case 0xE7:
                                                strcpy(Keypad_Message, "2-");
                                                break;
                                        case 0xEF:
                                                strcpy(Keypad_Message, "3-");
                                                break;
                                        case 0xCF:
                                                strcpy(Keypad_Message, "4-");
                                                break;
                                 */
                                }
				switch(detect_press)
				{
                                        // Press e Release funcional igual no FreeBSD e Linux
					case 0x40:
						strcat(Keypad_Message,"Press  ");
					case 0x00:
						strcat(Keypad_Message,"Release");
				}
				//printf("Value:%x:%s\n",plcm.key_value,Keypad_Message);
                                printf("Value:%x:%s\n",Keypad_Value,Keypad_Message);
				
				plcm.amg=0;
				//write(devfd, Keypad_Message, 40);
				Pre_Value = Keypad_Value;
				MaxTestTime--;
				if(MaxTestTime == 0)
				{
					break;
				}
			}while(1);
			close(devfd);
			return 0;
		}
		if(strcmp("-DispOff", argv[1]) == 0)
		{
			plcm.amg=0;
			ioctl(devfd, PLCM_IOCTL_DISPLAY_D, 0);
			close(devfd);
			return 0;

		}
		if(strcmp("-DispOn", argv[1]) == 0)
		{
			plcm.amg=1;
			ioctl(devfd, PLCM_IOCTL_DISPLAY_D, 1);
			close(devfd);
			return 0;

		}
		if(strcmp("-Read1", argv[1]) == 0)
		{
			plcm.amg=2;
			ioctl(devfd, PLCM_IOCTL_SET_LINE, 2);
			read(devfd, Ret_Message1, sizeof(Ret_Message1));
			printf("Read LCM1: %s\n", Ret_Message1);
			close(devfd);
			return 0;
		}
		if(strcmp("-Read2", argv[1]) == 0)
		{
			plcm.amg=2;
			ioctl(devfd, PLCM_IOCTL_SET_LINE, 2);
			read(devfd, Ret_Message2, sizeof(Ret_Message2));
			printf("Read LCM2: %s\n", Ret_Message2);
			close(devfd);
			return 0;
		}
		if(strcmp("-Clear", argv[1]) == 0)
		{
			plcm.amg=0;
                        ioctl(devfd, PLCM_IOCTL_CLEARDISPLAY, 0);
                        plcm.amg=0;
                        ioctl(devfd, PLCM_IOCTL_RETURNHOME, 0);
			close(devfd); return 0;
		}
		
		usage(devfd); return 0;
	}
	usage(devfd);
}






> On 01/02/2016, at 15:47, Alexandre J. Correa (Onda) <alexandre at onda.net.br> wrote:
> 
> http://www.serveru.us/pt/doc/lcm-util
> 
> ele tem um device no /dev para gerenciar isto, no site acima fala mais sobre...
> 
> se o kernel não estiver com o driver, precisa carregar/instalar para ter acesso.
> 
> 
> Em 01/02/2016 13:31, Rafael Galdino escreveu:
>> Boa tarde srs.
>> 
>> alguém já colocou o serverU para mostrar CPU, Banda etc... no display
>> utilizando o Vyos?
>> --
>> gter list    https://eng.registro.br/mailman/listinfo/gter
> 
> 
> -- 
> Sds.
> 
> Alexandre Jeronimo Correa
> Sócio-Administrador
> 
> Office: +55 34 3351 3077
> 
> Onda Internet
> www.onda.net.br
> 
> --
> gter list    https://eng.registro.br/mailman/listinfo/gter

--
Patrick Tracanelli

FreeBSD Brasil LTDA.
Tel.: (31) 3516-0800
316601 at sip.freebsdbrasil.com.br
http://www.freebsdbrasil.com.br
"Long live Hanin Elias, Kim Deal!"




More information about the gter mailing list