module http_fsm #(
        parameter integer repeats_max = 2
    ) 
    (
    input clk,
    input reset,
    input ack,
    input [1:0] repeats,
    input trigger,
    
    output reg done,
    output reg enable,
    output reg valid
);

localparam INIT = 0,
    WAITING = 1,
    COUNTING = 2,
    RESEND = 3,
    TIMEOUT = 4,
    SENT = 5;

reg [4:0] state, state_nxt;

always @(posedge clk) begin
    if(reset) begin
        state <= INIT;
    end else begin
        state <= state_nxt;
    end
end


always @(*) begin
    enable = 1;
    done = 0;
    valid = 0;
    case(state)
    
        //INIT
        default: begin
            state_nxt = ack ? SENT : WAITING;
            enable = ack ? 0 : 1;
            done = ack;
            valid = ack ? 0 : 1;
        end
        
        WAITING: begin
            state_nxt = COUNTING;
        end
        
        COUNTING: begin
            state_nxt = trigger ? RESEND : COUNTING;
        end
        
        RESEND: begin
            if(ack) begin
                state_nxt = SENT;
                done = 1;
                enable = 0;
            end else if (repeats >= repeats_max[1:0]) begin
                state_nxt = TIMEOUT;
                done = 0;
                enable = 0;
            end else begin
                state_nxt = WAITING;
                valid = 1;
            end
        end
    
    
        TIMEOUT: begin
            state_nxt = TIMEOUT;
            done = 0;
            enable = 0;
        end
        
        SENT: begin
            state_nxt = SENT;
            done = 1;
            enable = 0;
        end
    
    endcase

end

endmodule
