From f5c19cdea41830540bcdacbaaec6121d7c7f98ce Mon Sep 17 00:00:00 2001 From: draradech Date: Sat, 31 Aug 2019 13:49:49 +0200 Subject: [PATCH 01/14] out_5a_75e: created --- src/modules/out_5a_75e.c | 200 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 src/modules/out_5a_75e.c diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c new file mode 100644 index 00000000..3356f8da --- /dev/null +++ b/src/modules/out_5a_75e.c @@ -0,0 +1,200 @@ +// 5A-75E output. +// +// Copyright (c) 2019, Draradech +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +typedef struct +{ + uint8_t b; + uint8_t g; + uint8_t r; +} RGB3; + +RGB3 frame[128][128]; +int sockfd; +struct sockaddr_ll socket_address; + +uint8_t first[] = \ +"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x01\x07\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\xff\x05\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + + +uint8_t second[] = \ +"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x0a\xff\xff\xff" \ +"\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + + +uint8_t line[] = \ +"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x55\x00\x00\x00" \ +"\x00\x00\x80\x08\x88\x7f\x00\x00\x00\x7f\x00\x00\x00\x7f\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ +"\x00\x00\x00\x00\x00"; + +int init(void) { + struct ifreq if_idx; + + /* Open RAW socket to send on */ + if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) + { + perror("socket"); + } + + /* Get the index of the interface to send on */ + memset(&if_idx, 0, sizeof(struct ifreq)); + strncpy(if_idx.ifr_name, "enp109s0", IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) + { + perror("SIOCGIFINDEX"); + } + + /* Index of the network device */ + socket_address.sll_ifindex = if_idx.ifr_ifindex; + /* Address length*/ + socket_address.sll_halen = ETH_ALEN; + /* Destination MAC */ + socket_address.sll_addr[0] = 0x11; + socket_address.sll_addr[1] = 0x22; + socket_address.sll_addr[2] = 0x33; + socket_address.sll_addr[3] = 0x44; + socket_address.sll_addr[4] = 0x55; + socket_address.sll_addr[5] = 0x66; + + return 0; +} + +int getx(int _modno) +{ + return 128; +} + +int gety(int _modno) +{ + return 128; +} + +int set(int _modno, int x, int y, RGB color) +{ + frame[y][x].r = color.red; + frame[y][x].g = color.green; + frame[y][x].b = color.blue; + return 0; +} + +RGB get(int _modno, int x, int y) +{ + return RGB(frame[y][x].r, frame[y][x].g, frame[y][x].b); +} + +int clear(int _modno) +{ + memset(frame, 0, 128 * 128 * 3); + return 0; +}; + +int render(void) +{ + /* Send first packet */ + if (sendto(sockfd, first, sizeof(first)/sizeof(first[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + { + printf("Send first failed\n"); + } + + /* Send second packet */ + if (sendto(sockfd, second, sizeof(second)/sizeof(second[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + { + printf("Send second failed\n"); + } + + for (uint8_t i = 0; i < 128; ++i) + { + line[14] = i; + memcpy(&line[21], &frame[i][0], 128 * 3); + /* Send line packet */ + if (sendto(sockfd, line, sizeof(line)/sizeof(line[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + { + printf("Send line %d failed\n", i); + } + } + + #ifndef CIMODE + //usleep(25000); + #endif + return 0; +} + +oscore_time wait_until(int _modno, oscore_time desired_usec) +{ + #ifdef CIMODE + return desired_usec; + #else + return timers_wait_until_core(desired_usec); + #endif +} + +void wait_until_break(int _modno) +{ + #ifndef CIMODE + timers_wait_until_break_core(); + #endif +} + +void deinit(int _modno) +{ +} + From 2c073bbd1d881cc77c5f8878b01066a98faeeb55 Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Fri, 6 Sep 2019 11:12:08 +0200 Subject: [PATCH 02/14] out_5a_75e: add init sequence --- src/modules/out_5a_75e.c | 140 +++++++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 21 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 3356f8da..4ef5f9cd 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -1,11 +1,11 @@ // 5A-75E output. // // Copyright (c) 2019, Draradech -// +// // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. -// +// // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR @@ -34,12 +34,95 @@ typedef struct uint8_t b; uint8_t g; uint8_t r; -} RGB3; +} BGR; -RGB3 frame[128][128]; +BGR frame[128][128]; int sockfd; struct sockaddr_ll socket_address; +uint8_t ipacket[] = \ +"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x02\x00\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ +"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ +"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ +"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ +"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ +"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00"; + uint8_t first[] = \ "\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x01\x07\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ @@ -49,7 +132,6 @@ uint8_t first[] = \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - uint8_t second[] = \ "\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x0a\xff\xff\xff" \ "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ @@ -57,7 +139,6 @@ uint8_t second[] = \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - uint8_t line[] = \ "\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x55\x00\x00\x00" \ "\x00\x00\x80\x08\x88\x7f\x00\x00\x00\x7f\x00\x00\x00\x7f\x00\x00" \ @@ -88,7 +169,7 @@ uint8_t line[] = \ int init(void) { struct ifreq if_idx; - + /* Open RAW socket to send on */ if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) { @@ -97,7 +178,7 @@ int init(void) { /* Get the index of the interface to send on */ memset(&if_idx, 0, sizeof(struct ifreq)); - strncpy(if_idx.ifr_name, "enp109s0", IFNAMSIZ-1); + strncpy(if_idx.ifr_name, "enp2s0", IFNAMSIZ-1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { perror("SIOCGIFINDEX"); @@ -115,17 +196,30 @@ int init(void) { socket_address.sll_addr[4] = 0x55; socket_address.sll_addr[5] = 0x66; + /* Send init packet */ + if (sendto(sockfd, ipacket, sizeof(ipacket)/sizeof(ipacket[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + { + printf("Send ipacket failed\n"); + } + render(); + render(); + usleep(250000); + /* Send init packet again */ + if (sendto(sockfd, ipacket, sizeof(ipacket)/sizeof(ipacket[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + { + printf("Send ipacket failed\n"); + } return 0; } int getx(int _modno) { - return 128; + return 128; } int gety(int _modno) { - return 128; + return 128; } int set(int _modno, int x, int y, RGB color) @@ -133,27 +227,28 @@ int set(int _modno, int x, int y, RGB color) frame[y][x].r = color.red; frame[y][x].g = color.green; frame[y][x].b = color.blue; - return 0; + return 0; } RGB get(int _modno, int x, int y) { - return RGB(frame[y][x].r, frame[y][x].g, frame[y][x].b); + return RGB(frame[y][x].r, frame[y][x].g, frame[y][x].b); } int clear(int _modno) { memset(frame, 0, 128 * 128 * 3); - return 0; + return 0; }; int render(void) { - /* Send first packet */ + /* Send first packet * / if (sendto(sockfd, first, sizeof(first)/sizeof(first[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { printf("Send first failed\n"); } + */ /* Send second packet */ if (sendto(sockfd, second, sizeof(second)/sizeof(second[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) @@ -171,26 +266,29 @@ int render(void) printf("Send line %d failed\n", i); } } + usleep(500); + /* Send first packet */ + if (sendto(sockfd, first, sizeof(first)/sizeof(first[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + { + printf("Send first failed\n"); + } - #ifndef CIMODE - //usleep(25000); - #endif - return 0; + return 0; } oscore_time wait_until(int _modno, oscore_time desired_usec) { #ifdef CIMODE - return desired_usec; + return desired_usec; #else - return timers_wait_until_core(desired_usec); + return timers_wait_until_core(desired_usec); #endif } void wait_until_break(int _modno) { #ifndef CIMODE - timers_wait_until_break_core(); + timers_wait_until_break_core(); #endif } From 244f583592d6d174727dea6965fa6d7e26ee634f Mon Sep 17 00:00:00 2001 From: draradech Date: Sat, 8 Feb 2020 12:42:17 +0100 Subject: [PATCH 03/14] out_5a_75e: full size --- src/modules/out_5a_75e.c | 120 +++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 4ef5f9cd..3c78e010 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -29,6 +29,9 @@ #include #include +#define WIDTH 256 +#define HEIGHT 256 + typedef struct { uint8_t b; @@ -36,7 +39,7 @@ typedef struct uint8_t r; } BGR; -BGR frame[128][128]; +BGR frame[HEIGHT][WIDTH]; int sockfd; struct sockaddr_ll socket_address; @@ -140,32 +143,56 @@ uint8_t second[] = \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; uint8_t line[] = \ -"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x55\x00\x00\x00" \ -"\x00\x00\x80\x08\x88\x7f\x00\x00\x00\x7f\x00\x00\x00\x7f\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00"; +"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x55\x00\x01\x00" \ +"\x00\x01\x00\x08\x88\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ +"\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x6f\x5f\x53\x6b" \ +"\x52\x3e\x6e\x54\x3f\x73\x58\x42\x78\x5c\x45\x7d\x60\x49\x7e\x60" \ +"\x49\x7d\x60\x47\x7d\x5f\x47\x7f\x61\x49\x83\x64\x4c\x83\x65\x4c" \ +"\x81\x62\x49\x7f\x62\x48\x86\x68\x4e\x85\x68\x4d\x83\x66\x4b\x81" \ +"\x65\x49\x82\x65\x49"; int init(void) { struct ifreq if_idx; @@ -178,7 +205,7 @@ int init(void) { /* Get the index of the interface to send on */ memset(&if_idx, 0, sizeof(struct ifreq)); - strncpy(if_idx.ifr_name, "enp2s0", IFNAMSIZ-1); + strncpy(if_idx.ifr_name, "enp109s0", IFNAMSIZ-1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { perror("SIOCGIFINDEX"); @@ -196,7 +223,7 @@ int init(void) { socket_address.sll_addr[4] = 0x55; socket_address.sll_addr[5] = 0x66; - /* Send init packet */ +#if 0 /* Send init packet */ if (sendto(sockfd, ipacket, sizeof(ipacket)/sizeof(ipacket[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { printf("Send ipacket failed\n"); @@ -209,17 +236,18 @@ int init(void) { { printf("Send ipacket failed\n"); } +#endif return 0; } int getx(int _modno) { - return 128; + return WIDTH; } int gety(int _modno) { - return 128; + return HEIGHT; } int set(int _modno, int x, int y, RGB color) @@ -237,42 +265,46 @@ RGB get(int _modno, int x, int y) int clear(int _modno) { - memset(frame, 0, 128 * 128 * 3); + memset(frame, 0, HEIGHT * WIDTH * 3); return 0; }; +oscore_time last = 0; +double fps; int render(void) { - /* Send first packet * / - if (sendto(sockfd, first, sizeof(first)/sizeof(first[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) - { - printf("Send first failed\n"); - } - */ - - /* Send second packet */ + /* Send second packet * / if (sendto(sockfd, second, sizeof(second)/sizeof(second[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { printf("Send second failed\n"); } - - for (uint8_t i = 0; i < 128; ++i) + */ + for (int i = 0; i < HEIGHT; ++i) { line[14] = i; - memcpy(&line[21], &frame[i][0], 128 * 3); + memcpy(&line[21], &frame[i][0], WIDTH * 3); /* Send line packet */ if (sendto(sockfd, line, sizeof(line)/sizeof(line[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { printf("Send line %d failed\n", i); } } - usleep(500); + + usleep(2000); + /* Send first packet */ if (sendto(sockfd, first, sizeof(first)/sizeof(first[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { printf("Send first failed\n"); } + oscore_time now = udate(); + if(last != 0) + { + fps = fps * 0.99 + 10000.0 / ((int64_t)now - (int64_t)last); + printf("%.01lf fps\n", fps); + } + last = now; return 0; } From 1459a462b5a0a2eaec893d99b3250854ecf574db Mon Sep 17 00:00:00 2001 From: Draradech Date: Sat, 8 Feb 2020 13:38:47 +0000 Subject: [PATCH 04/14] out_5a_75e: cleanup --- src/modules/out_5a_75e.c | 172 +++++++-------------------------------- 1 file changed, 31 insertions(+), 141 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 3c78e010..e33a5fa4 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -43,90 +43,7 @@ BGR frame[HEIGHT][WIDTH]; int sockfd; struct sockaddr_ll socket_address; -uint8_t ipacket[] = \ -"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x02\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00" \ -"\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80" \ -"\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00" \ -"\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80" \ -"\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00" \ -"\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x00"; - -uint8_t first[] = \ +uint8_t bufferswap[] = \ "\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x01\x07\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\xff\x05\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" \ @@ -135,13 +52,6 @@ uint8_t first[] = \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; -uint8_t second[] = \ -"\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x0a\xff\xff\xff" \ -"\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ -"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - uint8_t line[] = \ "\x11\x22\x33\x44\x55\x66\x22\x22\x33\x44\x55\x66\x55\x00\x01\x00" \ "\x00\x01\x00\x08\x88\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" \ @@ -194,6 +104,22 @@ uint8_t line[] = \ "\x81\x62\x49\x7f\x62\x48\x86\x68\x4e\x85\x68\x4d\x83\x66\x4b\x81" \ "\x65\x49\x82\x65\x49"; +oscore_time wait_until(int _modno, oscore_time desired_usec) +{ + #ifdef CIMODE + return desired_usec; + #else + return timers_wait_until_core(desired_usec); + #endif +} + +void wait_until_break(int _modno) +{ + #ifndef CIMODE + timers_wait_until_break_core(); + #endif +} + int init(void) { struct ifreq if_idx; @@ -205,7 +131,7 @@ int init(void) { /* Get the index of the interface to send on */ memset(&if_idx, 0, sizeof(struct ifreq)); - strncpy(if_idx.ifr_name, "enp109s0", IFNAMSIZ-1); + strncpy(if_idx.ifr_name, "eth0", IFNAMSIZ-1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { perror("SIOCGIFINDEX"); @@ -223,20 +149,6 @@ int init(void) { socket_address.sll_addr[4] = 0x55; socket_address.sll_addr[5] = 0x66; -#if 0 /* Send init packet */ - if (sendto(sockfd, ipacket, sizeof(ipacket)/sizeof(ipacket[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) - { - printf("Send ipacket failed\n"); - } - render(); - render(); - usleep(250000); - /* Send init packet again */ - if (sendto(sockfd, ipacket, sizeof(ipacket)/sizeof(ipacket[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) - { - printf("Send ipacket failed\n"); - } -#endif return 0; } @@ -269,16 +181,17 @@ int clear(int _modno) return 0; }; -oscore_time last = 0; -double fps; int render(void) { - /* Send second packet * / - if (sendto(sockfd, second, sizeof(second)/sizeof(second[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) + static oscore_time last = 0; + oscore_time now = udate(); + int elapsed = (int64_t)now - (int64_t)last; + if (last != 0 && elapsed < 15000) { - printf("Send second failed\n"); + wait_until(1337, now + 15000 - elapsed); } - */ + last = now; + for (int i = 0; i < HEIGHT; ++i) { line[14] = i; @@ -289,39 +202,16 @@ int render(void) printf("Send line %d failed\n", i); } } - + usleep(2000); - - /* Send first packet */ - if (sendto(sockfd, first, sizeof(first)/sizeof(first[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) - { - printf("Send first failed\n"); - } - - oscore_time now = udate(); - if(last != 0) + + /* Send bufferswap packet */ + if (sendto(sockfd, bufferswap, sizeof(bufferswap)/sizeof(bufferswap[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { - fps = fps * 0.99 + 10000.0 / ((int64_t)now - (int64_t)last); - printf("%.01lf fps\n", fps); + printf("Send bufferswap failed\n"); } - last = now; - return 0; -} -oscore_time wait_until(int _modno, oscore_time desired_usec) -{ - #ifdef CIMODE - return desired_usec; - #else - return timers_wait_until_core(desired_usec); - #endif -} - -void wait_until_break(int _modno) -{ - #ifndef CIMODE - timers_wait_until_break_core(); - #endif + return 0; } void deinit(int _modno) From 84640888658ebb8b109380b450f1df1e11339949 Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Sun, 28 Mar 2021 13:43:23 +0200 Subject: [PATCH 05/14] add fps output, fix frame limiter --- src/modules/out_5a_75e.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index e33a5fa4..70015c16 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -185,12 +185,27 @@ int render(void) { static oscore_time last = 0; oscore_time now = udate(); - int elapsed = (int64_t)now - (int64_t)last; + oscore_time elapsed = now - last; if (last != 0 && elapsed < 15000) { - wait_until(1337, now + 15000 - elapsed); + wait_until(1337, last + 15000); + last += 15000; + } + else + { + last = now; + } + + static oscore_time lastfps = 0; + static int frames = 0; + oscore_time elapsedfps = now - lastfps; + frames++; + if(elapsedfps > 2000000) + { + printf("%.2lf\n", (double)frames / (elapsedfps / 1000000.0)); + lastfps = now; + frames = 0; } - last = now; for (int i = 0; i < HEIGHT; ++i) { From 04098a3226d37c1d538ca4029351c4f575a50a42 Mon Sep 17 00:00:00 2001 From: draradech Date: Fri, 3 Jun 2022 19:06:02 +0200 Subject: [PATCH 06/14] minor cleanup --- src/modules/out_5a_75e.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 70015c16..1b04c45c 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -124,7 +124,7 @@ int init(void) { struct ifreq if_idx; /* Open RAW socket to send on */ - if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) + if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) < 0) { perror("socket"); } @@ -183,6 +183,7 @@ int clear(int _modno) int render(void) { + // Limit frame rate. In this configuration, the matrix is only stable up to ~70fps static oscore_time last = 0; oscore_time now = udate(); oscore_time elapsed = now - last; @@ -193,18 +194,7 @@ int render(void) } else { - last = now; - } - - static oscore_time lastfps = 0; - static int frames = 0; - oscore_time elapsedfps = now - lastfps; - frames++; - if(elapsedfps > 2000000) - { - printf("%.2lf\n", (double)frames / (elapsedfps / 1000000.0)); - lastfps = now; - frames = 0; + last = now; } for (int i = 0; i < HEIGHT; ++i) @@ -214,7 +204,7 @@ int render(void) /* Send line packet */ if (sendto(sockfd, line, sizeof(line)/sizeof(line[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { - printf("Send line %d failed\n", i); + perror("Send line failed"); } } @@ -223,7 +213,7 @@ int render(void) /* Send bufferswap packet */ if (sendto(sockfd, bufferswap, sizeof(bufferswap)/sizeof(bufferswap[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { - printf("Send bufferswap failed\n"); + perror("Send bufferswap failed"); } return 0; From aa18e030ceb0aa1c46bd30d28f995cdf9a5a5142 Mon Sep 17 00:00:00 2001 From: draradech Date: Sun, 12 Jun 2022 21:00:45 +0200 Subject: [PATCH 07/14] interface now needs to be defined in sledconf --- src/modules/out_5a_75e.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 1b04c45c..bb530b47 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -32,6 +32,13 @@ #define WIDTH 256 #define HEIGHT 256 +#define xstr(x) str(x) +#define str(x) #x + +#ifndef INTERFACE +#error "define INTERFACE in sledconf" +#endif + typedef struct { uint8_t b; @@ -131,7 +138,7 @@ int init(void) { /* Get the index of the interface to send on */ memset(&if_idx, 0, sizeof(struct ifreq)); - strncpy(if_idx.ifr_name, "eth0", IFNAMSIZ-1); + strncpy(if_idx.ifr_name, xstr(INTERFACE), IFNAMSIZ-1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { perror("SIOCGIFINDEX"); From 740a84bc7b615632a04b636126f59379aeadd5c0 Mon Sep 17 00:00:00 2001 From: draradech Date: Sat, 9 Jul 2022 14:54:20 +0200 Subject: [PATCH 08/14] interface specified via cmd line argument --- src/modules/out_5a_75e.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index bb530b47..fafb0328 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -32,13 +32,6 @@ #define WIDTH 256 #define HEIGHT 256 -#define xstr(x) str(x) -#define str(x) #x - -#ifndef INTERFACE -#error "define INTERFACE in sledconf" -#endif - typedef struct { uint8_t b; @@ -127,7 +120,7 @@ void wait_until_break(int _modno) #endif } -int init(void) { +int init(int moduleno, char *argstr) { struct ifreq if_idx; /* Open RAW socket to send on */ @@ -138,7 +131,7 @@ int init(void) { /* Get the index of the interface to send on */ memset(&if_idx, 0, sizeof(struct ifreq)); - strncpy(if_idx.ifr_name, xstr(INTERFACE), IFNAMSIZ-1); + strncpy(if_idx.ifr_name, argstr, IFNAMSIZ-1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { perror("SIOCGIFINDEX"); From 8d4694d205b84f887e462f6428b83d4f85a8d2d5 Mon Sep 17 00:00:00 2001 From: draradech Date: Tue, 12 Jul 2022 11:15:06 +0200 Subject: [PATCH 09/14] exit on error, check if interface provided --- src/modules/out_5a_75e.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index fafb0328..74dbb275 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -16,6 +16,8 @@ #include #include +#include +#include #include #include #include @@ -120,13 +122,32 @@ void wait_until_break(int _modno) #endif } +void p_error(char* str) +{ + if(errno) + { + perror(str); + } + else + { + fputs(str, stderr); + fputs("\n", stderr); + } + exit(-1); +} + int init(int moduleno, char *argstr) { struct ifreq if_idx; + + if (!argstr) + { + p_error("no network interface provided. use \"sled -o 5a_75e:ifname\" to specify interface"); + } /* Open RAW socket to send on */ if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) < 0) { - perror("socket"); + p_error("socket"); } /* Get the index of the interface to send on */ @@ -134,7 +155,7 @@ int init(int moduleno, char *argstr) { strncpy(if_idx.ifr_name, argstr, IFNAMSIZ-1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { - perror("SIOCGIFINDEX"); + p_error("SIOCGIFINDEX"); } /* Index of the network device */ @@ -204,7 +225,7 @@ int render(void) /* Send line packet */ if (sendto(sockfd, line, sizeof(line)/sizeof(line[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { - perror("Send line failed"); + p_error("Send line failed"); } } @@ -213,7 +234,7 @@ int render(void) /* Send bufferswap packet */ if (sendto(sockfd, bufferswap, sizeof(bufferswap)/sizeof(bufferswap[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { - perror("Send bufferswap failed"); + p_error("Send bufferswap failed"); } return 0; From f6a39e6b672126344275bbfe47e807b2e9465232 Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Sat, 13 Jul 2024 14:30:18 +0200 Subject: [PATCH 10/14] fade bright frames after 22:00 --- src/modules/out_5a_75e.c | 68 +++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 74dbb275..7f17e038 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include @@ -41,7 +43,8 @@ typedef struct uint8_t r; } BGR; -BGR frame[HEIGHT][WIDTH]; +RGB frame_in[HEIGHT][WIDTH]; +BGR frame_out[HEIGHT][WIDTH]; int sockfd; struct sockaddr_ll socket_address; @@ -185,25 +188,76 @@ int gety(int _modno) int set(int _modno, int x, int y, RGB color) { - frame[y][x].r = color.red; - frame[y][x].g = color.green; - frame[y][x].b = color.blue; + frame_in[y][x] = color; return 0; } RGB get(int _modno, int x, int y) { - return RGB(frame[y][x].r, frame[y][x].g, frame[y][x].b); + return frame_in[y][x]; } int clear(int _modno) { - memset(frame, 0, HEIGHT * WIDTH * 3); + memset(frame_in, 0, HEIGHT * WIDTH * sizeof(RGB)); + for (int y = 0; y < HEIGHT; y++) + { + for (int x = 0; x < WIDTH; x++) + { + frame_in[y][x].alpha = 255; + } + } return 0; }; int render(void) { + time_t tm_now = time(NULL); + struct tm *tm_struct = localtime(&tm_now); + int hour = tm_struct->tm_hour; + + // analyse + int pixsum = 0; + for (int y = 0; y < HEIGHT; y++) + { + for (int x = 0; x < WIDTH; x++) + { + pixsum += frame_in[y][x].red; + pixsum += frame_in[y][x].green; + pixsum += frame_in[y][x].blue; + } + } + double bright = (double)pixsum / (WIDTH * HEIGHT); + double fade = 127.0 / bright; + fade = sqrt(fade); + fade = MIN(1.0, fade); + if (hour > 8 && hour < 22) + { + fade = 1.0; + } + + /* + static oscore_time last_p = 0; + oscore_time now_p = udate(); + oscore_time elapsed_p = now_p - last_p; + if (elapsed_p > 1000000) + { + printf("(%.2lf, %.2lf, %d)", bright, fade, hour); + last_p = now_p; + } + */ + + // copy and fade + for (int y = 0; y < HEIGHT; y++) + { + for (int x = 0; x < WIDTH; x++) + { + frame_out[y][x].r = frame_in[y][x].red * fade; + frame_out[y][x].g = frame_in[y][x].green * fade; + frame_out[y][x].b = frame_in[y][x].blue * fade; + } + } + // Limit frame rate. In this configuration, the matrix is only stable up to ~70fps static oscore_time last = 0; oscore_time now = udate(); @@ -221,7 +275,7 @@ int render(void) for (int i = 0; i < HEIGHT; ++i) { line[14] = i; - memcpy(&line[21], &frame[i][0], WIDTH * 3); + memcpy(&line[21], &frame_out[i][0], WIDTH * 3); /* Send line packet */ if (sendto(sockfd, line, sizeof(line)/sizeof(line[0]), 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0) { From 0bb4be5b1014072d5bfb5d65a6fbbe1c6d84ee3b Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Sun, 14 Jul 2024 12:45:03 +0200 Subject: [PATCH 11/14] more aggressive fade --- src/modules/out_5a_75e.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 7f17e038..3259e2ef 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -229,7 +229,6 @@ int render(void) } double bright = (double)pixsum / (WIDTH * HEIGHT); double fade = 127.0 / bright; - fade = sqrt(fade); fade = MIN(1.0, fade); if (hour > 8 && hour < 22) { From c6e01457ac751d9ca3ebd9bcf89e3aa1d7e6bd57 Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Fri, 30 Aug 2024 22:00:46 +0200 Subject: [PATCH 12/14] change fade time for seezeit --- src/modules/out_5a_75e.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 3259e2ef..8e8be95c 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -214,7 +214,7 @@ int render(void) { time_t tm_now = time(NULL); struct tm *tm_struct = localtime(&tm_now); - int hour = tm_struct->tm_hour; + float hour = tm_struct->tm_hour + tm_struct->tm_min / 60.0; // analyse int pixsum = 0; @@ -230,7 +230,7 @@ int render(void) double bright = (double)pixsum / (WIDTH * HEIGHT); double fade = 127.0 / bright; fade = MIN(1.0, fade); - if (hour > 8 && hour < 22) + if (hour > 6 && hour < 20.5) { fade = 1.0; } From 01426e89c6665cc5708520c874e19aacc0afdfdf Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Sat, 31 Aug 2024 13:16:02 +0200 Subject: [PATCH 13/14] 66 percent base brightness at night --- src/modules/out_5a_75e.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 8e8be95c..66dccd39 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -229,23 +229,13 @@ int render(void) } double bright = (double)pixsum / (WIDTH * HEIGHT); double fade = 127.0 / bright; - fade = MIN(1.0, fade); + fade = MIN(0.66, fade); + // TODO: get location from commandline, implement equation of time for sunset and sunrise if (hour > 6 && hour < 20.5) { fade = 1.0; } - /* - static oscore_time last_p = 0; - oscore_time now_p = udate(); - oscore_time elapsed_p = now_p - last_p; - if (elapsed_p > 1000000) - { - printf("(%.2lf, %.2lf, %d)", bright, fade, hour); - last_p = now_p; - } - */ - // copy and fade for (int y = 0; y < HEIGHT; y++) { From d3e983a7503a807c9c92d7d612ee2eeffdb1e34a Mon Sep 17 00:00:00 2001 From: Manuel Kasten Date: Sat, 31 Aug 2024 14:26:33 +0200 Subject: [PATCH 14/14] enforce fps limiter --- src/modules/out_5a_75e.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/out_5a_75e.c b/src/modules/out_5a_75e.c index 66dccd39..cd882b91 100644 --- a/src/modules/out_5a_75e.c +++ b/src/modules/out_5a_75e.c @@ -253,7 +253,10 @@ int render(void) oscore_time elapsed = now - last; if (last != 0 && elapsed < 15000) { - wait_until(1337, last + 15000); + while(wait_until(1337, last + 15000) < last + 15000) + { + ; + } last += 15000; } else