/* Returns 0 if everything is right, -1 if an error occured while sending */ static ssize_t brl_writePacket(BrailleDisplay *brl, const void *packet, size_t size) { const unsigned char *p = packet; int lgtho = 1; unsigned char obuf[MAXPACKETSIZE]; const unsigned char *x; unsigned char *y = obuf; unsigned char chksum=0; int i,res; *y++ = 02; for (x=p; (x-p) < size; x++) { chksum ^= *x; if ((*x) <= 5) { *y = 01; y++; lgtho++; *y = ( *x ) | 0x40; } else *y = *x; y++; lgtho++; } if (chksum<=5) { *y = 1; y++; lgtho++; chksum |= 0x40; } *y = chksum; y++; lgtho++; *y = 3; y++; lgtho++; for (i=1; i<=5; i++) { if (serialWriteData(serialDevice,obuf,lgtho) != lgtho) continue; /* write failed, retry */ serialAwaitOutput(serialDevice); serialAwaitInput(serialDevice, 1000); res = serialReadData(serialDevice,&chksum,1,0,0); if ((res==1) && (chksum == 0x04)) return 0; } return (-1); }
static int serialWriteAttributes (SerialDevice *serial, const SerialAttributes *attributes) { if (!serialCompareAttributes(attributes, &serial->currentAttributes)) { if (!serialAwaitOutput(serial)) return 0; if (!serialPutAttributes(serial, attributes)) return 0; serialCopyAttributes(&serial->currentAttributes, attributes); } return 1; }