//   This is a 'charge-pump' component for Machinekit HAL
//   Copyright 2006 Jeff Epler <jepler@unpythonic.net>
//

component charge_pump "Create a square-wave for the 'charge pump' input of some controller boards";

pin out bit out "Square wave if 'enable' is TRUE or unconnected, low if 'enable' is FALSE";
pin out bit out-2 "Square wave at half the frequency of 'out'";
pin out bit out-4 "Square wave at a quarter of the frequency of 'out'";
pin in bit enable = true "If FALSE, forces all 'out' pins to be low";

function _ nofp "Toggle the output bit (if enabled)";

description """
The 'Charge Pump' should be added to the base thread function.
When enabled the output is on for one period and off for one period. To calculate the
frequency of the output 1/(period time in seconds x 2) = hz. For example if you
have a base period of 100,000ns that is 0.0001 seconds and the formula would be
1/(0.0001 x 2) = 5,000 hz or 5 Khz. Two additional outputs are provided that run
a factor of 2 and 4 slower for hardware that requires a lower frequency.""";
license "GPL";
;;

FUNCTION(_) 
{
static hal_u32_t acc;

    if ( enable ) {
        acc++;
        out = (acc & 0x1);
        out_2 = (acc & 0x2);
        out_4 = (acc & 0x4);
    } else {
	out = 0;
	out_2 = 0;
	out_4 = 0;
    }
    return 0;
}
