• We recently switched our forum platform. If you experience any issues please email support@crystalfontz.com

Anyone interested in Unix code for 633?

Do you want me to post sample Unix code?

  • yes

    Votes: 2 100.0%
  • no/don't care!

    Votes: 0 0.0%

  • Total voters
    2
  • Poll closed .

jrmbadger

New member
I could post some sample linux code for the 633 that does some
simple input/output..... I will only do this if people are interested... vote below!

:cool:
Looking for additional LCD resources? Check out our LCD blog for the latest developments in LCD technology.
 
USB LCD Displays - Graphic and Character LCDs with a Keypad

ediaz

New member
I would want to see that code

I want to do some work with 633. Sample code would be very usefull
 

richk449

New member
yes

i have no idea how to vote on the poll, so i will post a yes here

In case anyone is interested, here is why I would like to see it:

i have a 632 that I am working with right now - its going to be the display for a linux mp3 player. I have been working with the code by Herbert Rosmanith listed on the software page. All that I am doing right now is a simple commandline program that will display whatever lines of text you give it as arguements. so i say:

./lcdtest "Counting Crows" "Long December"

and the lcd displays"
Counting Crows
Long December

Then I just plan on calling the little program using the system command in perl, which is what the rest of my control software is written in.

Herberts code has almost everything done - so it is just a matter of making a couple of simple modifications.
 

jrmbadger2

New member
HERE IS SOME UNIX CODE!

Sorry it took so long, but I forgot my password, and I closed my email account, so I couldn't get the password. Anyway (if you haven't figured it out, I am jrmbadger, just posting under jrmbadger2).....


here is some unix code .......
Note that the crc function is copied and pasted straight from the lcd software from crystalfontz.

In unix the serial port can be accessed just like a regular file.
To receive input from say a 633, you would just have to do a
read() command. In a more advanced program I am working on, I use a select statement to multiplex my input and output ....
for more info on read() write() and select() you can do a man read, man write, man select at the unix prompt. The termios just sets terminal i/o settings, and the settings I found by tweaking things. In this example I write the command packet one param. at a time... you might be able to write the packet all at once... but I'm not sure if the serial port is fast enough or not. also notice that my CRC is hardcoded here..... to do it dynamically dependant on packet info, you have to do something like

packet.CRC.as_word = get_crc((ubyte*)&packet,data_length+2,0xFFFF);

the data_length+2 = length of data + 2 bytes for the header.

If people want something more advanced, maybe with some reading and writing, I could definitely post some of that as well.
It's actually fairly simple stuff, once you figure out the tips/tricks.

If you have questions/comments, just contact me.



#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

typedef unsigned char ubyte;
typedef signed char sbyte;
typedef unsigned short word;
typedef unsigned long dword;
typedef union
{
ubyte
as_bytes[2];
word
as_word;
}WORD_UNION;

typedef struct
{
ubyte
command;
ubyte
data_length;
char
data[16];
WORD_UNION
CRC;
}COMMAND_PACKET;
word get_crc(char *bufptr,word len,word seed);

int main(void)
{
int fd;
COMMAND_PACKET data;
int i = 0;
struct termios termios;

COMMAND_PACKET packet;
packet.command = 7;
packet.data_length = 16;
strncpy(packet.data,"Hello! ",16);
packet.data[15]=' ';
packet.CRC.as_word = 0x19da;

fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_SYNC);
if(fd == -1)
{
printf("\n file didn't open \n");
return -1;
}
fcntl(fd,F_SETFL,0);
if(tcgetattr(fd,&termios)==-1)
{
printf("\n crap \n");
return -1;
}

termios.c_cflag &=~PARENB;
termios.c_cflag &=~CSTOPB;
termios.c_cflag |= CS8;

