|  | @@ -0,0 +1,128 @@
 | 
	
		
			
				|  |  | +/* 
 | 
	
		
			
				|  |  | + *  (c) 2004,2006 Richard Titmuss for SlimProtoLib 
 | 
	
		
			
				|  |  | + *  (c) Philippe G. 2019, philippe_44@outlook.com
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * This program is free software: you can redistribute it and/or modify
 | 
	
		
			
				|  |  | + * it under the terms of the GNU General Public License as published by
 | 
	
		
			
				|  |  | + * the Free Software Foundation, either version 3 of the License, or
 | 
	
		
			
				|  |  | + * (at your option) any later version.
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * This program is distributed in the hope that it will be useful,
 | 
	
		
			
				|  |  | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
	
		
			
				|  |  | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
	
		
			
				|  |  | + * GNU General Public License for more details.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * You should have received a copy of the GNU General Public License
 | 
	
		
			
				|  |  | + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include <string.h>
 | 
	
		
			
				|  |  | +#include <ctype.h>
 | 
	
		
			
				|  |  | +#include <arpa/inet.h>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include "esp_log.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define LINELEN 60
 | 
	
		
			
				|  |  | +#define TAG "display"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//Change special LCD chars to something more printable on screen
 | 
	
		
			
				|  |  | +unsigned char printable(unsigned char c) {
 | 
	
		
			
				|  |  | +   switch (c) {
 | 
	
		
			
				|  |  | +	  case 11:		/* block */
 | 
	
		
			
				|  |  | +		 return '#';
 | 
	
		
			
				|  |  | +	 break;;
 | 
	
		
			
				|  |  | +	  case 16:		/* rightarrow */
 | 
	
		
			
				|  |  | +		 return '>';
 | 
	
		
			
				|  |  | +	 break;;
 | 
	
		
			
				|  |  | +	  case 22:		/* circle */
 | 
	
		
			
				|  |  | +		 return '@';
 | 
	
		
			
				|  |  | +	 break;;
 | 
	
		
			
				|  |  | +	  case 145:		/* note */
 | 
	
		
			
				|  |  | +	 return ' ';
 | 
	
		
			
				|  |  | +	 break;;
 | 
	
		
			
				|  |  | +	  case 152:		/* bell */
 | 
	
		
			
				|  |  | +		 return 'o';
 | 
	
		
			
				|  |  | +	 break;;
 | 
	
		
			
				|  |  | +	  default:
 | 
	
		
			
				|  |  | +		 return c;
 | 
	
		
			
				|  |  | +	  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Replace unprintable symbols in line
 | 
	
		
			
				|  |  | +void makeprintable(unsigned char * line) {
 | 
	
		
			
				|  |  | +	for (int n=0; n < LINELEN; n++) line[n] = printable(line[n]);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Show the display
 | 
	
		
			
				|  |  | +void show_display_buffer(char *ddram) {
 | 
	
		
			
				|  |  | +	char line1[LINELEN+1];
 | 
	
		
			
				|  |  | +	char *line2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	memset(line1, 0, LINELEN+1);
 | 
	
		
			
				|  |  | +	strncpy(line1, ddram, LINELEN);
 | 
	
		
			
				|  |  | +	line2 = &(ddram[LINELEN]);
 | 
	
		
			
				|  |  | +	line2[LINELEN] = '\0';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/* Convert special LCD chars */
 | 
	
		
			
				|  |  | +	makeprintable((unsigned char *)line1);
 | 
	
		
			
				|  |  | +	makeprintable((unsigned char *)line2);
 | 
	
		
			
				|  |  | +	ESP_LOGI(TAG, "\n\t%.40s\n\t%.40s", line1, line2);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Check if char is printable, or a valid symbol
 | 
	
		
			
				|  |  | +bool charisok(unsigned char c) {
 | 
	
		
			
				|  |  | +   switch (c) {
 | 
	
		
			
				|  |  | +	  case 11:		/* block */
 | 
	
		
			
				|  |  | +	  case 16:		/* rightarrow */
 | 
	
		
			
				|  |  | +	  case 22:		/* circle */
 | 
	
		
			
				|  |  | +	  case 145:		/* note */
 | 
	
		
			
				|  |  | +	  case 152:		/* bell */
 | 
	
		
			
				|  |  | +		 return true;
 | 
	
		
			
				|  |  | +	 break;;
 | 
	
		
			
				|  |  | +	  default:
 | 
	
		
			
				|  |  | +		 return isprint(c);
 | 
	
		
			
				|  |  | +   }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Process display data
 | 
	
		
			
				|  |  | +void vfd_data( unsigned short *data, int bytes_read) {
 | 
	
		
			
				|  |  | +	unsigned short *display_data;
 | 
	
		
			
				|  |  | +	char ddram[LINELEN * 2];
 | 
	
		
			
				|  |  | +	int n;
 | 
	
		
			
				|  |  | +	int addr = 0; /* counter */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (bytes_read % 2) bytes_read--; /* even number of bytes */
 | 
	
		
			
				|  |  | +	display_data = &(data[6]); /* display data starts at byte 12 */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	memset(ddram, ' ', LINELEN * 2);
 | 
	
		
			
				|  |  | +	for (n=0; n<(bytes_read/2); n++) {
 | 
	
		
			
				|  |  | +		unsigned short d; /* data element */
 | 
	
		
			
				|  |  | +		unsigned char t, c;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		d = ntohs(display_data[n]);
 | 
	
		
			
				|  |  | +		t = (d & 0x00ff00) >> 8; /* type of display data */
 | 
	
		
			
				|  |  | +		c = (d & 0x0000ff); /* character/command */
 | 
	
		
			
				|  |  | +		switch (t) {
 | 
	
		
			
				|  |  | +			case 0x03: /* character */
 | 
	
		
			
				|  |  | +				if (!charisok(c)) c = ' ';
 | 
	
		
			
				|  |  | +				if (addr <= LINELEN * 2) {
 | 
	
		
			
				|  |  | +					ddram[addr++] = c;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +				break;
 | 
	
		
			
				|  |  | +			case 0x02: /* command */
 | 
	
		
			
				|  |  | +				switch (c) {
 | 
	
		
			
				|  |  | +					case 0x06: /* display clear */
 | 
	
		
			
				|  |  | +						memset(ddram, ' ', LINELEN * 2);
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +					case 0x02: /* cursor home */
 | 
	
		
			
				|  |  | +						addr = 0;
 | 
	
		
			
				|  |  | +						break;
 | 
	
		
			
				|  |  | +					case 0xc0: /* cursor home2 */
 | 
	
		
			
				|  |  | +						addr = LINELEN;
 | 
	
		
			
				|  |  | +						break;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	show_display_buffer(ddram);
 | 
	
		
			
				|  |  | +}
 |