You should send response regardless of success - so I think this should be moved to the very end of the function, outside of any if statements so that it always responds. You should set accept flag and reject reason codes in these if statements so the response that gets sent will have the correct payload.
600 will take a lot of memory (600 x 4 bytes = 2.4K). Ok for now, but if memory gets scarce, we will have to consider sampling less frequently to reduce the size of the moving average array.
Also, show derivation of this number so it's clear what it means and how we got to 600. i.e. ((PRODUCT / 50) * (MS_PER_SECOND / TASK_GENERAL_INTERVAL)) indicating how many samples we need to buffer for worst case which is lowest flow rate (50) requiring max duration (30 sec) at 20 Hz sample rate.