This commit is contained in:
2020-09-03 14:20:41 +02:00
parent 59f4c2d972
commit fb44b8b237

View File

@ -65,12 +65,10 @@ void frontendReset() {
void loopControl(bool v) { void loopControl(bool v) {
if (v) { if (v) {
loopActiveFlag = true;
digitalWrite(LOOP_ENABLE, HIGH); digitalWrite(LOOP_ENABLE, HIGH);
msleep(25); msleep(25);
digitalWrite(LOOP_ENABLE, LOW); digitalWrite(LOOP_ENABLE, LOW);
} else { } else {
loopActiveFlag = false;
digitalWrite(LOOP_DISABLE, HIGH); digitalWrite(LOOP_DISABLE, HIGH);
digitalWrite(LOOP_DISABLE, LOW); digitalWrite(LOOP_DISABLE, LOW);
} }
@ -84,9 +82,11 @@ void frontendHold() {
digitalWrite(FRONTEND_SAMPLE_HOLD, HIGH); digitalWrite(FRONTEND_SAMPLE_HOLD, HIGH);
} }
void loopFailureISR() { void loopStatusISR() {
loopActiveFlag = false; loopActiveFlag = digitalRead(LOOP_STATUS) == LOW;
ledRed(true); if (! loopActiveFlag) {
ledRed(true);
}
} }
@ -101,6 +101,10 @@ void myExit(int e) {
void init() { void init() {
if (verbose) {
fprintf(stderr, "setting up gpios\n");
}
wiringPiSetupGpio(); wiringPiSetupGpio();
pinMode(LOOP_ENABLE, OUTPUT); pinMode(LOOP_ENABLE, OUTPUT);
@ -124,7 +128,7 @@ void init() {
pinMode(LOOP_STATUS, INPUT); pinMode(LOOP_STATUS, INPUT);
pullUpDnControl(LOOP_STATUS, PUD_UP); pullUpDnControl(LOOP_STATUS, PUD_UP);
wiringPiISR(LOOP_STATUS, INT_EDGE_RISING, loopFailureISR); wiringPiISR(LOOP_STATUS, INT_EDGE_BOTH, loopStatusISR);
frontendReset(); frontendReset();
@ -134,14 +138,14 @@ void init() {
int openSerial(char *serialDevice, uint32_t speedNum) { int openSerial(char *serialDevice, uint32_t speedNum) {
int fd = open(serialDevice, O_RDWR | O_NOCTTY | O_SYNC); int fd = open(serialDevice, O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) { if (fd < 0) {
fprintf(stderr, "Error %d opening serial device %s: %s\n", fprintf(stderr, "error %d opening serial device %s: %s\n",
errno, serialDevice, strerror(errno)); errno, serialDevice, strerror(errno));
return -1; return -1;
} }
struct termios tty; struct termios tty;
if (tcgetattr(fd, &tty) != 0) { if (tcgetattr(fd, &tty) != 0) {
fprintf(stderr, "Error %d getting attributes for serial device %s: %s\n", fprintf(stderr, "error %d getting attributes for serial device %s: %s\n",
errno, serialDevice, strerror(errno)); errno, serialDevice, strerror(errno));
return -1; return -1;
} }
@ -155,7 +159,7 @@ int openSerial(char *serialDevice, uint32_t speedNum) {
speed = B2400; speed = B2400;
break; break;
default: default:
fprintf(stderr, "Speed %d not supported\n", speedNum); fprintf(stderr, "speed %d not supported\n", speedNum);
return -1; return -1;
} }
cfsetospeed(&tty, speed); cfsetospeed(&tty, speed);
@ -176,7 +180,7 @@ int openSerial(char *serialDevice, uint32_t speedNum) {
tty.c_iflag |= IGNBRK; tty.c_iflag |= IGNBRK;
if (tcsetattr(fd, TCSANOW, &tty) != 0) { if (tcsetattr(fd, TCSANOW, &tty) != 0) {
fprintf(stderr, "Error %d setting attributes for serial device %s: %s\n", fprintf(stderr, "error %d setting attributes for serial device %s: %s\n",
errno, serialDevice, strerror(errno)); errno, serialDevice, strerror(errno));
return -1; return -1;
} }
@ -195,7 +199,7 @@ void closeSerial(int fd) {
t_longframe *request(int fd, uint8_t cmd, uint8_t addr) { t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
t_longframe *frame = (t_longframe*) malloc(sizeof(t_longframe)); t_longframe *frame = (t_longframe*) malloc(sizeof(t_longframe));
if (! frame) { if (! frame) {
fprintf(stderr, "Unable to allocate memory for frame\n"); fprintf(stderr, "unable to allocate memory for frame\n");
return NULL; return NULL;
} }
frame->userdata = NULL; frame->userdata = NULL;
@ -215,7 +219,7 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
while (1) { while (1) {
int r; int r;
if (ioctl(fd, TIOCSERGETLSR, &r) == -1) { if (ioctl(fd, TIOCSERGETLSR, &r) == -1) {
fprintf(stderr, "Error %d getting TIOCSERGETLSR for fd %d: %s\n", fprintf(stderr, "error %d getting TIOCSERGETLSR for fd %d: %s\n",
errno, fd, strerror(errno)); errno, fd, strerror(errno));
errno = ERROR_APP_SPECIFIC_ERROR_FLAG | ERROR_TX_REG_UNACCESSIBLE; errno = ERROR_APP_SPECIFIC_ERROR_FLAG | ERROR_TX_REG_UNACCESSIBLE;
return NULL; return NULL;
@ -237,7 +241,7 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
(state != e_TIMEOUT)) { (state != e_TIMEOUT)) {
if (verbose) { if (verbose) {
fprintf(stderr, "Waiting for input ...\n"); fprintf(stderr, "waiting for input ...\n");
} }
uint8_t c; uint8_t c;
ssize_t s = read(fd, &c, 1); ssize_t s = read(fd, &c, 1);
@ -248,7 +252,7 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
} }
if (verbose) { if (verbose) {
fprintf(stderr, "State %d, Octet %02x\n", state, c); fprintf(stderr, "state %d, Octet %02x\n", state, c);
} }
switch(state) { switch(state) {
@ -257,19 +261,19 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
frame->start1 = c; frame->start1 = c;
state = e_LENGTH1; state = e_LENGTH1;
} else { } else {
fprintf(stderr, "Invalid start1 symbol %02x\n", c); fprintf(stderr, "invalid start1 symbol %02x\n", c);
state = e_ERROR; state = e_ERROR;
} }
break; break;
case e_LENGTH1: case e_LENGTH1:
if (c <= 3) { if (c <= 3) {
fprintf(stderr, "Length to small %02x\n", c); fprintf(stderr, "length to small %02x\n", c);
state = e_ERROR; state = e_ERROR;
} else { } else {
frame->length1 = c; frame->length1 = c;
frame->userdata = (uint8_t*) malloc(frame->length1 - 3); frame->userdata = (uint8_t*) malloc(frame->length1 - 3);
if (! frame->userdata) { if (! frame->userdata) {
fprintf(stderr, "Unable to allocate memory for userdata\n"); fprintf(stderr, "unable to allocate memory for userdata\n");
state = e_ERROR; state = e_ERROR;
} }
state = e_LENGTH2; state = e_LENGTH2;
@ -277,7 +281,7 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
break; break;
case e_LENGTH2: case e_LENGTH2:
if (frame->length1 != c) { if (frame->length1 != c) {
fprintf(stderr, "Invalid length2 %02x vs. %02x\n", frame->length1, c); fprintf(stderr, "invalid length2 %02x vs. %02x\n", frame->length1, c);
state = e_ERROR; state = e_ERROR;
} else { } else {
frame->length2 = c; frame->length2 = c;
@ -289,7 +293,7 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
frame->start2 = c; frame->start2 = c;
state = e_C_FIELD; state = e_C_FIELD;
} else { } else {
fprintf(stderr, "Invalid start2 symbol %02x\n", c); fprintf(stderr, "invalid start2 symbol %02x\n", c);
state = e_ERROR; state = e_ERROR;
} }
break; break;
@ -318,7 +322,7 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
break; break;
case e_CHKSUM: case e_CHKSUM:
if (c != calculatedChksum) { if (c != calculatedChksum) {
fprintf(stderr, "Invalid checksum %02x vs %02x\n", calculatedChksum, c); fprintf(stderr, "invalid checksum %02x vs %02x\n", calculatedChksum, c);
state = e_ERROR; state = e_ERROR;
} else { } else {
frame->chksum = c; frame->chksum = c;
@ -330,12 +334,12 @@ t_longframe *request(int fd, uint8_t cmd, uint8_t addr) {
frame->stop = c; frame->stop = c;
state = e_DONE; state = e_DONE;
} else { } else {
fprintf(stderr, "Invalid stop symbol %02x\n", c); fprintf(stderr, "invalid stop symbol %02x\n", c);
state = e_ERROR; state = e_ERROR;
} }
break; break;
default: default:
fprintf(stderr, "Illegal state %d\n", state); fprintf(stderr, "illegal state %d\n", state);
state = e_ERROR; state = e_ERROR;
break; break;
} }
@ -434,10 +438,11 @@ int main(int argc, char *argv[]) {
if (verbose) { if (verbose) {
fprintf(stderr, "Opening device\n"); fprintf(stderr, "opening device\n");
} }
int fd = openSerial(DEFAULT_SERIAL_DEVICE, 2400); int fd = openSerial(DEFAULT_SERIAL_DEVICE, 2400);
if (fd == -1) { if (fd == -1) {
fprintf(stderr, "unable to open device, fatal error\n");
myExit(-1); myExit(-1);
} }
@ -503,7 +508,7 @@ int main(int argc, char *argv[]) {
} }
if (verbose) { if (verbose) {
fprintf(stderr, "Closing device\n"); fprintf(stderr, "closing device\n");
} }
closeSerial(fd); closeSerial(fd);