diff --git a/.ci/before_install.sh b/.ci/before_install.sh index a30637171..e589294eb 100644 --- a/.ci/before_install.sh +++ b/.ci/before_install.sh @@ -29,4 +29,5 @@ fi pip install PrettyTable || die pip install colorama || die pip install configparser || die + pip install requests || die } diff --git a/.ci/build.py b/.ci/build.py index 9ef8e4c09..f8ed46ddc 100644 --- a/.ci/build.py +++ b/.ci/build.py @@ -2,6 +2,7 @@ import json import os import sys +import requests from prettytable import PrettyTable from colorama import Fore, Back, Style from configparser import ConfigParser @@ -374,14 +375,38 @@ def get_expected_result(expected_file, app_path, board, bd_ver): return result +def send_pull_request_comment(columns, results): + job = os.environ.get("NAME") + pr_number = os.environ.get("TRAVIS_PULL_REQUEST") + if all([job, pr_number]): + comment_job = "## " + job + "\n" + if len(results)>0: + head = "|".join(columns) + "\n" + table_format = "|".join(["---"]*len(columns)) + "\n" + table_head =head +table_format + comments = "" + comment = "" + for result in results: + for k in result: + comment += (k.replace(Fore.RED, "")).replace("\n", "
") +" |" + comment = comment.rstrip("|") + "\n" + comments += comment + comment_on_pull_request(comment_job + table_head + comments) + else: + print("WARNING:Only send pull request comment in travis ci!") + + pass + + def show_results(results, expected=None): - columns = ['TOOLCHAIN', 'APP', "TOOLCHAIN_VER", 'CONF', 'PASS'] + columns = ["TOOLCHAIN_VER", 'TOOLCHAIN', 'APP', 'CONF', 'PASS'] failed_pt = PrettyTable(columns) failed_results = [] success_results = [] expected_results = None success_pt = PrettyTable(columns) expected_pt = PrettyTable(columns) + for result in results: status = result.pop("status") if status != 0: @@ -398,6 +423,7 @@ def show_results(results, expected=None): if expected is not None: expected_results = failed_results + send_pull_request_comment(columns, expected_results) for result in expected_results: if len(result) > 0: expected_pt.add_row(result) @@ -413,6 +439,8 @@ def show_results(results, expected=None): success_pt.add_row(result) print Fore.GREEN + "Successfull results" print success_pt + + print Style.RESET_ALL sys.stdout.flush() @@ -427,6 +455,7 @@ def show_results(results, expected=None): print Fore.RED + "Failed result:" print failed_pt + print Style.RESET_ALL sys.stdout.flush() @@ -529,7 +558,7 @@ def build_makefiles_project(config): diff_expected_differents[app_path] = copy.deepcopy(expected_different[app_path]) print "There are {} projects, and they are compiled for {} times".format(app_count, count) - results_list = build_result_combine_tail(apps_results) + results_list = copy.deepcopy(build_result_combine_tail(apps_results)) show_results(results_list) expected_differents_list = build_result_combine_tail(diff_expected_differents) show_results(expected_differents_list, expected=True) @@ -537,6 +566,23 @@ def build_makefiles_project(config): return applications_failed, diff_expected_differents +def comment_on_pull_request(comment): + pr_number = os.environ.get("TRAVIS_PULL_REQUEST") + slug = os.environ.get("TRAVIS_REPO_SLUG") + token = os.environ.get("GH_TOKEN") + request_config = [pr_number, slug, token, comment] + for i in range(len(request_config)): + if request_config[i] == "false": + request_config[i] = False + if all(request_config): + url = 'https://api.github.com/repos/{slug}/issues/{number}/comments'.format( + slug=slug, number=pr_number) + response = requests.post(url, data=json.dumps({'body': comment}), + headers={'Authorization': 'token ' + token}) + print(">>>>Travis send pull request comment to {}, repsonse status code {}.".format(url, response.status_code)) + return response.json() + + def get_options_parser(): configs = dict() toolchainlist = ["gnu", "mw"] @@ -590,4 +636,6 @@ def get_options_parser(): else: print "these applications failed with some configuration: " print expected_differents.keys() + comment = "applications failed with some configuration: \n" + "\n".join(expected_differents.keys()) + comment_on_pull_request(comment) sys.exit(1) diff --git a/.ci/deploy_doc.sh b/.ci/deploy_doc.sh index 56ec1de55..7a78eb0ad 100644 --- a/.ci/deploy_doc.sh +++ b/.ci/deploy_doc.sh @@ -25,6 +25,13 @@ make html &> build_html.log || { tail -n 100 build_html.log ; die "Build sphinx # Check if this is a pull request if [ "$TRAVIS_PULL_REQUEST" != "false" ] ; then echo "Don't push built docs to gh-pages for pull request " + + make linkcheck -k 2>&1 + COMMENT_CONTENT=$(sed 's/$/&
/g' build/linkcheck/output.txt) + COMMENT_HEAD="# Sphinx link check result \n***********************\n
"
+    COMMENT_TAIL="
" + COMMENT="${COMMENT_HEAD}${COMMENT_CONTENT}${COMMENT_TAIL}" + bash -c "$COMMENTS" exit 0 fi diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0d607d259..2790c7064 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,6 @@ variables: PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache" OSP_ROOT: "." TOOLCHAIN: "gnu" - CUR_CORE: "none" TOOLCHAIN_VER: "2017.09" EXPECTED: ".ci/expected.ini" PARALLEL: "" diff --git a/.travis.yml b/.travis.yml index c662abb45..7398f9ef4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,13 @@ env: "context": "travis-ci/$NAME", "target_url": "https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID" }\nDATA' + + COMMENT=none + COMMENTS=$'curl -so/dev/null --user "$EMBARC_BOT" --request POST + https://api.github.com/repos/$TRAVIS_REPO_SLUG/issues/$TRAVIS_PULL_REQUEST/comments + --data @- << DATA\n{ + "body": "$COMMENT" + }\nDATA' cache: pip: true @@ -28,7 +35,7 @@ branches: before_install: - bash .ci/before_install.sh - # setup git config + # setup git config - git config --global user.name "embARC Automated Bot" - git config --global user.email "Huaqi.Fang@synopsys.com" diff --git a/middleware/u8glib/csrc/u8g.h b/middleware/u8glib/csrc/u8g.h index 02205333b..9eb18f313 100644 --- a/middleware/u8glib/csrc/u8g.h +++ b/middleware/u8glib/csrc/u8g.h @@ -691,6 +691,7 @@ uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */ uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */ +uint8_t u8g_com_embarc_ssd_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); uint8_t u8g_com_embarc_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); @@ -703,6 +704,7 @@ uint8_t u8g_com_embarc_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void U8G_COM_T6963 U8G_COM_FAST_PARALLEL U8G_COM_SSD_I2C + U8G_COM_SSD_SPI U8G_COM_UC_I2C defined(__18CXX) || defined(__PIC32MX) @@ -856,6 +858,17 @@ defined(__18CXX) || defined(__PIC32MX) #endif #endif +/* ==== HW SPI, embARC ====*/ +#if defined(PLATFORM_EMBARC) +#define U8G_COM_SSD_SPI u8g_com_embarc_ssd_spi_fn + +#ifndef U8G_COM_SSD_SPI +#define U8G_COM_SSD_SPI u8g_com_null_fn +#endif + +#endif + + #ifndef U8G_COM_UC_I2C #if defined(__AVR__) /* AVR variant can use the arduino version at the moment */ diff --git a/middleware/u8glib/csrc/u8g_com_embarc_ssd1306_spi.c b/middleware/u8glib/csrc/u8g_com_embarc_ssd1306_spi.c new file mode 100644 index 000000000..7ab1ecdda --- /dev/null +++ b/middleware/u8glib/csrc/u8g_com_embarc_ssd1306_spi.c @@ -0,0 +1,275 @@ +/* + + u8g.h + + Universal 8bit Graphics Library + + Copyright (c) 2011, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +/* + * Modified for port to ARC embARC platform + * by Wayne Ren wei.ren@synopsys.com, Synopsys, Inc. + */ + +#include "u8g.h" +#include "embARC.h" +#include "dev_gpio.h" +#include "ssd1306_app_config.h" + +#ifndef SSD1306_SPI_ID +#define SSD1306_SPI_ID 0 +#endif + +#ifndef SSD1306_SPI_CS +#define SSD1306_SPI_CS DEV_SPI_CS_LINE_1 +#endif + +#ifndef SSD1306_USE_CS_PIN + #define SSD1306_USE_CS_PIN 1 +#endif + +#if SSD1306_USE_CS_PIN +# ifndef SSD1306_CS_GPIO + #define SSD1306_CS_GPIO (DEV_GPIO_PORT_A) +# endif + +# ifndef SSD1306_CS_PIN + #define SSD1306_CS_PIN 24 +# endif +static void oled_ssd1306_chip_select(DEV_SPI* _oled_spi, bool select) +{ + static DEV_GPIO *oled_gpio_cs = NULL; + if(!oled_gpio_cs) { + oled_gpio_cs = gpio_get_dev(SSD1306_CS_GPIO); + if(oled_gpio_cs) { + oled_gpio_cs->gpio_open(1<gpio_control(GPIO_CMD_SET_BIT_DIR_OUTPUT, CONV2VOID(1<gpio_write(1<spi_control(SPI_CMD_MST_SEL_DEV, CONV2VOID(SSD1306_SPI_CS)) == E_OK) { + oled_gpio_cs->gpio_write(0, 1<spi_control(SPI_CMD_MST_DSEL_DEV, CONV2VOID(SSD1306_SPI_CS)); + oled_gpio_cs->gpio_write(1<spi_control(SPI_CMD_MST_SEL_DEV, CONV2VOID(SSD1306_SPI_CS)) == E_OK) { +#if defined(OS_FREERTOS) + taskENTER_CRITICAL(); +#endif + break; + } else { +#if defined(OS_FREERTOS) + vTaskDelay(0); +#else + u8g_Delay(1); +#endif + } + } while(1); + } else { + _oled_spi->spi_control(SPI_CMD_MST_DSEL_DEV, CONV2VOID(SSD1306_SPI_CS)); +#if defined(OS_FREERTOS) + taskEXIT_CRITICAL(); +#endif + } +} +#endif + +#ifndef SSD1306_SPI_FREQ +#define SSD1306_SPI_FREQ 250000ul +#endif + +/* Use RESET pin or not */ +#ifndef SSD1306_USE_RST_PIN + #define SSD1306_USE_RST_PIN 1 +#endif + +#ifndef SSD1306_CD_GPIO + #define SSD1306_CD_GPIO (DEV_GPIO_PORT_A) +#endif + +#ifndef SSD1306_CD_PIN + #define SSD1306_CD_PIN 26 +#endif + +#if SSD1306_USE_RST_PIN +# ifndef SSD1306_RST_GPIO + #define SSD1306_RST_GPIO (DEV_GPIO_PORT_A) +# endif + +# ifndef SSD1306_RST_PIN + #define SSD1306_RST_PIN 25 +# endif +static DEV_GPIO *oled_gpio; +static void oled_ssd1306_hw_reset(void) +{ + oled_gpio = gpio_get_dev(SSD1306_RST_GPIO); + if (oled_gpio) { + oled_gpio->gpio_open(1<gpio_control(GPIO_CMD_SET_BIT_DIR_OUTPUT, CONV2VOID(1<gpio_write(0, 1<gpio_write(1<gpio_write(1<gpio_write(0<spi_write(buf, cnt); +} + +Inline int32_t oled_ssd1306_write_cmd(uint8_t cmd) +{ + return oled_ssd1306_write(&cmd, 1); +} + +Inline int32_t oled_ssd1306_write_data(uint8_t data) +{ + return oled_ssd1306_write(&data, 1); +} + +Inline int32_t oled_ssd1306_write_buf(uint8_t *buf, uint8_t cnt) +{ + return oled_ssd1306_write(buf, cnt); +} + +uint8_t u8g_com_embarc_ssd_spi_fn_sel(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr, int32_t devid) +{ + //uint8_t *ptr; + int32_t ercd; + + switch(msg) { + case U8G_COM_MSG_INIT: + OLED_HW_RESET(); + oled_ssd1306 = spi_get_dev(devid); + + oled_gpio_cd = gpio_get_dev(SSD1306_CD_GPIO); + if (oled_gpio_cd) { + oled_gpio_cd->gpio_open(1<gpio_control(GPIO_CMD_SET_BIT_DIR_OUTPUT, CONV2VOID(1<gpio_write(0, 1<spi_open(DEV_MASTER_MODE, oled_ssd1306_freq); + if ((ercd != E_OK) && (ercd != E_OPNED)) { + return 0; + } + oled_ssd1306->spi_control(SPI_CMD_SET_CLK_MODE, CONV2VOID(SPI_CPOL_1_CPHA_1)); + //oled_ssd1306->spi_control(SPI_CMD_SET_CLK_MODE, CONV2VOID(SPI_CPOL_0_CPHA_0)); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: +#if SSD1306_USE_RST_PIN + if(oled_gpio) { + if(arg_val) + oled_gpio->gpio_write(1<gpio_write(0, 1<dev_mem); - u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_data_start); - u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2)); /* select current page (SSD1306) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ - u8g_WriteSequence(u8g, dev, pb->width, pb->buf); - u8g_SetChipSelect(u8g, dev, 0); - - u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_data_start); - u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2+1)); /* select current page (SSD1306) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2)); //select current page (SSD1306) + u8g_SetAddress(u8g, dev, 1); //data mode + u8g_WriteSequence(u8g, dev, pb->width, pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; @@ -177,4 +171,8 @@ uint8_t u8g_dev_ssd1306_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo uint8_t u8g_dev_ssd1306_128x64_2x_buf[WIDTH*2] U8G_NOCOMMON ; u8g_pb_t u8g_dev_ssd1306_128x64_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_buf}; -u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c = { u8g_dev_ssd1306_128x64_2x_fn, &u8g_dev_ssd1306_128x64_2x_pb, U8G_COM_SSD_I2C }; \ No newline at end of file +u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c = { u8g_dev_ssd1306_128x64_2x_fn, &u8g_dev_ssd1306_128x64_2x_pb, U8G_COM_SSD_I2C }; +u8g_dev_t u8g_dev_ssd1306_128x64_2x_hw_spi = { u8g_dev_ssd1306_128x64_2x_fn, &u8g_dev_ssd1306_128x64_2x_pb, U8G_COM_SSD_SPI }; + +u8g_pb_t u8g_dev_ssd1306_128x64_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_buf}; +u8g_dev_t u8g_dev_ssd1306_128x64_hw_spi = { u8g_dev_ssd1306_128x64_fn, &u8g_dev_ssd1306_128x64_pb, U8G_COM_SSD_SPI }; \ No newline at end of file