Skip to content

Commit

Permalink
Extract conversion from float to u16 fixed-point
Browse files Browse the repository at this point in the history
  • Loading branch information
rom1v committed Aug 28, 2022
1 parent 041cdf6 commit fd3483c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
12 changes: 1 addition & 11 deletions app/src/control_msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,6 @@ write_string(const char *utf8, size_t max_len, unsigned char *buf) {
return 4 + len;
}

static uint16_t
to_fixed_point_16(float f) {
assert(f >= 0.0f && f <= 1.0f);
uint32_t u = f * 0x1p16f; // 2^16
if (u >= 0xffff) {
u = 0xffff;
}
return (uint16_t) u;
}

size_t
sc_control_msg_serialize(const struct sc_control_msg *msg, unsigned char *buf) {
buf[0] = msg->type;
Expand All @@ -109,7 +99,7 @@ sc_control_msg_serialize(const struct sc_control_msg *msg, unsigned char *buf) {
sc_write64be(&buf[2], msg->inject_touch_event.pointer_id);
write_position(&buf[10], &msg->inject_touch_event.position);
uint16_t pressure =
to_fixed_point_16(msg->inject_touch_event.pressure);
sc_float_to_u16fp(msg->inject_touch_event.pressure);
sc_write16be(&buf[22], pressure);
sc_write32be(&buf[24], msg->inject_touch_event.buttons);
return 28;
Expand Down
15 changes: 15 additions & 0 deletions app/src/util/binary.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "common.h"

#include <assert.h>
#include <stdbool.h>
#include <stdint.h>

Expand Down Expand Up @@ -43,4 +44,18 @@ sc_read64be(const uint8_t *buf) {
return ((uint64_t) msb << 32) | lsb;
}

/**
* Convert a float between 0 and 1 to an unsigned 16-bit fixed-point value
*/
static inline uint16_t
sc_float_to_u16fp(float f) {
assert(f >= 0.0f && f <= 1.0f);
uint32_t u = f * 0x1p16f; // 2^16
if (u >= 0xffff) {
assert(u == 0x10000); // for f == 1.0f
u = 0xffff;
}
return (uint16_t) u;
}

#endif

0 comments on commit fd3483c

Please sign in to comment.