cfsetospeed(&termios,B19200);
cfsetispeed(&termios,B19200);
if(tcsetattr(fd,TCSANOW,&termios)==-1)
{
printf("\n sleep needed \n");
return -1;
}
usleep(850000);
write(fd,&packet.command,1);
write(fd,&packet.data_length,1);
for(i = 0;i<16;i++)
write(fd,&packet.data,1);
write(fd,&packet.CRC.as_bytes[0],1);
write(fd,&packet.CRC.as_bytes[1],1);
usleep(850000);
close(fd);
return(0);
}
word get_crc(char *bufptr,word len,word seed)
{
//CRC lookup table to avoid bit-shifting loops.
static const word crcLookupTable[256] =
{0x00000,0x01189,0x02312,0x0329B,0x04624,0x057AD,0x06536,0x074BF,
0x08C48,0x09DC1,0x0AF5A,0x0BED3,0x0CA6C,0x0DBE5,0x0E97E,0x0F8F7,
0x01081,0x00108,0x03393,0x0221A,0x056A5,0x0472C,0x075B7,0x0643E,
0x09CC9,0x08D40,0x0BFDB,0x0AE52,0x0DAED,0x0CB64,0x0F9FF,0x0E876,
0x02102,0x0308B,0x00210,0x01399,0x06726,0x076AF,0x04434,0x055BD,
0x0AD4A,0x0BCC3,0x08E58,0x09FD1,0x0EB6E,0x0FAE7,0x0C87C,0x0D9F5,
0x03183,0x0200A,0x01291,0x00318,0x077A7,0x0662E,0x054B5,0x0453C,
0x0BDCB,0x0AC42,0x09ED9,0x08F50,0x0FBEF,0x0EA66,0x0D8FD,0x0C974,
0x04204,0x0538D,0x06116,0x0709F,0x00420,0x015A9,0x02732,0x036BB,
0x0CE4C,0x0DFC5,0x0ED5E,0x0FCD7,0x08868,0x099E1,0x0AB7A,0x0BAF3,
0x05285,0x0430C,0x07197,0x0601E,0x014A1,0x00528,0x037B3,0x0263A,
0x0DECD,0x0CF44,0x0FDDF,0x0EC56,0x098E9,0x08960,0x0BBFB,0x0AA72,
0x06306,0x0728F,0x04014,0x0519D,0x02522,0x034AB,0x00630,0x017B9,
0x0EF4E,0x0FEC7,0x0CC5C,0x0DDD5,0x0A96A,0x0B8E3,0x08A78,0x09BF1,
0x07387,0x0620E,0x05095,0x0411C,0x035A3,0x0242A,0x016B1,0x00738,
0x0FFCF,0x0EE46,0x0DCDD,0x0CD54,0x0B9EB,0x0A862,0x09AF9,0x08B70,
0x08408,0x09581,0x0A71A,0x0B693,0x0C22C,0x0D3A5,0x0E13E,0x0F0B7,
0x00840,0x019C9,0x02B52,0x03ADB,0x04E64,0x05FED,0x06D76,0x07CFF,
0x09489,0x08500,0x0B79B,0x0A612,0x0D2AD,0x0C324,0x0F1BF,0x0E036,
0x018C1,0x00948,0x03BD3,0x02A5A,0x05EE5,0x04F6C,0x07DF7,0x06C7E,
0x0A50A,0x0B483,0x08618,0x09791,0x0E32E,0x0F2A7,0x0C03C,0x0D1B5,
0x02942,0x038CB,0x00A50,0x01BD9,0x06F66,0x07EEF,0x04C74,0x05DFD,
0x0B58B,0x0A402,0x09699,0x08710,0x0F3AF,0x0E226,0x0D0BD,0x0C134,
0x039C3,0x0284A,0x01AD1,0x00B58,0x07FE7,0x06E6E,0x05CF5,0x04D7C,
0x0C60C,0x0D785,0x0E51E,0x0F497,0x08028,0x091A1,0x0A33A,0x0B2B3,
0x04A44,0x05BCD,0x06956,0x078DF,0x00C60,0x01DE9,0x02F72,0x03EFB,
0x0D68D,0x0C704,0x0F59F,0x0E416,0x090A9,0x08120,0x0B3BB,0x0A232,
0x05AC5,0x04B4C,0x079D7,0x0685E,0x01CE1,0x00D68,0x03FF3,0x02E7A,
0x0E70E,0x0F687,0x0C41C,0x0D595,0x0A12A,0x0B0A3,0x08238,0x093B1,
0x06B46,0x07ACF,0x04854,0x059DD,0x02D62,0x03CEB,0x00E70,0x01FF9,
0x0F78F,0x0E606,0x0D49D,0x0C514,0x0B1AB,0x0A022,0x092B9,0x08330,
0x07BC7,0x06A4E,0x058D5,0x0495C,0x03DE3,0x02C6A,0x01EF1,0x00F78};

//Initial CRC value is 0x0FFFF.
register word
newCrc;
// newCrc=0xFFFF;
newCrc=seed;
//This algorithim is based on the IrDA LAP example.
while(len--)
newCrc = (newCrc >> 8) ^ crcLookupTable[(newCrc ^ *bufptr++) & 0xff];

/*


ubyte
b1,b2,b3,b4;
word
w1,w2,w3,w4;
while(len--)
{
b1=*bufptr++;
w1=newCrc;
w2=w1 ^ b1;
b2=w2 & 0xff;
w3=crcLookupTable[b2];
w4=newCrc >> 8;
newCrc=w4 ^ w3;
}
*/
//Make this crc match the one's complement that is sent in the packet.
return(~newCrc);
}





Hope this helps!
:cool:
 
Top