diff --git a/src/common.h b/src/common.h index 922523a81d9ff1adff9da275f7485d2ef6e9e012..cdb4d1d15b5ae1d9e1d97f611169e786d81967ce 100644 --- a/src/common.h +++ b/src/common.h @@ -1,4 +1,13 @@ +#define CMD_PIXEL 0 + struct pixel { int x, y; uint8_t bright; }; + +struct packet { + uint8_t cmd; + union { + struct pixel pixel; + }; +}; diff --git a/src/mensactrl.c b/src/mensactrl.c index 1e3c371a97fb3a18dd3d56d31994b090e7d71b93..eb3523eb8023fdd1199d65793097e30db96c7243 100644 --- a/src/mensactrl.c +++ b/src/mensactrl.c @@ -58,35 +58,35 @@ static void blit_area(struct mensa_fb *mensafb, const int col, const int row, return; for (r = row; r < row + height; r++) { - for (c = col; c < col + width; c++) { - /* Calculate module and position inside the module */ - vmpos = r/(LINES_PER_MODULE*ROWS_PER_LINE); - vpos = r%(LINES_PER_MODULE*ROWS_PER_LINE); - hmpos = c/(COLS_PER_MODULE); - hpos = c%(COLS_PER_MODULE); + for (c = col; c < col + width; c++) { + /* Calculate module and position inside the module */ + vmpos = r/(LINES_PER_MODULE*ROWS_PER_LINE); + vpos = r%(LINES_PER_MODULE*ROWS_PER_LINE); + hmpos = c/(COLS_PER_MODULE); + hpos = c%(COLS_PER_MODULE); - pos = hpos + hmpos*COLS_PER_MODULE*LINES_PER_MODULE; + pos = hpos + hmpos*COLS_PER_MODULE*LINES_PER_MODULE; - if (vpos >= ROWS_PER_LINE) { - vpos -= ROWS_PER_LINE; - pos += COLS_PER_MODULE; - } + if (vpos >= ROWS_PER_LINE) { + vpos -= ROWS_PER_LINE; + pos += COLS_PER_MODULE; + } /* Invert order */ - pos = (LINES_PER_MODULE * COLS_PER_MODULE * mensafb->hmodules - 1) - pos; + pos = (LINES_PER_MODULE * COLS_PER_MODULE * mensafb->hmodules - 1) - pos; /* Add in row offset */ - pos = pos + vpos*(mensafb->hmodules*COLS_PER_MODULE*LINES_PER_MODULE); + pos = pos + vpos*(mensafb->hmodules*COLS_PER_MODULE*LINES_PER_MODULE); if (mensafb->inputfb[c + r * mensafb->x_res] == 0) { - /* clear bit */ - mensafb->fbmem[pos] &= ~(1<<(mensafb->vmodules - 1 - vmpos)); - } else { - /* set bit */ - mensafb->fbmem[pos] |= (1<<(mensafb->vmodules - 1 - vmpos)); - } - } + /* clear bit */ + mensafb->fbmem[pos] &= ~(1<<(mensafb->vmodules - 1 - vmpos)); + } else { + /* set bit */ + mensafb->fbmem[pos] |= (1<<(mensafb->vmodules - 1 - vmpos)); + } + } } } @@ -95,6 +95,7 @@ void encodeToFb(struct mensa_fb *mensafb) { blit_area(mensafb, 0, 0, mensafb->x_res, mensafb->y_res); } + // int pix, row, cols, idx, fbidx, i, ledrow; // uint16_t pattern; // @@ -178,6 +179,17 @@ static struct mensa_fb *setup_fb(const char *devname, int hmodules, int vmodules return mensafb; } +void handlePixel(struct mensa_fb *mensafb, struct pixel *pix) { + setPixel(mensafb, pix->x, pix->y, pix->bright); + blit_area(mensafb, pix->x, pix->y, 1, 1); +} + +void handleCommand(struct mensa_fb *mensafb, struct packet *p) { + switch(p->cmd) { + case CMD_PIXEL: handlePixel(mensafb, &p->pixel); break; + } +} + int main(int argc, char *argv[]) { struct mensa_fb *mensafb; void *context = zmq_ctx_new (); @@ -194,11 +206,24 @@ int main(int argc, char *argv[]) { mensafb = setup_fb(argv[1], 12, 5); while (1) { - struct pixel pix; - zmq_recv(responder, &pix, sizeof(pix), 0); - setPixel(mensafb, pix.x, pix.y, pix.bright); - zmq_send(responder, &pix, sizeof(pix), 0); - encodeToFb(mensafb); + int64_t more; + size_t more_size = sizeof(more); + + do { + zmq_msg_t message; + zmq_msg_init (&message); + zmq_msg_recv (&message, responder, 0); + + if(zmq_msg_size(&message)) { + handleCommand(mensafb, (struct packet *)zmq_msg_data(&message)); + } + + zmq_getsockopt (responder, ZMQ_RCVMORE, &more, &more_size); + + zmq_msg_close (&message); + } while(more); + + zmq_send(responder, NULL, 0, 0); } return 0;