7
7
import logging .handlers
8
8
import picamera
9
9
import connexion
10
-
11
- from flask_cors import CORS
10
+ from connexion .options import SwaggerUIOptions
11
+ from connexion .middleware import MiddlewarePosition
12
+ from starlette .middleware .cors import CORSMiddleware
12
13
13
14
from camera import Camera
14
15
from motion import Motion
23
24
# Logging configuration
24
25
logger = logging .getLogger ()
25
26
logger .setLevel (os .environ .get ("LOGLEVEL" , "INFO" ))
26
- # sh = logging.StreamHandler()
27
- # formatter = logging.Formatter('%(message)s')
28
- # sh.setFormatter(formatter)
29
- # logger.addHandler(sh)
30
27
31
28
## (Connexion) Flask app configuration
32
-
33
29
# Serve a custom version of the swagger ui (Jinja2 templates) based on the default one
34
30
# from the folder 'swagger-ui'. Clone the 'swagger-ui' repository inside the backend folder
35
- options = {"swagger_ui" : True }
36
- connexionApp = connexion .App (__name__ , options = options )
37
-
38
- # Connexion wraps FlaskApp, so app becomes connexionApp.app
39
- app = connexionApp .app
40
- # Access-Control-Allow-Origin
41
- CORS (app )
42
- app .debug = False
31
+ swagger_ui_options = SwaggerUIOptions (swagger_ui = True )
32
+ app = connexion .App (__name__ , swagger_ui_options = swagger_ui_options )
33
+ app .add_middleware (
34
+ CORSMiddleware ,
35
+ position = MiddlewarePosition .BEFORE_EXCEPTION ,
36
+ allow_origins = ["*" ],
37
+ allow_credentials = True ,
38
+ allow_methods = ["*" ],
39
+ allow_headers = ["*" ],
40
+ )
43
41
app .prog_engine = ProgramEngine .get_instance ()
44
42
45
43
## New API and web application
46
44
47
45
# API v1 is defined in v1.yml and its methods are in api.py
48
- connexionApp .add_api ('v1.yml' )
46
+ app .add_api ('v1.yml' )
49
47
50
48
def button_pushed ():
51
49
if app .settings .get ('button_func' ) == "startstop" :
@@ -67,41 +65,50 @@ def run_server():
67
65
cam = None
68
66
try :
69
67
try :
70
- app .settings = Config .read ().get ("settings" )
71
-
72
- bot = CoderBot .get_instance ()
73
-
68
+ settings = Config .read ().get ("settings" )
69
+ app .settings = settings
70
+ network_settings = Config .read ().get ("network" )
71
+ cloud_settings = Config .read ().get ("cloud" )
72
+
73
+ bot = CoderBot .get_instance (settings = settings , motor_trim_factor = float (settings .get ('move_motor_trim' , 1.0 )),
74
+ motor_max_power = int (settings .get ('motor_max_power' , 100 )),
75
+ motor_min_power = int (settings .get ('motor_min_power' , 0 )),
76
+ hw_version = settings .get ('hardware_version' ),
77
+ pid_params = (float (settings .get ('pid_kp' , 1.0 )),
78
+ float (settings .get ('pid_kd' , 0.1 )),
79
+ float (settings .get ('pid_ki' , 0.01 )),
80
+ float (settings .get ('pid_max_speed' , 200 )),
81
+ float (settings .get ('pid_sample_time' , 0.01 ))))
74
82
try :
75
- audio_device = Audio .get_instance ()
76
- audio_device .set_volume (int (app . settings .get ('audio_volume_level' )), 100 )
77
- audio_device .say (app . settings .get ("sound_start" ))
83
+ audio_device = Audio .get_instance (settings )
84
+ audio_device .set_volume (int (settings .get ('audio_volume_level' )), 100 )
85
+ audio_device .say (settings .get ("sound_start" ))
78
86
except Exception :
79
87
logging .warning ("Audio not present" )
80
-
81
88
try :
82
- cam = Camera .get_instance ()
83
- Motion .get_instance ()
89
+ cam = Camera .get_instance (settings )
90
+ Motion .get_instance (settings )
84
91
except picamera .exc .PiCameraError :
85
92
logging .warning ("Camera not present" )
86
93
87
- CNNManager .get_instance (app . settings )
94
+ CNNManager .get_instance (settings )
88
95
EventManager .get_instance ("coderbot" )
89
96
90
- if app . settings .get ('load_at_start' ) and app . settings .get ('load_at_start' ):
91
- prog = app .prog_engine .load (app . settings .get ('load_at_start' ))
97
+ if settings .get ('load_at_start' ) and settings .get ('load_at_start' ):
98
+ prog = app .prog_engine .load (settings .get ('load_at_start' ))
92
99
prog .execute ()
93
100
94
101
CloudManager .get_instance ()
95
102
96
103
except ValueError as e :
97
- app . settings = {}
104
+ settings = {}
98
105
logging .error (e )
99
106
100
107
bot .set_callback (bot .GPIOS .PIN_PUSHBUTTON , button_pushed , 100 )
101
108
102
109
remove_doreset_file ()
103
110
104
- app .run (host = "0.0.0.0" , port = 5000 , debug = False , use_reloader = False , threaded = True )
111
+ app .run (host = "0.0.0.0" , port = 5000 )
105
112
finally :
106
113
if cam :
107
114
cam .exit ()
0 commit comments