
from flask import Flask, request, json
import subprocess, sys
import base64
import cv2
import pyaudio

api = Flask(__name__)

@api.route('/scope/fetch', methods = ['GET'])
def get_scope_fetch():
    dev = request.args.get('device', '/dev/ttyACM0')
    chans = request.args.get('channels', '1,2')
    with subprocess.Popen(["/labor/scope/scope.sh", dev, chans], stdout = subprocess.PIPE, stderr = subprocess.PIPE) as proc:
        ret = proc.returncode
        ste = proc.stderr.read()
        sto = proc.stdout.read()
        print (ret)
    return json.dumps({'data': sto.decode(), 'message': ste.decode(), 'code': ret})


@api.route('/camera/capture1', methods = ['GET'])
def get_camera_capture1():
    dev = request.args.get('device', '/dev/video0')
    try:
        message = 'ok'
        d = cv2.VideoCapture(dev)
        is_capturing, frame = d.read()
    except Exception as e:
        message = e
    finally:
        if d.isOpened():
            d.release()
    return json.dumps({'shape': frame.shape, 'itemsize': frame.itemsize, 'data': base64.b64encode(frame.tobytes()).decode(), 'message': message})


@api.route('/soundcard/info', methods = ['GET'])
def get_soundcard_info():
    pa = pyaudio.PyAudio()
    info = [ pa.get_device_info_by_index(i) for i in range(pa.get_device_count()) ]
    pa.terminate()
    return json.dumps({'data': info, 'message': 'ok'})

@api.route('/soundcard/capture', methods = ['GET'])
def get_soundcard_capture():
    try:
        CHUNK = 1024
        message = 'ok'
        dev = int(request.args.get('device_id', 0))
        rate = int(request.args.get('rate', 44100))
        sample_format = pyaudio.paInt24 if request.args.get('sampleformat', 'int16') == 'int24' else pyaudio.paInt16
        channels = int(request.args.get('channels', 1))
        time2record = float(request.args.get('time2record', 1))
        pa = pyaudio.PyAudio()
        stream = pa.open(format = sample_format,
                channels = channels,
                rate = rate,
                input = True,
                frames_per_buffer = CHUNK)
        data = b''
        for i in range(0, int(rate / CHUNK * time2record)):
            data += stream.read(CHUNK)
    except Exception as e:
        message = e
    finally:
        if stream:
            stream.stop_stream()
            stream.close()
        if pa:
            pa.terminate()
    return json.dumps({'data': base64.b64encode(data).decode(), 'message': message})

if __name__ == '__main__':
    api.run(host = '0.0.0.0', port = 9999)
