Finished working initial version Co-authored-by: Andis Zīle <andis.jarganns@gmail.com> Reviewed-on: #4 Co-authored-by: Andis Zīle <andis.jargans@gmail.com> Co-committed-by: Andis Zīle <andis.jargans@gmail.com>
216 lines
3.9 KiB
C++
216 lines
3.9 KiB
C++
/**** Includes ****/
|
|
#include "utils.h"
|
|
|
|
using namespace util;
|
|
|
|
/**** Private definitions ****/
|
|
/**** Private constants ****/
|
|
/**** Private variables ****/
|
|
/**** Private function declarations ****/
|
|
#ifndef TESTING
|
|
#endif
|
|
|
|
/**** Public function definitions ****/
|
|
uint8_t util::invert(uint8_t x)
|
|
{
|
|
if(x!=0) return 0;
|
|
else return 1;
|
|
}
|
|
|
|
uint16_t util::invert(uint16_t x)
|
|
{
|
|
if(x!=0) return 0;
|
|
else return 1;
|
|
}
|
|
|
|
uint32_t util::invert(uint32_t x)
|
|
{
|
|
if(x!=0) return 0;
|
|
else return 1;
|
|
}
|
|
|
|
uint8_t util::sat_add(uint8_t x, uint8_t y)
|
|
{
|
|
uint8_t z = x + y;
|
|
// Check for overflow
|
|
if((z < x)||(z < y)) return 0xFF;
|
|
else return z;
|
|
}
|
|
|
|
uint16_t util::sat_add(uint16_t x, uint16_t y)
|
|
{
|
|
uint16_t z = x + y;
|
|
// Check for overflow
|
|
if((z < x)||(z < y)) return 0xFF;
|
|
else return z;
|
|
}
|
|
|
|
uint32_t util::sat_add(uint32_t x, uint32_t y)
|
|
|
|
{
|
|
uint32_t z = x + y;
|
|
// Check for overflow
|
|
if((z < x)||(z < y)) return 0xFF;
|
|
else return z;
|
|
}
|
|
|
|
uint8_t util::sat_subtract(uint8_t x, uint8_t y)
|
|
{
|
|
uint8_t z = x - y;
|
|
// Check for underflow
|
|
if(z > x) return 0;
|
|
else return z;
|
|
}
|
|
|
|
uint16_t util::sat_subtract(uint16_t x, uint16_t y)
|
|
{
|
|
uint16_t z = x - y;
|
|
// Check for underflow
|
|
if(z > x) return 0;
|
|
else return z;
|
|
}
|
|
uint32_t util::sat_subtract(uint32_t x, uint32_t y)
|
|
{
|
|
uint32_t z = x - y;
|
|
// Check for underflow
|
|
if(z > x) return 0;
|
|
else return z;
|
|
}
|
|
|
|
uint8_t util::abs_subtract(uint8_t x, uint8_t y)
|
|
{
|
|
if(x > y) return x - y;
|
|
else return y-x;
|
|
}
|
|
|
|
uint16_t util::abs_subtract(uint16_t x, uint16_t y)
|
|
{
|
|
if(x > y) return x - y;
|
|
else return y-x;
|
|
}
|
|
|
|
uint32_t util::abs_subtract(uint32_t x, uint32_t y)
|
|
{
|
|
if(x > y) return x - y;
|
|
else return y-x;
|
|
}
|
|
|
|
|
|
uint16_t util::sat_cast(uint32_t x)
|
|
{
|
|
if(x > 0x0000FFFF) return 0xFFFF;
|
|
else return (uint16_t)x;
|
|
}
|
|
|
|
uint16_t util::sat_cast(int32_t x)
|
|
{
|
|
if(x < 0) return 0x0000;
|
|
else if(x > 0x0000FFFF) return 0xFFFF;
|
|
else return (uint16_t)x;
|
|
}
|
|
|
|
uint8_t util::is_timed_out(uint16_t time, uint16_t limit)
|
|
{
|
|
if(time >= limit) return 1;
|
|
else return 0;
|
|
}
|
|
|
|
uint8_t util::is_in_range(uint16_t value, uint16_t min, uint16_t max)
|
|
{
|
|
if((value >= min)&&(value <= max)) return 1;
|
|
else return 0;
|
|
}
|
|
|
|
uint16_t util::time_delta(uint16_t start, uint16_t end)
|
|
{
|
|
if(end >= start) return (end-start);
|
|
uint16_t temp = 0xFFFF - start;
|
|
return temp + end;
|
|
}
|
|
|
|
uint32_t util::time_delta(uint32_t start, uint32_t end)
|
|
{
|
|
if(end >= start) return (end-start);
|
|
uint32_t temp = 0xFFFFFFFF - start;
|
|
return temp + end;
|
|
}
|
|
|
|
uint16_t util::time_delta(uint16_t start, uint16_t end, uint16_t max)
|
|
{
|
|
if(end >= start) return (end-start);
|
|
uint16_t temp = max - start;
|
|
return temp + end;
|
|
}
|
|
|
|
uint32_t util::time_delta(uint32_t start, uint32_t end, uint32_t max)
|
|
{
|
|
if(end >= start) return (end-start);
|
|
uint32_t temp = max - start;
|
|
return temp + end;
|
|
}
|
|
|
|
uint16_t util::convert_muldivoff(uint16_t raw, uint8_t mul, uint8_t div, int16_t offset)
|
|
{
|
|
int32_t temp = (int32_t)raw;
|
|
|
|
temp = temp * mul;
|
|
if(div>1) temp /= div;
|
|
temp += offset;
|
|
|
|
return sat_cast(temp);
|
|
}
|
|
|
|
uint16_t util::sat_mul_kilo(uint16_t xk, uint16_t yk)
|
|
{
|
|
uint32_t temp = (uint32_t)xk * (uint32_t)yk;
|
|
temp /= 1000;
|
|
|
|
return sat_cast(temp);
|
|
}
|
|
|
|
uint16_t util::sat_div_kilo(uint16_t top, uint16_t bot)
|
|
{
|
|
//Sanity check bot
|
|
if(bot==0) return 0xFFFF; //aka infinity
|
|
|
|
uint32_t temp = (uint32_t)top * 1000;
|
|
temp /= (uint32_t)bot;
|
|
|
|
return sat_cast(temp);
|
|
}
|
|
|
|
uint16_t util::sat_ratio(uint16_t top, uint16_t bot)
|
|
{
|
|
//Sanity check bot
|
|
if(bot==0) return 0xFFFF; //aka infinity
|
|
|
|
//Easy option
|
|
if(top>=bot) return 0xFFFF;
|
|
|
|
uint32_t temp = (uint32_t)top * 0x0000FFFF;
|
|
temp /= (uint32_t)bot;
|
|
|
|
return sat_cast(temp);
|
|
}
|
|
|
|
uint16_t util::percent_to_16b(uint8_t percent)
|
|
{
|
|
uint32_t temp = (uint32_t)percent * 0x0000FFFF;
|
|
temp /= 100;
|
|
|
|
// Limit to 16 bits
|
|
uint16_t pwm = sat_cast(temp);
|
|
|
|
return pwm;
|
|
}
|
|
|
|
uint16_t util::percent_of(uint8_t percent, uint16_t value)
|
|
{
|
|
if(percent == 0) return 0;
|
|
else if(percent >= 100) return value;
|
|
|
|
uint32_t temp = (uint32_t)value * percent;
|
|
return temp/100;
|
|
}
|
|
|
|
/**** Private function definitions ****/ |