From 1c5a71f70c2bd5dce6222e89564d02deb86de0bd Mon Sep 17 00:00:00 2001 From: cstandy <36469470+cstandy@users.noreply.github.com> Date: Mon, 9 Jul 2018 22:14:09 +0800 Subject: [PATCH 1/5] ARC Contest 2018 Team 5 Project: Vending machine --- .../2018/ARC_VSCODE/ARC.code-workspace | 31 + .../2018/ARC_VSCODE/StartVSCode.bat | 6 + .../ARC_VSCODE/Vending_Machine/Source/main.c | 385 +++ .../2018/ARC_VSCODE/Vending_Machine/makefile | 35 + arc_design_contest/2018/README.md | 147 + arc_design_contest/2018/doc/PIC.zip | Bin 0 -> 6850030 bytes arc_design_contest/2018/doc/doc.rar | Bin 0 -> 3117256 bytes .../embarc_osp-master/arc/arc_exception.c | 519 ++++ .../2018/embarc_osp-master/board/board.c | 390 +++ .../2018/embarc_osp-master/board/board.mk | 74 + .../board/emsk/common/emsk_init.c | 70 + .../board/emsk/drivers/mux/mux.c | 216 ++ .../2018/embarc_osp-master/board/emsk/emsk.h | 183 ++ .../device/ip/designware/spi/dw_spi.c | 1371 +++++++++ .../device/peripheral/wifi/rw009/rw009.c | 1281 +++++++++ .../example/baremetal/blinky/main.c | 84 + .../example/freertos/kernel/FreeRTOSConfig.h | 113 + .../2018/embarc_osp-master/inc/embARC.h | 99 + .../middleware/u8glib/csrc/u8g.h | 2052 ++++++++++++++ .../u8glib/csrc/u8g_com_embarc_ssd1306_spi.c | 275 ++ .../csrc/u8g_dev_embarc_ssd1306_128x64.c | 178 ++ .../vending-machine/Include/FreeRTOSConfig.h | 114 + .../vending-machine/Include/LED_task.h | 8 + .../vending-machine/Include/adt7420.h | 94 + .../Include/communication_task.h | 32 + .../vending-machine/Include/dcmotor_task.h | 8 + .../vending-machine/Include/lwipopts.h | 455 +++ .../vending-machine/Include/mbedtls_config.h | 2495 +++++++++++++++++ .../vending-machine/Include/numpad_task.h | 8 + .../vending-machine/Include/oled_task.h | 8 + .../Include/ssd1306_app_config.h | 46 + .../vending-machine/Include/temp_task.h | 8 + .../vending-machine/Include/vm_task.h | 75 + .../vending-machine/Source/FreeRTOSConfig.c | 113 + .../vending-machine/Source/LED_task.c | 21 + .../vending-machine/Source/adt7420.c | 274 ++ .../Source/communication_task.c | 1599 +++++++++++ .../vending-machine/Source/dcmotor_task.c | 63 + .../vending-machine/Source/numpad_task.c | 100 + .../vending-machine/Source/oled_task.c | 293 ++ .../vending-machine/Source/temp_task.c | 46 + .../vending-machine/Source/vm_task.c | 59 + .../vending-machine/vending-machine.mk | 54 + .../2018/embarc_osp-master/options/options.mk | 249 ++ .../2018/embarc_osp-master/options/rules.mk | 396 +++ .../embarc_osp-master/options/toolchain.mk | 44 + .../options/toolchain/toolchain_gnu.mk | 220 ++ .../2018/server_side/arc2php.txt | 1 + .../2018/server_side/com2arc.txt | 5 + arc_design_contest/2018/server_side/item.css | 56 + arc_design_contest/2018/server_side/item.php | 319 +++ .../2018/server_side/logout.php | 19 + .../2018/server_side/projectarc.sql | 193 ++ arc_design_contest/2018/server_side/read.php | 254 ++ .../2018/server_side/sign_in.php | 94 + .../2018/server_side/sign_up.php | 95 + 56 files changed, 15427 insertions(+) create mode 100644 arc_design_contest/2018/ARC_VSCODE/ARC.code-workspace create mode 100644 arc_design_contest/2018/ARC_VSCODE/StartVSCode.bat create mode 100644 arc_design_contest/2018/ARC_VSCODE/Vending_Machine/Source/main.c create mode 100644 arc_design_contest/2018/ARC_VSCODE/Vending_Machine/makefile create mode 100644 arc_design_contest/2018/doc/PIC.zip create mode 100644 arc_design_contest/2018/doc/doc.rar create mode 100644 arc_design_contest/2018/embarc_osp-master/arc/arc_exception.c create mode 100644 arc_design_contest/2018/embarc_osp-master/board/board.c create mode 100644 arc_design_contest/2018/embarc_osp-master/board/board.mk create mode 100644 arc_design_contest/2018/embarc_osp-master/board/emsk/common/emsk_init.c create mode 100644 arc_design_contest/2018/embarc_osp-master/board/emsk/drivers/mux/mux.c create mode 100644 arc_design_contest/2018/embarc_osp-master/board/emsk/emsk.h create mode 100644 arc_design_contest/2018/embarc_osp-master/device/ip/designware/spi/dw_spi.c create mode 100644 arc_design_contest/2018/embarc_osp-master/device/peripheral/wifi/rw009/rw009.c create mode 100644 arc_design_contest/2018/embarc_osp-master/example/baremetal/blinky/main.c create mode 100644 arc_design_contest/2018/embarc_osp-master/example/freertos/kernel/FreeRTOSConfig.h create mode 100644 arc_design_contest/2018/embarc_osp-master/inc/embARC.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/u8glib/csrc/u8g.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/u8glib/csrc/u8g_com_embarc_ssd1306_spi.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/u8glib/csrc/u8g_dev_embarc_ssd1306_128x64.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/FreeRTOSConfig.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/LED_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/adt7420.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/communication_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/dcmotor_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/lwipopts.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/mbedtls_config.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/numpad_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/oled_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/ssd1306_app_config.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/temp_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Include/vm_task.h create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/FreeRTOSConfig.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/LED_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/adt7420.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/communication_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/dcmotor_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/numpad_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/oled_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/temp_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/Source/vm_task.c create mode 100644 arc_design_contest/2018/embarc_osp-master/middleware/vending-machine/vending-machine.mk create mode 100644 arc_design_contest/2018/embarc_osp-master/options/options.mk create mode 100644 arc_design_contest/2018/embarc_osp-master/options/rules.mk create mode 100644 arc_design_contest/2018/embarc_osp-master/options/toolchain.mk create mode 100644 arc_design_contest/2018/embarc_osp-master/options/toolchain/toolchain_gnu.mk create mode 100644 arc_design_contest/2018/server_side/arc2php.txt create mode 100644 arc_design_contest/2018/server_side/com2arc.txt create mode 100644 arc_design_contest/2018/server_side/item.css create mode 100644 arc_design_contest/2018/server_side/item.php create mode 100644 arc_design_contest/2018/server_side/logout.php create mode 100644 arc_design_contest/2018/server_side/projectarc.sql create mode 100644 arc_design_contest/2018/server_side/read.php create mode 100644 arc_design_contest/2018/server_side/sign_in.php create mode 100644 arc_design_contest/2018/server_side/sign_up.php diff --git a/arc_design_contest/2018/ARC_VSCODE/ARC.code-workspace b/arc_design_contest/2018/ARC_VSCODE/ARC.code-workspace new file mode 100644 index 00000000..2c8c72de --- /dev/null +++ b/arc_design_contest/2018/ARC_VSCODE/ARC.code-workspace @@ -0,0 +1,31 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "D:\\embarc_osp-master" + }, + { + "path": "mbedtls_ssl_client2" + }, + { + "path": "Vending_Machine" + } + ], + "settings": { + "files.associations": { + "embarc_debug.h": "c", + "embarc.h": "c", + "emsk_gpio.c": "cpp", + "config.h": "c", + "openthread.h": "c", + "cli.h": "c", + "ssd1306_app_config.h": "c", + "u8g.h": "c", + "adt7420.h": "c", + "iosfwd": "c", + "xutility": "c" + } + } +} \ No newline at end of file diff --git a/arc_design_contest/2018/ARC_VSCODE/StartVSCode.bat b/arc_design_contest/2018/ARC_VSCODE/StartVSCode.bat new file mode 100644 index 00000000..02c9793b --- /dev/null +++ b/arc_design_contest/2018/ARC_VSCODE/StartVSCode.bat @@ -0,0 +1,6 @@ +@ECHO OFF +SETLOCAL +SET ARC_ToolChain=D:/arc_gnu +SET ARC_BSP_SRC=D:/embarc_osp-master +start "" "C:\Program Files\Microsoft VS Code\Code.exe" %* +ENDLOCAL \ No newline at end of file diff --git a/arc_design_contest/2018/ARC_VSCODE/Vending_Machine/Source/main.c b/arc_design_contest/2018/ARC_VSCODE/Vending_Machine/Source/main.c new file mode 100644 index 00000000..29538c59 --- /dev/null +++ b/arc_design_contest/2018/ARC_VSCODE/Vending_Machine/Source/main.c @@ -0,0 +1,385 @@ +/* embARC HAL */ + +#include "embARC.h" +#include "embARC_debug.h" + +#include "vm_task.h" +#include "communication_task.h" + +extern SemaphoreHandle_t xSemaphore; + +enum main_status_type +{ + main_init_1, + main_init_2, + main_init_3, + main_init_4, + main_user_input_1, + main_user_input_2, + main_user_input_3, + main_user_input_4, + main_balance_check, + main_recommand, + main_purchase_choice, + main_purchase_confirm +}; + +void _Main_Enqueue (int target_id, vm_data _data) +{ + _data.source_id = id_main; + _data.target_id = target_id; + enQueue(_data); +} + + +// 有問題,待改 沒有這個型態的 queue +void _Wifi_Main_Enqueue (WIFI_data _wifi_data) +{ + vm_data _data; + _data.source_id = id_main; + _data.target_id = id_wifi; + strncpy(_data.user, _wifi_data.user, 4); + _data.target_item = _wifi_data.target_item; + + for ( int i = 0; i < 4; i++ ) + _data.body[i].i = _wifi_data.body[i].i; + + for ( int i = 0; i < 4; i++ ) + { + strncpy(_data.type, _wifi_data.type[i], 6); + strncpy(_data.name, _wifi_data.name[i], 6); + _Main_Enqueue(id_wifi, _data); + } +} + +int main(int argc, char **argv) +{ + EMBARC_PRINTF("entering main function\r\n"); + + vm_data data = {0}; // data for receiveing + WIFI_data local_data = {0}; // local database + // int main_status = main_init_1; + int main_status = main_init_1; + char output = 'Z'; + + while (1) + { + if (main_status == main_init_1) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_wifi) + { + strncpy(local_data.type[data.target_item - 1], data.type, 6); + strncpy(local_data.name[data.target_item - 1], data.name, 6); + local_data.body[data.target_item - 1].i = data.body[data.target_item - 1].i; + local_data.source_id = id_main; + main_status = main_init_2; + } + } + } + } + if (main_status == main_init_2) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_wifi) + { + strncpy(local_data.type[data.target_item - 1], data.type, 6); + strncpy(local_data.name[data.target_item - 1], data.name, 6); + local_data.body[data.target_item - 1].i = data.body[data.target_item - 1].i; + local_data.source_id = id_main; + main_status = main_init_3; + } + } + } + } + if (main_status == main_init_3) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_wifi) + { + strncpy(local_data.type[data.target_item - 1], data.type, 6); + strncpy(local_data.name[data.target_item - 1], data.name, 6); + local_data.body[data.target_item - 1].i = data.body[data.target_item - 1].i; + local_data.source_id = id_main; + main_status = main_init_4; + } + } + } + } + if (main_status == main_init_4) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_wifi) + { + strncpy(local_data.type[data.target_item - 1], data.type, 6); + strncpy(local_data.name[data.target_item - 1], data.name, 6); + local_data.body[data.target_item - 1].i = data.body[data.target_item - 1].i; + local_data.source_id = id_main; + main_status = main_user_input_1; + + EMBARC_PRINTF("\r\n\r\n####### initial value stored in main function #######\r\n\r\n"); + EMBARC_PRINTF("\t target item: %d\r\n", local_data.target_item); + EMBARC_PRINTF("\t status : %d\r\n", local_data.status); + EMBARC_PRINTF("\t user : %s\r\n", local_data.user); + EMBARC_PRINTF("\t name 1: %s, type 1: %s, #: %d\r\n", local_data.name[0], local_data.type[0], local_data.body[0].i); + EMBARC_PRINTF("\t name 2: %s, type 2: %s, #: %d\r\n", local_data.name[1], local_data.type[1], local_data.body[1].i); + EMBARC_PRINTF("\t name 3: %s, type 3: %s, #: %d\r\n", local_data.name[2], local_data.type[2], local_data.body[2].i); + EMBARC_PRINTF("\t name 4: %s, type 4: %s, #: %d\r\n", local_data.name[3], local_data.type[3], local_data.body[3].i); + EMBARC_PRINTF("\r\n#####################################################\r\n\r\n"); + } + EMBARC_PRINTF(" -> main initial success\r\n"); + } + } + } + if (main_status == main_user_input_1) + { + // EMBARC_PRINTF("Reading from numpad in main function started. \r\n"); + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_numpad) + { + data.user[0] = (char) data.body[0].i; + data.status = user_input_1; + data.target_id = no_item; + _Main_Enqueue(id_oled, data); + local_data.user[0] = (char) data.body[0].i; + main_status = main_user_input_2; + } + } + } + } + if (main_status == main_user_input_2) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_numpad) + { + data.user[1] = (char) data.body[0].i; + data.status = user_input_2; + data.target_id = no_item; + _Main_Enqueue(id_oled, data); + local_data.user[1] = (char) data.body[0].i; + main_status = main_user_input_3; + } + } + } + } + if (main_status == main_user_input_3) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_numpad) + { + data.user[2] = (char) data.body[0].i; + data.status = user_input_3; + data.target_id = no_item; + _Main_Enqueue(id_oled, data); + local_data.user[2] = (char) data.body[0].i; + main_status = main_user_input_4; + } + } + } + } + if (main_status == main_user_input_4) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_numpad) + { + EMBARC_PRINTF("receive char: %c\n", (char) data.body[0].i); + data.user[3] = (char) data.body[0].i; + data.status = user_input_4; + data.target_id = no_item; + _Main_Enqueue(id_oled, data); + + + data.status = balance_check; + local_data.user[3] = (char) data.body[0].i; + + for (int i = 0; i < 4; i++) + data.user[i] = local_data.user[i]; + for (int i = 0; i < 4; i++) + data.body[i].i = local_data.body[i].i; + _Main_Enqueue(id_wifi, data); + + local_data.target_item = no_item; + // local_data.status = balance_check; + // _Wifi_Main_Enqueue(local_data); + + // check balance just once + local_data.status = server_do_nothing; + // _Wifi_Main_Enqueue(local_data); + + EMBARC_PRINTF("\r\n\r\n -> user id recognize as: %s\r\n\r\n", data.user); + + EMBARC_PRINTF("\r\n\r\n####### value after user inputted #######\r\n\r\n"); + EMBARC_PRINTF("\t target item: %d\r\n", local_data.target_item); + EMBARC_PRINTF("\t status : %d\r\n", local_data.status); + EMBARC_PRINTF("\t user : %s\r\n", local_data.user); + EMBARC_PRINTF("\t name 1: %s, type 1: %s, #: %d\r\n", local_data.name[0], local_data.type[0], local_data.body[0].i); + EMBARC_PRINTF("\t name 2: %s, type 2: %s, #: %d\r\n", local_data.name[1], local_data.type[1], local_data.body[1].i); + EMBARC_PRINTF("\t name 3: %s, type 3: %s, #: %d\r\n", local_data.name[2], local_data.type[2], local_data.body[2].i); + EMBARC_PRINTF("\t name 4: %s, type 4: %s, #: %d\r\n", local_data.name[3], local_data.type[3], local_data.body[3].i); + EMBARC_PRINTF("\r\n#####################################################\r\n\r\n"); + + main_status = main_balance_check; + } + EMBARC_PRINTF(" -> main user input 4 success\r\n"); + } + } + } + if (main_status == main_balance_check) + { + + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + EMBARC_PRINTF(" -> main balance check wwith Wi-Fi\r\n"); + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_wifi) + { + EMBARC_PRINTF(" -> server balance check is %s.\r\n", (data.status == sell_recommand) ? "PASSED" : (data.status = reject_balance) ? "REJECTED" : "UNDEFINED"); + EMBARC_PRINTF(" => target_item is %d\r\n", data.target_item); + EMBARC_PRINTF(" => balance check is %d\r\n", data.status); + + if (data.status == sell_recommand) + { + main_status = main_purchase_choice; + _Main_Enqueue(id_oled, data); + } + else if (data.status == reject_balance) + { + data.target_item = 5; // judgement in oled_task() + data.status = purchase_confirm; + main_status = main_user_input_1; + _Main_Enqueue(id_oled, data); + } + } + } + } + } + /* + if (main_status == main_recommand) + { + EMBARC_PRINTF("\r\n -> enter recommand state.\r\n"); + + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_wifi) + { + data.status = sell_recommand; + _Main_Enqueue(id_oled, data); + main_status = main_purchase_choice; + } + } + } + } + */ + if (main_status == main_purchase_choice) + { + EMBARC_PRINTF(" -> enter choice state.\r\n"); + + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + EMBARC_PRINTF(" -> numpad input: %c\r\n", (char)data.body[0].i); + if (data.source_id == id_numpad) + { + if (data.body[0].i == '1' || data.body[0].i == '2') + { + data.status = purchase_check; + data.target_item = (int)data.body[0].i - 48; + local_data.target_item = (int)data.body[0].i - 48; + strncpy(data.name, local_data.name[data.target_item - 1], 6); + strncpy(data.type, local_data.type[data.target_item - 1], 6); + _Main_Enqueue(id_oled, data); + main_status = main_purchase_confirm; + } + } + } + } + } + if (main_status == main_purchase_confirm) + { + if( xMainQueue != NULL ) + { + if( xQueueReceive( xMainQueue, &data, portMAX_DELAY ) ) + { + EMBARC_PRINTF(" -> main purchase_confirm\r\n"); + // EMBARC_PRINTF("receive data, source_id and target_id: %d, %d\r\n", data.source_id, data.target_id); + if (data.source_id == id_numpad) + { + if ((char) data.body[0].i == '#') + { + data.target_item = local_data.target_item; + + for ( int i = 0; i < 4; i++ ) + data.body[i].i = 0; + + data.body[0].i = local_data.target_item; + + data.status = purchase_confirm; + local_data.status = purchase_confirm; + local_data.body[local_data.target_item - 1].i--; + + _Main_Enqueue(id_dcmotor, data); + + for ( int i = 0; i < 4; i++ ) + data.body[i].i = local_data.body[i].i; + + strncpy(data.user, local_data.user, 4); + + _Main_Enqueue(id_oled, data); + _Main_Enqueue(id_wifi, data); + + // _Wifi_Main_Enqueue(local_data); + } + + local_data.user[0] = 0; + local_data.user[1] = 0; + local_data.user[2] = 0; + local_data.user[3] = 0; + main_status = main_user_input_1; + } + } + } + } + vTaskDelay(20); + } + + return E_SYS; +} diff --git a/arc_design_contest/2018/ARC_VSCODE/Vending_Machine/makefile b/arc_design_contest/2018/ARC_VSCODE/Vending_Machine/makefile new file mode 100644 index 00000000..31907d6c --- /dev/null +++ b/arc_design_contest/2018/ARC_VSCODE/Vending_Machine/makefile @@ -0,0 +1,35 @@ +# Application name +APPL ?= ${workspaceFolderBasename} + +EXT_DEV_LIST += wifi/rw009 sensor/temperature/adt7420 + +# Heap Size Settings +HEAPSZ ?= 1048576 +STACKSZ ?= 1048576 + +# +# root dir of embARC +# +EMBARC_ROOT = ${ARC_BSP_SRC} + +OS_SEL = freertos + +MID_SEL = vending-machine common u8glib mbedtls fatfs lwip lwip-contrib + +APPL_DEFINES += -DEMSK_PMWIFI_USE_J6 + +# application source dirs +APPL_CSRC_DIR = ./Source +APPL_ASMSRC_DIR = ./Source + +# application include dirs +APPL_INC_DIR = ./Include + + +# include current project makefile +COMMON_COMPILE_PREREQUISITES += makefile + +### Options above must be added before include options.mk ### +# include key embARC build system makefile +override EMBARC_ROOT := $(strip $(subst \,/,$(EMBARC_ROOT))) +include $(EMBARC_ROOT)/options/options.mk \ No newline at end of file diff --git a/arc_design_contest/2018/README.md b/arc_design_contest/2018/README.md index e69de29b..ca37f945 100644 --- a/arc_design_contest/2018/README.md +++ b/arc_design_contest/2018/README.md @@ -0,0 +1,147 @@ +# ARC team 5 vending machine + +## Table of Content + +* [Introduction](#introduction) +* [Video](#video) +* [hardware](#hardware) + * [EMSK Board firmware used in this application](#firmware) + * [The peripheral devices used in this application](#peripheral) + * [The hardware setup](#setup) +* [Software](#software) + * [Makefile settings](#makefile) + * [IDE settings](#ide) +* [User Manual](#usermanual) + * [Before Running This Application](#before) + * [Launch Server side code](#server) + * [Launch VSCode IDE](#vscode) + * [Wi-Fi hotspot connnection settings](#wifi) + * [Entering Main](#main) +* [Source code directory](#sourcecode) + +## Introduction
+We use ARC as our user terminal and connect to the server, which is implemented with cloud data management and smart selling system. Peripheral devices and sensors are added to the ARC exp. WiFi, temperature sensor, OLED and many more. + +Our vending machine system provides maintainance issue related to vending machine, such as auto-checking for food expired date, temperature overheat detecting. Other than that, vending machine is connected to database which users are allow to use their id for payment without physical bills or coins, and the machine will recommend what to buy depending on the purchase records of that user. The reason why our machine is different from others, the system administrator can get the information by signing in far away from the vending machine; the costomer can pay cashlessly. With e-payment, according to the purchase record of customer or other information, our machine can easily give some recommand after some operation, which can effectively decrease the time for customer making decision and interact with interest. + +## Video +http://v.youku.com/v_show/id_XMzYzMDE0MTg1Mg==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2 + +## hardware connection +### EMSK Board firmware used in this application +* emsk ver2.2 + +### The peripheral devices used in this application + +| peripheral | module | +| :--------------: | ------: | +| Wi-Fi | EMW3162 | +| OLED | SSD1306 | +| temperture | adt7420 | +| DC motor | 6V 1:1000 | +| Infrared ray led | 940nm | + +### The hardware setup + +| port | interface | peripheral | +| :--: | :-------: | :----------: | +| J1 | GPIO | DC motor & Infrared ray | +| J2 | I2C | temperature | +| J3 | GPIO | Number pad | +| J5 | SPI | OLED | +| J6 | SPI | Wi-Fi | + +## Software +sofware requirement +* Visual Studio code IDE +* ARC GNU Toolchain +* serial port terminal eg. putty +* Apache server , phpmysql + +### visual Studio IDE settings +edit `/ARC_VSCODE/StartVSCode.bat` to set your ARC toolchain path, library path, vscode program path. +example: +``` + SET ARC_ToolChain=C:/arc_gnu + SET ARC_BSP_SRC=C:/embarc_osp-master + start "" "C:/Program Files/Microsoft VS Code/Code.exe" %* +``` + +### Makefile settings +Target options about EMSK and toolchain: + +BOARD ?= emsk +BD_VER ?= 22 +CUR_CORE ?= arcem7d +TOOLCHAIN ?= gnu + +## User Manual +### Before Running This Application +Firstly, download source code of vending machine from GitHub. +* Source code download link: https://github.com/cstandy/ARC_team_5_vending_machine.git + +### Run the server_side code +1. open the Apache HTTP server . +2. Secure your site with HTTPS(openssl etc...), you should also put the certificae file into the arc board so that it can update data via HTTPS. + - in file `embarc_osp-master/middleware/mbedtls/library/certs.c` + - change the content of `const char mbedtls_test_cli_crt_rsa[]` +3. import projectarc.sql into phpmysql(Data Base) +4. register a new user account from our website. + * register link: https://127.0.0.1/../server_side/sign_up.php + +4. change the value 'Authority' in the table 'sign_data' to 1. +5. sign in to enter the main website. +* register link: https://127.0.0.1/../server_side/sign_in.php + + +### Launch VSCode IDE +```../ARC_VSCODE/StartVSCode.bat``` +Launch StartVSCode.bat to run this vending machine application. After launching VScode, right click on the workspace and choose add Folder in the path ```../ARC_VSCODE/vending-machine``` to workspace. + +### Wi-Fi hotspot connnection settings +Modify the ssid and password of Wi-Fi AP in ``` ../embarc_osp-master/board/emsk/emsk.h``` to connect Wi-Fi module to the hotspot + +```clike=137 +#define WF_HOTSPOT_NAME "EMBARC" +#define WF_HOTSPOT_PASSWD "12345678" +``` + +### Entering Main +After Wi-Fi connected, FREERTOS rises all tasks including communication, oled, temperature, blinky, number pad and DC motor. + +## Source code directory + +* main function directory ```src\arc_osp-master\middleware\vending-machine``` + * Include + * Source + * Readme.md + +* ```src\arc_osp-master\middleware\vending-machine\Source``` + +| FILE | description | +| -------------------: | :--------------------- | +| vm_task.c | main queue | +| communication_task.c | mbedtls ssl client | +| oled_task.c | oled display | +| adt7420.c | temperature sensor | +| dcmotor_task.c | dc_motor controller | +| numpad_task.c | user input | +| LED_task.c | make the board blinky | +| FreeRTOSConfig.c | Freertos configuration | + + + +* ```..\server_side\``` + +| FILE | description | +| -------------------: | :--------------------- | +| item.php | change vending machine's data | +| item.css | to typeset item.php | +| logout.php | logout | +| read.php | updata both side server and arc | +| sign_in.php | sign into the item.php | +| sign_up.php | create an account | +| arc2php.txt | exchange data from arc to server | +| com2arc.txt | exchange data from server to arc | +| projectarc.sql | initialize the data in the data base| + diff --git a/arc_design_contest/2018/doc/PIC.zip b/arc_design_contest/2018/doc/PIC.zip new file mode 100644 index 0000000000000000000000000000000000000000..304f0fab6c47cd473c43e323b7c6b6fde2ed18d2 GIT binary patch literal 6850030 zcmV(&K;geoO9KQH0000005-kYOaK4?000000000000aO408mLoFHlPZ1QY-P00;mF zz1U1QenOnUMLPugR4#Y~4W99}m8-3JN(61n{s;CJJDEEdHMiu(3G*}Mw z&*?s04^#QYAfJUc#sMPuavA40E^`C~uC$=f161h#-%{JsVcioT@TqM27EX_6pYL&D zZ;+KI0a5PshD413>aAAGFXDkKj9OzJZNW;TMP^;>09=!B#wxUvB?q^{HMr!I)sB+i zbMug#6^T44W%cOo?14euEt~ULRK2?76}NJv;{FW55#3}P)X z< s7E^!bf$CXWfgowf5tRz@l%hm(fmvMkMkrW3b!va1C>Rvf!R^Yiwl- z21tirpDFD}o?IIW2w(&y>Q^D0y}cbFc|tnj>iht3W;zc|LbMrE_Q>Ub#pd}^QG7(C zR22 gcW}M*1hZ~LzNu=(|Yt4NygWZR&)>wUNb$5AqtglH0 z1b?<}_r`&1cUEkv9%_|89c^qy_gF>=ldnKfQ#N%ukpbWOa)ofY!pCwM5?eKGs7~EV z)C^LKuZzECuLfg!lU%bhvl)&Hm=?6f^a=g87BC~7Ec4|Nt~mJy3tZCu$?NbSVt`U# zNSCimh1YZXYaL}g{)W6dB=vK3G5p`a!}+@Bnx+&aq^+EUVivO)(Szk4kZxWV@WKHA z%iD*b78v@hN<^jvIGE!(hQ;{peFf4ax*U{o(|JgT|C<)JG3>qnKUTm>-YP9dR;8U5 z6Jn?dln-l%#C0 PgbYL6{fK6K}o8bbmwlF0tQ=44CQZD=$rC)O@_Zb>Jl&DJ9B8IPO&1k?l;1-DYrB z@OS@;z8{||W5x&xfd1AP{^^JLt-M8-&;|z(qq0B3hhUS;m!lSF!Y72?#YW(3u{h_| zZpq?VMdmpl;{6B+=&4gP&Hj 4cXKD`80tPs+Kbbs`(>%XHB)I?v9qU3M8n?X5H$#p}PH=-Xn zbL$;u=J0<-yA?6GSotOP(kA$<{Yc)j5)rf+3S!U$N~cIaCI-G5@h6BC>REivD?2UI z`_`iRMwq<$m&i>5gF>VsuM^3P7lkt9e!Dwk3exJL3Z7poM8(CeD{s>WoT(Sal|fzG zg*17+58hr*sq* -NjEib(S%6b0GGPAo9hNspZ1R&mtRvo%4Adm;ZIo?0MGYEWV?v8R5Y84N z8jINu&NPg%$b14ps7}$)@c5P>ptwnxidnsrI02pul+vj!DgXo{a5eSmoFG|=DFhpk z4tH#mOm?L99PV=*I+@@KlzwbCr;l$w>EB}o_e+$tg}J;#zm^-y+O>$#cLm@S8EJ_e z{k1h6jlWrF&2OP^_(UPC=c}nCJ(h=ksjy=x9=YOg-+?i#)QRyJmsy8E32(OoXn}1U z__EFzMyHPqxXs_0R%r^#jpu?Sn`PxiQTcU%na*z4r7t4VEGrwio_iX;NdR8^GiADf zA6LU{8&-}5>b=Z=PcM&H$wVC$RjX{6^o=@z_)A+u>-0?hXWM{bbQe=&qNrtkw3M0_ zTfr6NV)SzBW+d=lP6-=H>EFHXZdOA&g&K5a^Dn%$v~7=U0L{gpsIl)kNI1EO>)#wa zOonNQ&99Fwd$Rmz^0xZ($~II|IEPdmpB3V9QJ@S9$z6t9Fubu(RXfvr_Czup>=MRZ z75@~l_mKJdxflsgx!WgzC(;`FGJV^srifNenXqB1WgdNw%`xaI2(=Gk-FQtSU5v15 z@$M^FevIL%OQ6Oyva_0J{Tzq7Zm2EV2`G~@|GpOn{YhelPCE%wP3F4XO(5g9<;Mx{ zj=^pp5WusA8a4GCG&MCfYdSRQa0;>F9tm*9gZrfoD+dm`1un|X8eiqU^$+Mx^2B_| z%Y6Nv*u?6heQ?^vm%= ->3`*dtWf{R`b !v;!%!6|(K*PwIxt6m~XGN@aFw3ecdR~eE z$9Ag@lj;!c3OJ?o?pqT5H+!mO@E%QEO7RHglk@xUr5rgzBv>!-CW2#YeNQP^ZUycb zh~;}g9K_9`(~SZk3}X$!RfyR6KL>%-$4}W0yO>ZNh>2sGj&n mTyCj*@eqTR|RavxRtGtV+06{Ius?h zfWkRg;% j*bmdeF*vFLwE#N6QjhtWdL?eZWL8PY3ggW{z?;>~$CMc628id2umv0h< zY9AYVwzzX0 4OiWpDL)N|wf=K0#yT z#L#%(D?Q74Pp;W_Hq8#Eh4e-cC{;*kg8do~n%kuu*)KIOX-$u;?lGp1as80=<=P zNElx0iNTUHsf&Qxfn0+K@sQsZ` 2VnF@H$ zhaB+0-xcC_bj3|PVYZX6ASN}(BurO^`#B3d^ok~(eV|UNC0)n(xcezWFZuBx*_Ru3 z^@-9i7&*U;7L8Dl#44i+w*)(TwIqp}1X`VR7U^ |iK}hgj-i$)VCP(GO;WaJ=U+nf_J7N#TA>XTd z9!rsQ8Hh<*B%MFU!((}4{V*f_=pK#(bSRIv5!S#d%Is27b(+QZbMabH&sV4Jx!$@A zq{U2cVB@4z1J-XmOuL7YW}(emB+vHCX^TI$n{?~C(m#xpOGuyQL~UP|-qG*^1Ng9R z+8@2ETnTeth-bM!Inp|VBe8KlBkcHxL+Tjvf@Z1nTdq@fo4#tsoCp(@4m5{Rf5==i z0S{Dj_0M_|nZw_}dmlREtvlQWY~(A)bbRSG`Ik#GjGH{EJw@X=vv~A;i{}TRGbC1; ztc6iMxNGl)fW+Zo-7)DfDr&J*XN%?xPUA@#Z_K ~=*5d}+w2xZX;&f^5 zAE1|VVRY2#o50a$?n>oDrm_)QE%J5+<~$WP! zLJdAxb^#CdvCIoP;ZnAV!RW$GdBWYP7gfC7RSW5tjs z)OK1$8*{0Nv>D!UFUpSNA5KDdyP4(hT0IM)232|k_67l;y*5s0zM2K_=4hMohV^G6 z%KW|oAmV$~+m(C S{FyD1DG| ;)Evu?-y6-E7y?e{b8kQ1UmWEK Ko;)#D=dhIElS zTy^Zrjy-$H@|r`iFwhg5I`Y8FH|#jB8W*I OjVc!hb9FB=k6-8?W&ux-@zU~n_Y zD3q~`Lho;oP*>fJ?DVMc#J#scRUF6Tejijrlw{coBA5kYehdy4%gj-2<^u(&@R#j5 z--yc@!fgbd6E!;InwRp5=Zpc?xuyF}z*1$Vyb;vOv>hyD5%{4_);0e!&|n@DsSm5h z^^)jcJV94ogP`HFwWQ@fy0^SiWz9c*kGD;HhRnj9LfA3?W(P<8ox9Gk2Wa{;PE$tS znG65KX-@}vb58rl32dqBs$TUm*yr5V+E&A6V|U{i9f$epftYyd7%p3VAHmzp^i5B_ zR2HcS^G@gOfDSF19T_|M1IaxTe*rA6Z5&fsTUsTC!ECyFX1eXnN=$s!6?soDrqJvF zx>$7xOtccPi7Az_wU^1o6ZOuO{nzJr zbxo{XnOp z=)#zsPb)-qKLQC4xxkH;GR&0}g8HdRBgkmCU7QtcH}1V%Vl1#k=}Aq;KNdeR(m&*) zAV|mD_8>RzNoyQ;%5pQ9659nH!o^WBJH3;t=FgAs@EX0lsbA_Op=o~7+%bed&!X?? zQb%}<%~p!H=$IUb&(HJvM^jFaKhqR`yUq1e54`&S;?y8pi*e)oU1yt+BW@|%vIk5U zJERGEd!!{#*L3 `nv)ejLg~Ws|T3|_l?$8^w)=Wb4sjQ(F^gCm%D4l*LP&pzi*~Vs2KO! zwEkxi=59gyic1IIKD6bdZnHdL?8;a;O94b_CIi6kP+KU#{OEbjrHln!Z3|WwtZ1V4 zXA3&``;^eDP4S(u`t9!R^YS`TX)?+T;QDjjp@44Z=dwCy{W(}28#iQ4zRAOcCGu8b zKaTbu&qXFq6{5p4eyQ>qNj|lP=erPhEe%4yV7IdW?zea5;cLn>pmO*ap6{Rq`TmcV zGX(p#FagWQDA7^_T>dKDV3^;5kFgP&qXAA;%84_F6FSUq{_s=kLStB5$edVFAr9j% z&Jj>{RoO(K%Sr`zikaG;;$<)0%lXI|6^}ELW<9u~*SSEBB#0+Woj0l=l#g5qo1ptN z@|V($$%GudC&kV7BZ{7{XBlqanyn}jB@08yD}9Zot;HP!rzDv^1w7$V2Y*g4!4eE# zv)SeK3403v=HYKr*QuXSb8$Y>a)zc0EHsrMscx rM)vuCA*h?eh>y@rHfg&cmF)a&w1~eUd>bY)qJG!ThfRQ# z|L2i+1NelAXqyt^J4qj@$!VqPJMPy|rKc5V*pl-RVVL4g8 I=#VT~?A9Q1hU2L;MyL9>cgb zb&>iJHt~z92w(|s_`kr7&$p4pa!A!HI<(DQ5GXGeT}}QeG4EQ7MDyP^ReXbcwMv zEXHjrvkBu;21vGdL~o%d7~Xivb2I*6;z9EHrnl!##o`r}9WJNB?foazFT}U%o_EJ{ zBQ}g|vxRTQhhjeTFPH4Fk&}4Hc#i^apMc}(qi|OG^E3-Ui3*8uLylnD1Eu-XIRxZ0 z59CsC;~4AQ)$1-b!!q~cK&l4V#K35XqCedbD^*lrK!3n*X{TG<0)33XEGK0|@)lYJ zxd8uW?He~7TC2+tW;gWMdGgjRc=Iy%<>&9?-BN>Q)f~1Re?K|Msa~$+dP_ v&Hnb4-8uTN!H^~FA zJ9fb657+*czZD&};HQ(9IRp)N06Pa~ 2t}zh19jPnQ-40L*dl8N z>3<7078CwyZ;@`^RRMr6!p@9CW-PYx)p;9bik2e4~(@@C+NCGPif|FNo)ne z^I2`*#EDg9w}> &Hg8{QPNC9$2%d+^u;I0!M 2;chrffxxNv1E7 zH7Y8f@oK% <9p8j=WjXE+>W4=n$mGG}@(MX9cc +ROHg)PJ z5Z}tO2*Ov-#(IirQwb7NDE*&PQ;`FDLd;fHaLu~$JlyFDjB&3DzyD}5)%!C5GeFG0 zQqb|1QUj-S6((%!bn!Je(rakL;nHggf&CT2u?D+_4jOP0P;n*jw0xkOoiNplw|qlg zPoYBK=2}Bje#FvvICwi@)Ds62csJN1!L<-0Q?g3mjT*U@+eTk{^pgxkfgW7hqyr=2 zgu9*}J@{}{OfK*Aof;&%jiXxy2b56k60lz1TD_=3@V+P@x7>l`^Hq5=hdh1Zr#aL? zzs5c7I4ba*fxq56Eur}A9`4w*iBdoROJS| !6tXtN|k(SW|P}rS}r0R%n``IZIG+2yPM ^9;2cgv`%*jUibVt>}C z>7drH?b$n}<}uY?MZXJJBE-QntFU2=GFeL8uf3T=+oZR z3RdQ`Z;qy-Is3b=0r9@athQ~I`ck9|60U}lG&u>5q6qyZ|Mw=m+j;A$Ne4PCGu8$s ziZRb`Wvm?41iJz22Y{VJc=n9%2a#BG!u9vS+!7*92MsbWS&C2rVJ( z3M#9d5@fv=t^ r;t zA-AxzqGw2(0whQGV!OO)x2Z~I*NBE7B5GyAvu`bz{bIc0@=a(q5BME+h>VcAK+Y*A zp=Nh9V)Z#8GV{Ntx%&)earE|GDTwpgQ9A6mnE?d AbgfC3)BAnwj5of%3r zi8bN_6_Q`DT33_BmR@#mKc_x_!~!A41UOgvnS_;xNK^3AN`ww)qDv%22pQa%v%gBM zXYICbgW6$;G+}3I$B>?rZ)q=w)z}b_yvLJ(w$%Xb_7{r=0nGFS^o?Rl%=;MVjXav~ zsyOMR@dePo2;n?#A-X+ygb|MIiK?8EqP?7t^XM^k{~SE^o~O;zUI`-vtNnM5mv1@d zEC$OqyM|99q|JiO9zqJr8pQ4@{hVzdi< LwumEgIo5!L3N1h_3XPSYliq;;rC;+ojYVlVF#C8ue&Oc%L_~VoeM^uUz|o{ za=u+C0C+;Qqa5CI6*3V$ErM!B12>2W=fIY(WD03=focmf5ZNW=A){k#h56nwvw@W= zQr|CkKP4nh*FU6dsVz{W&_(>`H_A!eaUP8+xGEs#5N-w!s~yziJ?;M|G~#BmdbO6f zTK$7ug!i6>0*r(jss(&fJ8vFVOb{_HuQzS# }WAw)4KVat}Hq_M>F{tF&t{ zJ)L~W<4iyzwR9~}p8?cAe4~JoCPukvsAUJm+uS= _jjc&drOm+9tvA$KHfnvl+q>rh=_a)KWL7l(JvRJ}bFXMNO>3e* zF;sG&&)|E2oT83yTj!1<%FtBUxqk$!wTtb&q4iPO $IPF=a~M}AN%EJp{s@2M3(6t-al3?eRg>w%UAWCnXWCbP^=&Z~@YG9X&K z)`6B{=?D7yDw >2xb1*^eU-zisBAwQp$GOQB)v=f(R&451dLq#`Szf8J)si zw^TY^!c5Xe0Nt(5Qt$g;5d+=jiOHc_xt#YBXB)Z4mx}*m(vq>;s(oTr$|p=)0V!kO zGAsk`7C58!;yLaXbZ !D z$ 9QG0uK{Nc iL`Eh(UB}?KV@>dyE z(|j?BL}lN1u=zlr%zHtJf-J@g>SnteY(v%HsUW&09~^|B^_pQvw_>4eEwgC^TW&Xm z#4#TTeK;BFUkL>m+9fvA{#c>C_4wwe7q{nj7K%X-emcpJbLq|kR~y}dGuh<^?rX!m ztX5p7INSbi$!1tupL@>tQVf-gM49^AIg}eG{(kxB4F22u@`6JPc)k(dfTq$~fOz=d zwTr56ydljV7_MO^S;24|3MC(wLpmE7!N5dE6m!zY8pV+v9gt~!cyKae&3pts)jVD~ zd*Zlc>q=hq2;24(U=AwQ5BQ8~k#M@e0{$<;gvR0`n?KG8mNk#w@DhN;U*hE>U)GM8 z$L%9fOn@3A562$Y?tP00)W5(-pzbAT3KXxWB{SM{Cigny{)WXh$U)613-74x-0SHA z`W{)=A%~ts{qKI+3*OaLMjQO@#6SqO-SHKdV>R&yIep7Gp`%*;pZk3Bi*B_e3z*X| z+N-jD^gHyjM{!BK<-(d7s<9sxN~3u3mgbq|voVZ32|vIOI5nKBhhW%C1l*3-@f#V; zBI! 7aipPJlMGe1|x9^$MG+x zSeUb|YiU#|!U?6GO@zC9LE~={jyVsr4zst^6&}vcwr74<;W1vJRM#-h)OJW@UHchB zq59_ Iu-IV!E5SbbAX6-mltl8&@WGsuc0~11lw`3C z;gBG#(rFr5vbeSjq+WDSmOS&L;r8le&{d|?am3D{QU1$&uL&6ucs%TyX`r=M6l&wP zd<7QCY?0ZMy(`jLOCS>Gk;sgy-84DidI_KW`d{eecmPpl?k1QXH+EUHx{ICmQ31;} zbhUk#9P%RK$JK_q3HJhT!~7mPralG-6mdvqM^xL1)h
YzbIy$6mjyH(xN8rpN;~X;Pg9qnN_a1CJlo{UvJ;WO# zZ>A8UY8h~n`#o!!A@3{XzsEdfp$I2kn9lhy W7`QQT zpf-S6sx7g!F_lojVU%*Lv&e0Nb$ux8T7#+7Hw#@K1J{EF|b%brKK7ZW%GxnG!?P}Z)XP&rm3Oo2j+v?`#GK{AoaYWDH CXyOt?`|v#dCXkIj= IfitrURuSu6@sv$C&t zjn9PRE!D%7ezW1whM+SqlDfVrevwHyV8Tx8+@>jySg-lKRu2$)>8f~!M0iZ;z>@C4 zV$v4+2dhmzhbJVKFo5Ll50DO>DG@d4ApkVSKvE7>Ca=8v_<0CuU+AdIzLf=sJ|0zQ z+K7mdPKg{@9N7cR3HPQ|&UrmiKSm%~Rkp zIWmZ*2sMcj>Qr@M54+{SEhUd01|!6d&h;Oix7tK|Y#Sn-%gq3!=d P!>)qpeaql>i4dH fI$RpI1tG%9d0ibc4GtNCOq~5(o*DTWvBy^lD_s7LFgI1}DPe z|004ZqsiQxZ?sRn>;|B$>Ywe!6Aq*%0MG_+UkQ|!v&@Nu_|nB_Q@gWKm{gdP)rrI; zM-+F!p<+&)rER+9b>6xj6fdQ(-^^@-%%q9fL9(%LBn!>v #G$gsk_1SBv0}#; zyJRPzJ#{5y@hUA9(I1y+9+hY;x=FA)R^mCXsZ7K_Rj)@QZ!?t@SIZ1gSy?dYwjJ8l zb9%Cyd!2 KWd- zZGuIbM7x@C8wLDbS=FUuPd{-4P;AsMApX0MIW69@9Om&5&4WhRt31D1qHvDtJ0TP2 z=sY*WkKYMoF3M?s3dOhS&7Np<^H?c0Jh|iub+0`aVIcrknm=rG`#`bkTRX^Y)Qpn( z2t1E#=-4JT!Tpd$w6AYGO#Yd|N}Rk;T=F?c;30~i1V+1kS_Oop&55%c=%cCp!;|$^ zCktjGD{qiIk+rQ;{ouQ__Z=zGF3f*pHG;^y&58BU7kN8B&{VVRJ>X8%nwn++0HtAY z9Ih{4A8uPK@4-2yZa3Taf;Pl^@+6T#5l%mjVKv2KjX+<$?8c^9LRK1O?97yQUN;M- zvqy#a=YUGmco@EvWja0ET4pB|M*!J3xIEyB;i1&DTHM$Vjx;oyZ^v| M1L^s$|2s-H1e!!aG#l19UF}oJa%88!4#6Hc0m^DWQGuqteZ0`Vi1-Uwi{? zsel}Fi(|fPvd4f9qwY1L#hjGvuJ!(o3HMj1)<$Zls9tz1Fx?wOtOPNN89;1Xc+Xg; zYj{aG&Hi*l*x*~Jt2Qf04R1hk6$uZ{N ?c*%wq)C$Se=+-jA=TorPTA+i&QK|*?!@n(#SSZ8 zw{}(*A5nFTS>Fq@JqbW+ZY1# qY?O|u#qVIa+ytAYP{xM1yLIRY|GS*nhh=lD zwbkMcT`SYg<4NB$ 1<#E2tQ!h$Ne+Kvb920_j@I0dFf=-V;6;ZPY6%4PpUzR3o#*AI3)G*C$DV~{ z4|cCB&ypy0xQWSLtr%ebm5(T}8E{|f_l;X7rBGh}Y+3JmjJigmQ|Z}i*Uk)0%?_?r z4i98i;&!kf$ bL9Pn_Vzh*TSH*;XciXu02W2xdIFy ~E7 zrLw5@ &%_2xC1u*AC3(5YCHTH(=}*A>J2p@#37$GRNUABoE-|K@iSd!2o)xx} zc};#E^k}G$?ukprWHfQO%iOyB2Bwfon`dlE`_(9x?k1vr6 P51YN@su)x;Mucz~chdN*O9#4{%j%Hq z2WFE@qcVK S#@W+|!?)TbXpJq!SZAfBC7wX!@>LNkp!3 z1Pv1)hS+OLx$1F3-o1|RIA}MtF%b|C;60bTF7sJ1kgd3eHF*Y_lMb!yC}bBsoUsDL zxSKNufnmP!F^Y9gOS0@g?^mCQq7k@Nx+cGjRL`FD0EW;E5?EZy5q>X3q<65J)IG(> zcGu>z1UnhcMrrm=PEJ702AzacbQYBV^6ZrRm3~dNuj7x&+4#jvcGrPq&&Kq)pm6Ge zbSSCWoNnIy1)Wl9V+GcC_5d*%0OoE`1UPZ}nD1sD$mG#Lr3xC?P+I&G{_O;Hzw3+} zb0Uk@VgJPhN?=i&nfwwgKnjVb;qCncv%`Gk+6&9sn--p=I4Y=H_&1Cetc3Js`=QR@ z#EtRN1X-^AcIetM?g~?V)Z$<|-)mb@CZFgf;h~icL(68C8_H91o9eOoQZ%T{;Ps%E z&xMK<&VFh<3E#Z^F1q}e?qe!EOKJu)TpIlNtqO!g##VI!=n&$=*ik2HAfVq-IAIOu z;fDh;p1`xiH>KS0Kxzc_1r&(aeb;>Y8va*dj98N-3sqYUA4bh)A F0b zEZ;{wzO2EatWtqL+0P{z+=}@`UHYY;LNY>pBr@OsB6y05o04Q33b~{Gi2CBFTnIZn zAe=BHaKCRhLz%@4tc1i0%bgW>av$xA@Th)xu$=NpbOt3#u8`!#fXc3QyzDIT5-!`h zzFFVF>VhS{bf0`9rhktBA~xXzY@qbsh(R8^UgP+=Dss%qd6AF|e_6PJYWI3N$jaj? zoDuK?MEtkaQ*n&J1I^t-61>2B4EsQHE)k&9!YBdv-@*2G%aP(u?>kOwIyR=Fjg zMI(lt +7CL*uGMIq3}R>cHH6EGF%WD zx2b&@mT&&0C@r-H1Y`l?1olDzqX6SGj7Bq){S3uRrBL5sr}IX`9e5?6pFt_ GDBxoK>z$K7k(rx zclPHAsUaFom^^Pr+cPZB{ahD@RCUbQ$uvW-91s=vhWJ_ZzN^8Yrj@?<%;lf*%*VSB zfi3{`cnag4=!U-xx6EGh&^^sGL>0U-nd?74qM3A CCbP9u!BcQ?v{d~FE1H&-QjqDy!pC_`I>?4-^kN~D4yUVWux!j`L9KfA9 9KH} =K?We`x_xRz zwnmgP{mlEyv*6`rj=Sj`73N*mWC1KXUo#Q+-|N`v>k`#K-1F_EDke`nMx4S^Kkg_w zy}xHCSpgpM#XNSAc0Az>M+4{W6Ckgvn4WF h~3 zNVV0DObotjywpJN#|!?R?1g$u*8 ES!{RNKH!!Qj0%Y8sSH{$$6>#~md zoU`H=%v#tpiw!=+xvklGr-la-GMF#({PN*-00`VmoF@`cr3VYgHL0N2yjg595o!jd z*OFrF9DodTTHyPXvM9_$f0v%2kvU(|&PJPzU1F$j!LmkoWB#qVUrO(Zsx!&d!4cVK z-Y-{&`wmdj?kbr (s6QJ9i$1veJL?kDqA$>;3X}%gJb6w zASMhPG2O~I(OoB~BY)nT#drVvYEkhSABkw~@&(E?60nm)gaU(PdjUkF9(VgM!C3&x z59RB?u;Sm5H7xVMQ~3`X*=*RAo#|Gj6BS2D{8KfFvyL_2QY7d;-q=ld9Z9|e<=&bA zMI1Mu+{n}Y5&JxO(Z<5M3A7oWvSh#R_Y-D!4d;Z}2(O#Di6(an)+$YwbsOM~z^bYO z8f0n&+G8F^?EaOaJSc$9L8u%hHS9gwJ2u=XIW~i8-qO+AvIf8ZXYu-!*G&P5X6 p)i0CreN->| zK-_QjtqM|YxnJiR{^;5C?h3OwZSEwub>1<&1)P(oBn&?m-Rl$^=AVY~sc}GFHBsdF zR2K}L=WFg46n&^)I4T5LojW9m4u%JV!yWhBxn)Q?$KaT%C^>mC!H(uP5&ps6H}|SF zidq`Ho|_7v z^ON%kuT4>%^k7BiZe3 mE4{Kd3O?!mfPoV0|r)>e;UHD zO}h|vbsLr7zyN-{zIBN0Dm!u1HnqU1A|PI#U$D{!`3 _P}~4Ziy*rtfLGM8rv=5+IV)hVT=S20leareA$ACVDsC zj;6o?eFXv0AJ1kLFV{w!{_*CH4Te7}O+6a;;-DbA+9viCh a}`?8C{1;gAi;Ln-#8yB cpY`N z8p7D$q0=0G&%k%yH&E%d;}hJ3%L-5h39-Lg+N}>g521L+C_l4=D$js9k Nn^cF4FOdHHrWfUSE!+oXMdp|;( z8?Yl-N3e|&6?GgO3elf`;sjB!Lj9XG8gVW%fR1qQu&3@3&5^8pjDWKe(+Z+MFQIiD zCQdGXT4_O4IIi-gTEcM4?R_C_Qw5Rvq;RbiEmmK$Xp>~jL>nWQDqoUuY5#bT?`3ns zB?zxeSYk`MUb^IE*GMAPIP*6_)uv1$sC1(=gY(a+eAU_d!S5;u2lPz3yA+1M0&OMe zy#?jGehXzxFLrH7&8Fml52Qo=DqczucDoqi67W95076;V&m-||>mp1|2mtF%x#-?& z_)IC_MWw87{)+A3f1^OSQ%b!xIiFFoO? 0B& zs{tqyBq(ziL=ZZZj?`6u^^(4uY+DiQS8ZTuiCwimz0T9o5`TSX1bW2DT^no@0sZKQ zLNNB=UNA)V_hc9485duloFGx $BUVW5`x`3= 1ixk1QGIo=l6%2z;|(Vq6Ye-ZIQr1mgU_ 9 zmrfm4+4z7+_t~x!Js(14*{sj `*okahNb4LgkwDsax^r)4i zfhk~9gr4(f6*fE;$HXqUk_|*=ulr}ZUaN@cyt7o_kaRNQ3*t2;eq`@fNbr-Oax)M@ zjxF7;@nWClCj$ydwWwLxu#KWNvF@?Z9qxkdM4s!2MN+1Is8^Q)zl?bAQ$1D;4@8Rsl8$Y3aAAl}yVwSco(vzfNhoavUT ztqpUG8Ikc3NNxO{l1Oy(W;O99ol^0Vj-OBT;KXPl1-(&70oF31tVo#AbdJwkme6q? z-wr*Bpw&=9nE$w0O{^AmglqL}abKK-+}#jzTK_sjq+xHo28ZF=@>fVVf?hLcBLzC4 zqrGHu5N&< *}g?HdMeac2tIOdXi*kh%y6+7D%Q6!85Ak8L)C|J8^UbuXFAi(h&F+%GmG}Urw2Y z>NNU(f`XB)zV!)hh4$e2E|Yjhcq^W^GI3+=ce^%xo`M$@)R)HCR~63sI`znWb}l~O zSLQv5y$gDcg_v; ztg3-or>>}QBWj!sz!7?2L9kzm6ACkX8s2cBHC?N#-gksbkVB*muB&Udb7Eg{G6gv% zhutKQFIs!>$Zolkt`Ug#ya9Bn_qYvd($&WtRC5@ANCq6-fIn!^TrzRbFcMyuSZ{lc z6P(k{6t2=)9n9LmX1&d9ZE>$^bh>w9`0_9II!>a!K2?A-iW6E4@vn%C*w%vCtU!nV zSPqC^vZ|;{j1?R=zgbz5Wm +auZ4ij`f$4cX71@V#MF^9>*T{ zslE#0m;28@wXN+X{#)M>EKIp >rLjLE5|pw5!O_%rI8?(z^y@oV5ia~oYvme)RKnX zUDL8PVpXE%Y6!@d?=hG))8!kMBLMke-dR~-!JY>*WiLe_OUVzjOmE&2mB0-+(+>c2 zRRY9&?svgaBH6VvMT&VF|AS@TYVYIEm*)xV02I02o%*pwCJ?*j7WUJ6UeMq{K-(CH zCeW)ZC=&3i$@o#CWMAP5 t4V+z{XUPxvta~Yoi zve7VKlQ)e2G9 4LD@q+Bgx@>pT#yu4Vz_MZygd2v^{9k@#QuR z)>^1358?a3AkM-=IY EXsN5qvWxu($Jq@{Kj$grvK@ls?w)DbCIGLQ*j~Y&z*O&(kfM}``Xr;-c zfsTom7NiLdv9M3tkc+7!G$T7|!ioLuv&;C{d1LOg&2JT{M?5~hZM+uQ+XBvI&RY$H zA@@_M)K~nGi7NxbTU|*OG4vr+3gzjWn!l93DNq0m96MLYn;2fL(aHX82}p(B{g|z3 z?3pCRnwX2krvW`BA> Z6aHms