board
Network cabinet fan controller
Public Unreviewedby matt
Two independently controlled 12 V fans, Ethernet and Wi-Fi, and an RGB speed display in a custom printed puck. Routed development preview, not approved for manufacture.
main
matt
Add MTA-156 input revision and document enclosure and cable-fit limits
16485bb
#include "control_policy.h"
#include <cassert>
#include <limits>
int main(){
using fan_controller::decide;
auto base=[](float t){return decide(t,1000,30000,1000,1000,true,false);};
assert(base(20).duty==.35f && !base(20).fault);
assert(std::abs(base(32.5).duty-.675f)<1e-5);
assert(base(40).duty==1 && base(70).duty==1);
assert(decide(20,15001,30000,1000,1000,true,false).fault);
assert(decide(20,1000,30000,0,1000,true,false).duty==1);
assert(decide(20,1000,30000,1000,0,true,false).fault);
assert(decide(20,1000,30000,1000,1000,false,false).duty==1);
assert(base(std::numeric_limits<float>::quiet_NaN()).duty==1);
assert(base(-127).fault && base(101).fault);
assert(decide(20,1000,5000,0,0,true,false).duty==1);
assert(decide(20,1000,30000,1000,1000,true,true).duty==1);
// Unsigned timestamp subtraction remains valid through millis() rollover.
uint32_t age=uint32_t(500)-uint32_t(0xfffffe0c);assert(age==1000);
assert(!decide(20,age,30000,1000,1000,true,false).fault);
}