diff options
Diffstat (limited to 'code/esp32')
38 files changed, 0 insertions, 4060 deletions
diff --git a/code/esp32/LICENSE b/code/esp32/LICENSE deleted file mode 100644 index d159169..0000000 --- a/code/esp32/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ -                    GNU GENERAL PUBLIC LICENSE -                       Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -                            Preamble - -  The licenses for most software are designed to take away your -freedom to share and change it.  By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users.  This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it.  (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.)  You can apply it to -your programs, too. - -  When we speak of free software, we are referring to freedom, not -price.  Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - -  To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - -  For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have.  You must make sure that they, too, receive or can get the -source code.  And you must show them these terms so they know their -rights. - -  We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - -  Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software.  If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - -  Finally, any free program is threatened constantly by software -patents.  We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary.  To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - -  The precise terms and conditions for copying, distribution and -modification follow. - -                    GNU GENERAL PUBLIC LICENSE -   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -  0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License.  The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language.  (Hereinafter, translation is included without limitation in -the term "modification".)  Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope.  The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - -  1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - -  2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - -    a) You must cause the modified files to carry prominent notices -    stating that you changed the files and the date of any change. - -    b) You must cause any work that you distribute or publish, that in -    whole or in part contains or is derived from the Program or any -    part thereof, to be licensed as a whole at no charge to all third -    parties under the terms of this License. - -    c) If the modified program normally reads commands interactively -    when run, you must cause it, when started running for such -    interactive use in the most ordinary way, to print or display an -    announcement including an appropriate copyright notice and a -    notice that there is no warranty (or else, saying that you provide -    a warranty) and that users may redistribute the program under -    these conditions, and telling the user how to view a copy of this -    License.  (Exception: if the Program itself is interactive but -    does not normally print such an announcement, your work based on -    the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole.  If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works.  But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -  3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - -    a) Accompany it with the complete corresponding machine-readable -    source code, which must be distributed under the terms of Sections -    1 and 2 above on a medium customarily used for software interchange; or, - -    b) Accompany it with a written offer, valid for at least three -    years, to give any third party, for a charge no more than your -    cost of physically performing source distribution, a complete -    machine-readable copy of the corresponding source code, to be -    distributed under the terms of Sections 1 and 2 above on a medium -    customarily used for software interchange; or, - -    c) Accompany it with the information you received as to the offer -    to distribute corresponding source code.  (This alternative is -    allowed only for noncommercial distribution and only if you -    received the program in object code or executable form with such -    an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it.  For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable.  However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - -  4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License.  Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -  5. You are not required to accept this License, since you have not -signed it.  However, nothing else grants you permission to modify or -distribute the Program or its derivative works.  These actions are -prohibited by law if you do not accept this License.  Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -  6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions.  You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -  7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License.  If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all.  For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices.  Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -  8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded.  In such case, this License incorporates -the limitation as if written in the body of this License. - -  9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time.  Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number.  If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation.  If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - -  10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission.  For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this.  Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - -                            NO WARRANTY - -  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -                     END OF TERMS AND CONDITIONS - -            How to Apply These Terms to Your New Programs - -  If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - -  To do so, attach the following notices to the program.  It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - -    <one line to give the program's name and a brief idea of what it does.> -    Copyright (C) <year>  <name of author> - -    This program is free software; you can redistribute it and/or modify -    it under the terms of the GNU General Public License as published by -    the Free Software Foundation; either version 2 of the License, or -    (at your option) any later version. - -    This program is distributed in the hope that it will be useful, -    but WITHOUT ANY WARRANTY; without even the implied warranty of -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -    GNU General Public License for more details. - -    You should have received a copy of the GNU General Public License along -    with this program; if not, write to the Free Software Foundation, Inc., -    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - -    Gnomovision version 69, Copyright (C) year name of author -    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. -    This is free software, and you are welcome to redistribute it -    under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License.  Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary.  Here is a sample; alter the names: - -  Yoyodyne, Inc., hereby disclaims all copyright interest in the program -  `Gnomovision' (which makes passes at compilers) written by James Hacker. - -  <signature of Ty Coon>, 1 April 1989 -  Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs.  If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library.  If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/code/esp32/Makefile b/code/esp32/Makefile deleted file mode 100644 index eb26385..0000000 --- a/code/esp32/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# -# This is a project Makefile. It is assumed the directory this Makefile resides in is a -# project subdirectory. -# - -PROJECT_NAME := eos-app - -include $(IDF_PATH)/make/project.mk - diff --git a/code/esp32/components/eos/at_cmd.c b/code/esp32/components/eos/at_cmd.c deleted file mode 100644 index 4712ad7..0000000 --- a/code/esp32/components/eos/at_cmd.c +++ /dev/null @@ -1,164 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/semphr.h> -#include <esp_log.h> - -#include "eos.h" - -#include "cell.h" -#include "at_cmd.h" - -static const char *TAG = "EOS ATCMD"; - -typedef struct ATURCItem { -    regex_t re; -    at_urc_cb_t cb; -    char pattern[AT_SIZE_PATTERN]; -} ATURCItem; - -typedef struct ATURCList { -    ATURCItem item[AT_SIZE_URC_LIST]; -    int len; -} ATURCList; - -static ATURCList urc_list; -static ATURCItem *urc_curr; -static SemaphoreHandle_t mutex; - -static char at_buf[EOS_CELL_UART_SIZE_BUF]; - -void at_init(void) { -    memset(&urc_list, 0, sizeof(ATURCList)); - -    mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(mutex); -} - -int at_urc_process(char *urc) { -    regmatch_t match[AT_SIZE_NMATCH]; -    at_urc_cb_t cb = NULL; -    regmatch_t *m = NULL; - -    xSemaphoreTake(mutex, portMAX_DELAY); - -    if (urc_curr == NULL) { -        int i; - -        for (i=0; i<urc_list.len; i++) { -            if (regexec(&urc_list.item[i].re, urc, AT_SIZE_NMATCH, match, 0) == 0) { -                urc_curr = &urc_list.item[i]; -                m = match; -                break; -            } -        } -    } -    if (urc_curr) cb = urc_curr->cb; - -    xSemaphoreGive(mutex); - -    if (cb) { -        int r = cb(urc, m); - -        if (r != AT_URC_MORE) { -            xSemaphoreTake(mutex, portMAX_DELAY); -            urc_curr = NULL; -            xSemaphoreGive(mutex); -        } -        ESP_LOGD(TAG, "URC Processed: %s", urc); -        return 1; -    } - -    ESP_LOGD(TAG, "URC NOT Processed: %s", urc); -    return 0; -} - -int at_urc_insert(char *pattern, at_urc_cb_t cb, int flags) { -    int r; -    int rv = EOS_OK; - -    if (strlen(pattern) >= AT_SIZE_PATTERN) return EOS_ERR; - -    xSemaphoreTake(mutex, portMAX_DELAY); - -    r = regcomp(&urc_list.item[urc_list.len].re, pattern, flags); -    if (r) rv = EOS_ERR; - -    if (!rv && (urc_list.len == AT_SIZE_URC_LIST)) rv = EOS_ERR_FULL; -    if (!rv) { -        strcpy(urc_list.item[urc_list.len].pattern, pattern); -        urc_list.item[urc_list.len].cb = cb; -        urc_list.len++; -    } - -    xSemaphoreGive(mutex); - -    return rv; -} - -int at_urc_delete(char *pattern) { -    int i; -    int rv = EOS_ERR_NOTFOUND; - -    xSemaphoreTake(mutex, portMAX_DELAY); - -    for (i=0; i<urc_list.len; i++) { -        if ((strcmp(pattern, urc_list.item[i].pattern) == 0)) { -            if (i != urc_list.len - 1) memmove(&urc_list.item[i], &urc_list.item[i + 1], (urc_list.len - i - 1) * sizeof(ATURCItem)); -            urc_list.len--; -            memset(&urc_list.item[urc_list.len], 0, sizeof(ATURCItem)); -            if (urc_curr) { -                if (urc_curr == &urc_list.item[i]) { -                    urc_curr = NULL; -                } else if (urc_curr > &urc_list.item[i]) { -                    urc_curr--; -                } -            } -            rv = EOS_OK; -            break; -        } -    } - -    xSemaphoreGive(mutex); - -    return rv; -} - -void at_cmd(char *cmd) { -    eos_modem_write(cmd, strlen(cmd)); -    ESP_LOGD(TAG, "Cmd: %s", cmd); -} - -int at_expect(char *str_ok, char *str_err, uint32_t timeout) { -    int rv; -    regex_t re_ok; -    regex_t re_err; -    uint32_t e = 0; -    uint64_t t_start = esp_timer_get_time(); - -    if (str_ok) { -        rv = regcomp(&re_ok, str_ok, REG_EXTENDED | REG_NOSUB); -        if (rv) return EOS_ERR; -    } - -    if (str_err) { -        rv = regcomp(&re_err, str_err, REG_EXTENDED | REG_NOSUB); -        if (rv) return EOS_ERR; -    } - -    do { -        rv = eos_modem_readln(at_buf, sizeof(at_buf), timeout - e); -        ESP_LOGD(TAG, "Expect: %s", at_buf); - -        if (at_buf[0] != '\0') { -            if (!rv && str_ok && (regexec(&re_ok, at_buf, 0, NULL, 0) == 0)) return 1; -            if (!rv && str_err && (regexec(&re_err, at_buf, 0, NULL, 0) == 0)) return 0; - -            at_urc_process(at_buf); -        } - -        e = (uint32_t)(esp_timer_get_time() - t_start) / 1000; -        if (e > timeout) return EOS_ERR_TIMEOUT; -    } while (1); -} diff --git a/code/esp32/components/eos/bq25895.c b/code/esp32/components/eos/bq25895.c deleted file mode 100644 index 0d1bb8d..0000000 --- a/code/esp32/components/eos/bq25895.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdlib.h> - -#include <esp_log.h> - -#include "eos.h" -#include "i2c.h" - -static const char *TAG = "EOS BQ25895"; - -#define BQ25895_ADDR                0x6A - -void eos_bq25895_set_ilim(void) { -    uint8_t data = 0; -    eos_i2c_write8(BQ25895_ADDR, 0, 0x1c); -    eos_i2c_write8(BQ25895_ADDR, 2, 0x28); -    eos_i2c_write8(BQ25895_ADDR, 7, 0x8d); - -    data = eos_i2c_read8(BQ25895_ADDR, 0x00); -    ESP_LOGI(TAG, "REG00: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x01); -    ESP_LOGI(TAG, "REG01: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x02); -    ESP_LOGI(TAG, "REG02: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x03); -    ESP_LOGI(TAG, "REG03: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x04); -    ESP_LOGI(TAG, "REG04: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x05); -    ESP_LOGI(TAG, "REG05: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x06); -    ESP_LOGI(TAG, "REG06: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x07); -    ESP_LOGI(TAG, "REG07: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x08); -    ESP_LOGI(TAG, "REG08: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x09); -    ESP_LOGI(TAG, "REG09: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x0a); -    ESP_LOGI(TAG, "REG0A: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x0b); -    ESP_LOGI(TAG, "REG0B: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x0c); -    ESP_LOGI(TAG, "REG0C: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x0d); -    ESP_LOGI(TAG, "REG0D: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x0e); -    ESP_LOGI(TAG, "REG0E: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x0f); -    ESP_LOGI(TAG, "REG0F: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x10); -    ESP_LOGI(TAG, "REG10: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x11); -    ESP_LOGI(TAG, "REG11: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x12); -    ESP_LOGI(TAG, "REG12: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x13); -    ESP_LOGI(TAG, "REG13: %02x", data); -    data = eos_i2c_read8(BQ25895_ADDR, 0x14); -    ESP_LOGI(TAG, "REG14: %02x", data); -} diff --git a/code/esp32/components/eos/cell.c b/code/esp32/components/eos/cell.c deleted file mode 100644 index c2e03e1..0000000 --- a/code/esp32/components/eos/cell.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> - -#include <esp_log.h> - -#include "eos.h" -#include "net.h" -#include "cell.h" - -static uint8_t cell_mode; - -static void cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t size) { -    uint8_t mtype; - -    if (size < 1) return; -    mtype = buffer[0]; -    switch (mtype & EOS_CELL_MTYPE_MASK) { -        case EOS_CELL_MTYPE_DEV: -            switch (mtype) { -                case EOS_CELL_MTYPE_UART_DATA: -                    if (eos_modem_get_mode() == EOS_CELL_UART_MODE_RELAY) eos_modem_write(buffer+1, size-1); -                    break; - -                case EOS_CELL_MTYPE_UART_TAKE: -                    cell_mode = eos_modem_get_mode(); -                    eos_modem_set_mode(EOS_CELL_UART_MODE_RELAY); -                    break; - -                case EOS_CELL_MTYPE_UART_GIVE: -                    eos_modem_set_mode(cell_mode); -                    break; - -                case EOS_CELL_MTYPE_PCM_DATA: -                    eos_cell_pcm_push(buffer+1, size-1); -                    break; - -                case EOS_CELL_MTYPE_PCM_START: -                    eos_cell_pcm_start(); -                    break; - -                case EOS_CELL_MTYPE_PCM_STOP: -                    eos_cell_pcm_stop(); -                    break; -            } -            break; - -        case EOS_CELL_MTYPE_VOICE: -            eos_cell_voice_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, size); -            break; - -        case EOS_CELL_MTYPE_SMS: -            eos_cell_sms_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, size); -            break; - -        case EOS_CELL_MTYPE_USSD: -            eos_cell_ussd_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, size); -            break; - -        case EOS_CELL_MTYPE_DATA: -            eos_cell_data_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, size); -            break; -    } -} - -void eos_cell_init(void) { -    eos_net_set_handler(EOS_NET_MTYPE_CELL, cell_handler); -} - diff --git a/code/esp32/components/eos/cell_data.c b/code/esp32/components/eos/cell_data.c deleted file mode 100644 index 6732346..0000000 --- a/code/esp32/components/eos/cell_data.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdlib.h> - -#include <esp_log.h> - -#include "eos.h" -#include "cell.h" - -void eos_cell_data_handler(unsigned char mtype, unsigned char *buffer, uint16_t size) { -    int rv; - -    rv = eos_modem_take(1000); -    if (rv) return; - -    buffer += 1; -    size -= 1; -    switch (mtype) { -    } - -    eos_modem_give(); -} diff --git a/code/esp32/components/eos/cell_modem.c b/code/esp32/components/eos/cell_modem.c deleted file mode 100644 index c6d718f..0000000 --- a/code/esp32/components/eos/cell_modem.c +++ /dev/null @@ -1,767 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/semphr.h> -#include <freertos/task.h> -#include <freertos/queue.h> -#include <netif/ppp/pppos.h> -#include <netif/ppp/pppapi.h> -#include <driver/uart.h> -#include <driver/gpio.h> -#include <esp_sleep.h> -#include <esp_log.h> - -#include "eos.h" -#include "net.h" -#include "power.h" - -#include "at_cmd.h" -#include "cell.h" - -// XXX: PPP reconnect on failure - -#define UART_SIZE_IO_BUF    1024 - -#define UART_GPIO_TXD       16 -#define UART_GPIO_RXD       17 -#define UART_GPIO_DTR       32 -#define UART_GPIO_RI        35 - -#define MODEM_ETYPE_INIT    1 -#define MODEM_ETYPE_RI      2 - -#define AT_CMD_INIT_SIZE    3 - -#define MIN(X, Y)           (((X) < (Y)) ? (X) : (Y)) -#define MAX(X, Y)           (((X) > (Y)) ? (X) : (Y)) - -static const char *TAG = "EOS MODEM"; - -static char *at_cmd_init[AT_CMD_INIT_SIZE] = { -    "AT+CFGRI=1\r", -    "AT+CSCLK=1\r", -    "AT+CMGF=0\r" -}; - -static SemaphoreHandle_t mutex; - -static QueueHandle_t modem_queue; -static QueueHandle_t uart_queue; - -static char urc_buf[EOS_CELL_UART_SIZE_BUF]; -static char uart_buf[EOS_CELL_UART_SIZE_BUF]; -static size_t uart_buf_len; - -static uint8_t uart_mode = EOS_CELL_UART_MODE_ATCMD; -static SemaphoreHandle_t uart_mutex; - -static char ppp_apn[64]; -static char ppp_user[64]; -static char ppp_pass[64]; -static SemaphoreHandle_t ppp_mutex; - -static ppp_pcb *ppp_handle; -static struct netif ppp_netif; - -typedef enum { -    UART_EEVT_MODE = UART_EVENT_MAX -} uart_eevt_type_t; - -typedef struct { -    uint8_t type; -} modem_event_t; - -static void modem_atcmd_read(size_t bsize); - -static void uart_data_read(uint8_t mode) { -    unsigned char *buf; -    int rd; -    size_t bsize; - -    uart_get_buffered_data_len(UART_NUM_2, &bsize); -    switch (mode) { -        case EOS_CELL_UART_MODE_ATCMD: -            modem_atcmd_read(bsize); -            break; - -        case EOS_CELL_UART_MODE_PPP: -            rd = 0; - -            do { -                int _rd = eos_modem_read(uart_buf, MIN(bsize - rd, sizeof(uart_buf)), 100); -                pppos_input_tcpip(ppp_handle, (uint8_t *)uart_buf, _rd); -                rd += _rd; -            } while (rd != bsize); -            break; - -        case EOS_CELL_UART_MODE_RELAY: -            rd = 0; - -            do { -                int _rd; - -                buf = eos_net_alloc(); -                buf[0] = EOS_CELL_MTYPE_UART_DATA; -                _rd = eos_modem_read(buf + 1, MIN(bsize - rd, EOS_NET_SIZE_BUF - 1), 100); -                eos_net_send(EOS_NET_MTYPE_CELL, buf, _rd + 1, 0); -                rd += _rd; -            } while (rd != bsize); -            break; - -        default: -            break; - -    } -} - -static void uart_event_task(void *pvParameters) { -    char mode = EOS_CELL_UART_MODE_ATCMD; -    char _mode = EOS_CELL_UART_MODE_ATCMD; -    uart_event_t event; - -    xSemaphoreTake(uart_mutex, portMAX_DELAY); -    while (1) { -        /* Waiting for UART event. -         */ -        if (xQueueReceive(uart_queue, &event, portMAX_DELAY)) { -            switch (event.type) { -                case UART_DATA: -                    /* Event of UART receiving data -                     */ -                    if (mode != EOS_CELL_UART_MODE_NONE) uart_data_read(mode); -                    if ((mode != _mode) && (uart_buf_len == 0)) { -                        if (_mode == EOS_CELL_UART_MODE_NONE) xSemaphoreGive(uart_mutex); -                        mode = _mode; -                    } -                    break; - -                case UART_EEVT_MODE: -                    /* Mode change -                     */ -                    _mode = (char)event.size; -                    if ((_mode != mode) && ((uart_buf_len == 0) || (mode == EOS_CELL_UART_MODE_NONE))) { -                        if (mode == EOS_CELL_UART_MODE_NONE) { -                            xSemaphoreTake(uart_mutex, portMAX_DELAY); -                            uart_data_read(_mode); -                        } -                        if (_mode == EOS_CELL_UART_MODE_NONE) xSemaphoreGive(uart_mutex); -                        mode = _mode; -                    } -                    break; - -                default: -                    break; -            } -        } -    } -    vTaskDelete(NULL); -} - -static void IRAM_ATTR uart_ri_isr_handler(void *arg) { -    modem_event_t evt; - -    evt.type = MODEM_ETYPE_RI; -    xQueueSendFromISR(modem_queue, &evt, NULL); -} - -static int modem_atcmd_init(void) { -    unsigned char *buf; -    int echo_on = 0; -    int tries = 3; -    int i, r; -    int rv = EOS_OK; - -    rv = eos_modem_take(1000); -    if (rv) return rv; - -    do { -        at_cmd("AT\r"); -        r = at_expect("^AT", "^OK", 1000); -        if (r >= 0) { -            echo_on = r; -            if (echo_on) { -                r = at_expect("^OK", NULL, 1000); -            } -            break; -        } -        tries--; -    } while (tries); - -    if (tries == 0) { -        eos_modem_give(); -        return EOS_ERR_TIMEOUT; -    } - -    if (echo_on) { -        at_cmd("AT&F\r"); -        r = at_expect("^AT&F", NULL, 1000); -        r = at_expect("^OK", NULL, 1000); -    } else { -        at_cmd("AT&F\r"); -        r = at_expect("^OK", NULL, 1000); - -    } -    at_cmd("ATE0\r"); -    r = at_expect("^ATE0", NULL, 1000); -    r = at_expect("^OK", "^ERROR", 1000); - -    for (i=0; i<AT_CMD_INIT_SIZE; i++) { -        at_cmd(at_cmd_init[i]); -        r = at_expect("^OK", "^ERROR", 1000); -    } - -    buf = eos_net_alloc(); -    buf[0] = EOS_CELL_MTYPE_READY; -    eos_net_send(EOS_NET_MTYPE_CELL, buf, 1, 0); - -    eos_modem_give(); - -    return EOS_OK; -} - -static void modem_atcmd_read(size_t bsize) { -    char *ln_end; -    int rd = 0; - -    do { -        char *uart_curr = uart_buf + uart_buf_len; -        int _rd = eos_modem_read(uart_curr, MIN(bsize - rd, sizeof(uart_buf) - uart_buf_len - 1), 100); - -        rd += _rd; -        uart_buf_len += _rd; -        uart_buf[uart_buf_len] = '\0'; -        while ((ln_end = strchr(uart_curr, '\n'))) { -            size_t urc_buf_len = ln_end - uart_buf; - -            if ((ln_end > uart_buf) && (*(ln_end - 1) == '\r')) urc_buf_len--; -            memcpy(urc_buf, uart_buf, urc_buf_len); -            urc_buf[urc_buf_len] = '\0'; - -            uart_buf_len -= ln_end - uart_buf + 1; -            if (uart_buf_len) memmove(uart_buf, ln_end + 1, uart_buf_len); -            uart_curr = uart_buf; -            uart_buf[uart_buf_len] = '\0'; - -            at_urc_process(urc_buf); -        } -        if (uart_buf_len == sizeof(uart_buf) - 1) { -            uart_buf_len = 0; -            memcpy(urc_buf, uart_buf, sizeof(urc_buf)); -            at_urc_process(urc_buf); -        } -    } while (rd != bsize); -} - -int modem_urc_init_handler(char *urc, regmatch_t *m) { -    modem_event_t evt; - -    evt.type = MODEM_ETYPE_INIT; -    xQueueSend(modem_queue, &evt, portMAX_DELAY); - -    return AT_URC_OK; -} - -static void modem_set_mode(uint8_t mode) { -    uart_event_t evt; - -    evt.type = UART_EEVT_MODE; -    evt.size = mode; -    xQueueSend(uart_queue, &evt, portMAX_DELAY); -} - -static void modem_event_task(void *pvParameters) { -    modem_event_t evt; - -    while (1) { -        if (xQueueReceive(modem_queue, &evt, portMAX_DELAY)) { -            switch (evt.type) { -                case MODEM_ETYPE_INIT: -                    modem_atcmd_init(); -                    break; - -                case MODEM_ETYPE_RI: -                    ESP_LOGI(TAG, "URC from RI"); -                    break; - -                default: -                    break; -            } - -            /* Obsolete!!! -            uint64_t t_start = esp_timer_get_time(); -            if (xQueueReceive(modem_queue, &level, 200 / portTICK_RATE_MS) && (level == 1)) { -                uint64_t t_end = esp_timer_get_time(); -                ESP_LOGI(TAG, "URC:%u", (uint32_t)(t_end - t_start)); -            } else { -                ESP_LOGI(TAG, "RING"); -            } -            */ - -        } -    } -    vTaskDelete(NULL); -} - -static char *memstr(char *mem, size_t size, char *str) { -    size_t i = 0; -    char *max_mem; - -    if (str[0] == '\0') return NULL; - -    max_mem = mem + size; - -    while (mem < max_mem) { -        if (*mem != str[i]) { -            mem -= i; -            i = 0; -        } else { -            if (str[i+1] == '\0') return mem - i; -            i++; -        } -        mem++; -    } - -    return NULL; -} - -static uint32_t ppp_output_cb(ppp_pcb *pcb, uint8_t *data, uint32_t len, void *ctx) { -    size_t rv; - -	xSemaphoreTake(ppp_mutex, portMAX_DELAY); -    rv = eos_modem_write(data, len); -	xSemaphoreGive(ppp_mutex); - -    return rv; -} - -/* PPP status callback */ -static void ppp_status_cb(ppp_pcb *pcb, int err_code, void *ctx) { -    // struct netif *pppif = ppp_netif(pcb); -    // LWIP_UNUSED_ARG(ctx); - -    switch(err_code) { -        case PPPERR_NONE: { -            ESP_LOGE(TAG, "status_cb: Connect"); -            break; -        } -        case PPPERR_PARAM: { -            ESP_LOGE(TAG, "status_cb: Invalid parameter"); -            break; -        } -        case PPPERR_OPEN: { -            ESP_LOGE(TAG, "status_cb: Unable to open PPP session"); -            break; -        } -        case PPPERR_DEVICE: { -            ESP_LOGE(TAG, "status_cb: Invalid I/O device for PPP"); -            break; -        } -        case PPPERR_ALLOC: { -            ESP_LOGE(TAG, "status_cb: Unable to allocate resources"); -            break; -        } -        case PPPERR_USER: { -            ESP_LOGE(TAG, "status_cb: User interrupt"); -            break; -        } -        case PPPERR_CONNECT: { -            ESP_LOGE(TAG, "status_cb: Connection lost"); -            break; -        } -        case PPPERR_AUTHFAIL: { -            ESP_LOGE(TAG, "status_cb: Failed authentication challenge"); -            break; -        } -        case PPPERR_PROTOCOL: { -            ESP_LOGE(TAG, "status_cb: Failed to meet protocol"); -            break; -        } -        case PPPERR_PEERDEAD: { -            ESP_LOGE(TAG, "status_cb: Connection timeout"); -            break; -        } -        case PPPERR_IDLETIMEOUT: { -            ESP_LOGE(TAG, "status_cb: Idle Timeout"); -            break; -        } -        case PPPERR_CONNECTTIME: { -            ESP_LOGE(TAG, "status_cb: Max connect time reached"); -            break; -        } -        case PPPERR_LOOPBACK: { -            ESP_LOGE(TAG, "status_cb: Loopback detected"); -            break; -        } -        default: { -            ESP_LOGE(TAG, "status_cb: Unknown error code %d", err_code); -            break; -        } -    } -} - -static int ppp_pause(uint32_t timeout, uint8_t retries) { -    int done = 0; -    int len = 0; -    int rv = EOS_OK; -    char *ok_str = NULL; -    uint64_t t_start; - -    timeout += 1000; -    xSemaphoreTake(ppp_mutex, portMAX_DELAY); -    eos_modem_flush(); -    vTaskDelay(1000 / portTICK_PERIOD_MS); -    modem_set_mode(EOS_CELL_UART_MODE_NONE); -    xSemaphoreTake(uart_mutex, portMAX_DELAY); -    at_cmd("+++"); -    t_start = esp_timer_get_time(); - -    do { -        len = eos_modem_read(uart_buf + uart_buf_len, sizeof(uart_buf) - uart_buf_len, 10); -        if (len > 0) { -            if (uart_buf_len > 5) { -                ok_str = memstr(uart_buf + uart_buf_len - 5, len + 5, "\r\nOK\r\n"); -            } else { -                ok_str = memstr(uart_buf, len + uart_buf_len, "\r\nOK\r\n"); -            } -            uart_buf_len += len; -        } -        if (ok_str) { -            pppos_input_tcpip(ppp_handle, (uint8_t *)uart_buf, ok_str - uart_buf); -            ok_str += 6; -            uart_buf_len -= ok_str - uart_buf; -            if (uart_buf_len) memmove(uart_buf, ok_str, uart_buf_len); -            done = 1; -        } else if (uart_buf_len == sizeof(uart_buf)) { -            pppos_input_tcpip(ppp_handle, (uint8_t *)uart_buf, sizeof(uart_buf) / 2); -            memcpy(uart_buf, uart_buf + sizeof(uart_buf) / 2, sizeof(uart_buf) / 2); -            uart_buf_len = sizeof(uart_buf) / 2; -        } -        if (timeout && !done && ((uint32_t)((esp_timer_get_time() - t_start) / 1000) > timeout)) { -            if (!retries) { -                modem_set_mode(EOS_CELL_UART_MODE_PPP); -                xSemaphoreGive(uart_mutex); -                xSemaphoreGive(ppp_mutex); -                rv = EOS_ERR_TIMEOUT; -                done = 1; -            } else { -                retries--; -                at_cmd("+++"); -                t_start = esp_timer_get_time(); -            } -        } -    } while (!done); - -    return rv; -} - -static int ppp_resume(void) { -    int r; -    int rv = EOS_OK; - -    at_cmd("ATO\r"); -    r = at_expect("^CONNECT", "^(ERROR|NO CARRIER)", 1000); -    if (r <= 0) rv = EOS_ERR; - -    modem_set_mode(EOS_CELL_UART_MODE_PPP); -    xSemaphoreGive(uart_mutex); -    xSemaphoreGive(ppp_mutex); - -    return rv; -} - -static int ppp_setup(void) { -    int r; -    char cmd[64]; -    int cmd_len = snprintf(cmd, sizeof(cmd), "AT+CGDCONT=1,\"IP\",\"%s\"\r", ppp_apn); - -    if ((cmd_len < 0) || (cmd_len >= sizeof(cmd))) return EOS_ERR; - -    modem_set_mode(EOS_CELL_UART_MODE_NONE); -    r = xSemaphoreTake(uart_mutex, 1000 / portTICK_PERIOD_MS); -    if (r == pdFALSE) { -        modem_set_mode(uart_mode); -        return EOS_ERR_TIMEOUT; -    } - -    at_cmd(cmd); -    r = at_expect("^OK", "^ERROR", 1000); -    if (r <= 0) { -        modem_set_mode(uart_mode); -        xSemaphoreGive(uart_mutex); -        return EOS_ERR; -    } - -    at_cmd("AT+CGDATA=\"PPP\",1\r"); -    r = at_expect("^CONNECT", "^(ERROR|\\+CME ERROR|NO CARRIER)", 1000); -    if (r <= 0) { -        modem_set_mode(uart_mode); -        xSemaphoreGive(uart_mutex); -        return EOS_ERR; -    } - -    ppp_handle = pppapi_pppos_create(&ppp_netif, ppp_output_cb, ppp_status_cb, NULL); -    ppp_set_usepeerdns(ppp_handle, 1); -    pppapi_set_default(ppp_handle); -	pppapi_set_auth(ppp_handle, PPPAUTHTYPE_PAP, ppp_user, ppp_pass); -    pppapi_connect(ppp_handle, 0); - -    modem_set_mode(EOS_CELL_UART_MODE_PPP); -    xSemaphoreGive(uart_mutex); - -    return EOS_OK; -} - -static int ppp_disconnect(void) { -    int rv; - -    pppapi_close(ppp_handle, 0); - -    rv = ppp_pause(1000, 2); -    if (rv) return rv; - -    at_cmd("ATH\r"); -    at_expect("^OK", NULL, 1000); - -    xSemaphoreGive(uart_mutex); -    xSemaphoreGive(ppp_mutex); -    ppp_handle = NULL; - -    return EOS_OK; -} - -void eos_modem_init(void) { -    /* Configure parameters of an UART driver, -     * communication pins and install the driver */ -    uart_config_t uart_config = { -       .baud_rate = 115200, -       .data_bits = UART_DATA_8_BITS, -       .parity    = UART_PARITY_DISABLE, -       .stop_bits = UART_STOP_BITS_1, -       .flow_ctrl = UART_HW_FLOWCTRL_DISABLE -    }; -    uart_param_config(UART_NUM_2, &uart_config); -    uart_set_pin(UART_NUM_2, UART_GPIO_TXD, UART_GPIO_RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); -    uart_driver_install(UART_NUM_2, UART_SIZE_IO_BUF, UART_SIZE_IO_BUF, 10, &uart_queue, 0); - -    // Configuration for the DTR/RI lines -    gpio_config_t io_conf; - -    io_conf.intr_type = GPIO_INTR_DISABLE; -    io_conf.mode = GPIO_MODE_OUTPUT; -    io_conf.pin_bit_mask = ((uint64_t)1 << UART_GPIO_DTR); -    io_conf.pull_up_en = 0; -    io_conf.pull_down_en = 0; -    gpio_config(&io_conf); -    gpio_set_level(UART_GPIO_DTR, 0); - -    io_conf.intr_type = GPIO_INTR_NEGEDGE; -    io_conf.mode = GPIO_MODE_INPUT; -    io_conf.pin_bit_mask = ((uint64_t)1 << UART_GPIO_RI); -    io_conf.pull_up_en = 0; -    io_conf.pull_down_en = 0; -    gpio_config(&io_conf); - -    mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(mutex); - -    uart_mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(uart_mutex); - -    ppp_mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(ppp_mutex); - -    modem_queue = xQueueCreate(4, sizeof(modem_event_t)); -    xTaskCreate(uart_event_task, "uart_event", EOS_TASK_SSIZE_UART, NULL, EOS_TASK_PRIORITY_UART, NULL); -    xTaskCreate(modem_event_task, "modem_event", EOS_TASK_SSIZE_MODEM, NULL, EOS_TASK_PRIORITY_MODEM, NULL); - -    gpio_isr_handler_add(UART_GPIO_RI, uart_ri_isr_handler, NULL); - -    at_init(); -    at_urc_insert("^PB DONE", modem_urc_init_handler, REG_EXTENDED); -    eos_modem_set_mode(EOS_CELL_UART_MODE_ATCMD); - -    ESP_LOGI(TAG, "INIT"); -} - -void eos_modem_flush(void){ -    uart_wait_tx_done(UART_NUM_2, portMAX_DELAY); -} - -size_t eos_modem_write(void *data, size_t size) { -    return uart_write_bytes(UART_NUM_2, (const char *)data, size); -} - -size_t eos_modem_read(void *data, size_t size, uint32_t timeout) { -    return uart_read_bytes(UART_NUM_2, (uint8_t *)data, size, timeout / portTICK_RATE_MS); -} - -int eos_modem_readln(char *buf, size_t buf_size, uint32_t timeout) { -    char *ln_end = NULL; -    size_t buf_len = 0; -    uint64_t t_start = esp_timer_get_time(); - -    buf[0] = '\0'; -    if (uart_buf_len) { -        buf_len = MIN(buf_size -1, uart_buf_len); -        memcpy(buf, uart_buf, buf_len); -        buf[buf_len] = '\0'; -        ln_end = strchr(buf, '\n'); - -        uart_buf_len -= buf_len; -        if (uart_buf_len) memmove(uart_buf, uart_buf + buf_len, uart_buf_len); -    } - -    while (ln_end == NULL) { -        int len; - -        if (buf_len == buf_size - 1) return EOS_ERR_FULL; -        if (timeout && ((uint32_t)((esp_timer_get_time() - t_start) / 1000) > timeout)) return EOS_ERR_TIMEOUT; - -        len = eos_modem_read(buf + buf_len, MIN(buf_size - buf_len - 1, sizeof(uart_buf) - uart_buf_len), 10); -        if (len > 0) { -            buf[buf_len + len] = '\0'; -            ln_end = strchr(buf + buf_len, '\n'); -            buf_len += len; -        } -    } -    buf_len -= ln_end - buf + 1; -    if (buf_len) { -        if (uart_buf_len) memmove(uart_buf + buf_len, uart_buf, uart_buf_len); -        memcpy(uart_buf, ln_end + 1, buf_len); -        uart_buf_len += buf_len; -    } - -    if ((ln_end > buf) && (*(ln_end - 1) == '\r')) ln_end--; -    *ln_end = '\0'; - -    return EOS_OK; -} - -uint8_t eos_modem_get_mode(void) { -    uint8_t ret; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    ret = uart_mode; -    xSemaphoreGive(mutex); - -    return ret; -} - -int eos_modem_set_mode(uint8_t mode) { -    int rv = EOS_OK; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (mode != uart_mode) { -        if (uart_mode == EOS_CELL_UART_MODE_PPP) rv = ppp_disconnect(); -        if (!rv) { -            if (mode == EOS_CELL_UART_MODE_PPP) { -                rv = ppp_setup(); -            } else { -                modem_set_mode(mode); -            } -            if (!rv) uart_mode = mode; -        } -    } -    xSemaphoreGive(mutex); - -    return rv; -} - -int eos_modem_take(uint32_t timeout) { -    int rv = EOS_OK; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (uart_mode == EOS_CELL_UART_MODE_PPP) { -        rv = ppp_pause(timeout, 0); -    } else { -        int r; - -        modem_set_mode(EOS_CELL_UART_MODE_NONE); -        r = xSemaphoreTake(uart_mutex, timeout ? timeout / portTICK_PERIOD_MS : portMAX_DELAY); -        if (r == pdFALSE) { -            modem_set_mode(uart_mode); -            rv = EOS_ERR_TIMEOUT; -        } -    } - -    if (rv) xSemaphoreGive(mutex); - -    return rv; -} - -void eos_modem_give(void) { -    if (uart_mode == EOS_CELL_UART_MODE_PPP) { -        int rv = ppp_resume(); -        if (rv) ESP_LOGW(TAG, "PPP resume failed"); -    } else { -        modem_set_mode(uart_mode); -        xSemaphoreGive(uart_mutex); -    } -    xSemaphoreGive(mutex); -} - -void eos_modem_sleep(uint8_t mode) { -    int r; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    modem_set_mode(EOS_CELL_UART_MODE_NONE); -    r = xSemaphoreTake(uart_mutex, 1000 / portTICK_PERIOD_MS); -    if (r == pdFALSE) { -        ESP_LOGE(TAG, "Obtaining mutex before sleep failed"); -    } -    gpio_set_level(UART_GPIO_DTR, 1); -    if (mode == EOS_PWR_SMODE_DEEP) { -        gpio_hold_en(UART_GPIO_DTR); -    } -} - -void eos_modem_wake(uint8_t source, uint8_t mode) { -    if (source == EOS_PWR_WAKE_UART) { -        modem_event_t evt; - -        evt.type = MODEM_ETYPE_RI; -        xQueueSend(modem_queue, &evt, portMAX_DELAY); -    } - -    if (mode != EOS_PWR_SMODE_DEEP) { -        gpio_set_intr_type(UART_GPIO_RI, GPIO_INTR_NEGEDGE); -        gpio_isr_handler_add(UART_GPIO_RI, uart_ri_isr_handler, NULL); -        gpio_set_level(UART_GPIO_DTR, 0); - -        modem_set_mode(uart_mode); -        xSemaphoreGive(uart_mutex); -        xSemaphoreGive(mutex); -    } else { -        gpio_hold_dis(UART_GPIO_DTR); -    } -} - -void eos_ppp_set_apn(char *apn) { -    xSemaphoreTake(mutex, portMAX_DELAY); -    strncpy(ppp_apn, apn, sizeof(ppp_apn) - 1); -    xSemaphoreGive(mutex); -} - -void eos_ppp_set_auth(char *user, char *pass) { -    xSemaphoreTake(mutex, portMAX_DELAY); -    strncpy(ppp_user, user, sizeof(ppp_user) - 1); -    strncpy(ppp_pass, pass, sizeof(ppp_pass) - 1); -    xSemaphoreGive(mutex); -} - -int eos_ppp_connect(void) { -    return eos_modem_set_mode(EOS_CELL_UART_MODE_PPP); -} - -int eos_ppp_disconnect(void) { -    int rv = eos_modem_set_mode(EOS_CELL_UART_MODE_ATCMD); - -    xSemaphoreTake(mutex, portMAX_DELAY); -    memset(ppp_apn, 0, sizeof(ppp_apn)); -    memset(ppp_user, 0, sizeof(ppp_user)); -    memset(ppp_pass, 0, sizeof(ppp_pass)); -    xSemaphoreGive(mutex); - -    return rv; -}
\ No newline at end of file diff --git a/code/esp32/components/eos/cell_pcm.c b/code/esp32/components/eos/cell_pcm.c deleted file mode 100644 index 5c59643..0000000 --- a/code/esp32/components/eos/cell_pcm.c +++ /dev/null @@ -1,258 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/semphr.h> -#include <freertos/task.h> -#include <freertos/queue.h> -#include <driver/i2s.h> -#include <driver/gpio.h> -#include <esp_log.h> - -#include "eos.h" -#include "net.h" -#include "msgq.h" -#include "cell.h" - -#define PCM_MIC_WM          128 -#define PCM_HOLD_CNT_TX     3 -#define PCM_HOLD_CNT_RX     3 -#define PCM_SIZE_BUFQ       4 -#define PCM_SIZE_BUF        (PCM_MIC_WM * 4) - -#define PCM_GPIO_BCK        33 -#define PCM_GPIO_WS         4 -#define PCM_GPIO_DIN        34 -#define PCM_GPIO_DOUT       2 - -#define PCM_ETYPE_WRITE     1 - -static EOSBufQ pcm_buf_q; -static unsigned char *pcm_bufq_array[PCM_SIZE_BUFQ]; - -static EOSMsgQ pcm_evt_q; -static EOSMsgItem pcm_evtq_array[PCM_SIZE_BUFQ]; -static char pcm_hold_tx; - -static i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0, &I2S1}; - -static QueueHandle_t i2s_queue; -static SemaphoreHandle_t mutex; - -static const char *TAG = "EOS PCM"; - -static void i2s_event_task(void *pvParameters) { -    i2s_event_t event; -    unsigned char *buf; -    unsigned char _type; -    size_t bytes_w; -    ssize_t bytes_r; -    uint16_t bytes_e; -    ssize_t hold_bytes_r = 0; -    unsigned char *hold_buf = NULL; -    char hold_cnt = 0; - -    while (1) { -        // Waiting for I2S event. -        if (xQueueReceive(i2s_queue, &event, portMAX_DELAY)) { -            switch (event.type) { -                case I2S_EVENT_RX_DONE: -                    // Event of I2S receiving data -                    if (!hold_cnt) { -                        buf = eos_net_alloc(); -                        buf[0] = EOS_CELL_MTYPE_PCM_DATA; -                        bytes_r = eos_cell_pcm_read(buf + 1, PCM_MIC_WM); -                        eos_net_send(EOS_NET_MTYPE_CELL, buf, bytes_r + 1, 0); -                    } else { -                        hold_cnt--; -                        if (hold_buf == NULL) { -                            hold_buf = eos_net_alloc(); -                            hold_buf[0] = EOS_CELL_MTYPE_PCM_DATA; -                        } -                        if (1 + hold_bytes_r + PCM_MIC_WM <= EOS_NET_SIZE_BUF) hold_bytes_r += eos_cell_pcm_read(hold_buf + 1 + hold_bytes_r, PCM_MIC_WM); -                        if (hold_cnt == 0) { -                            eos_net_send(EOS_NET_MTYPE_CELL, hold_buf, hold_bytes_r + 1, 0); -                            hold_bytes_r = 0; -                            hold_buf = NULL; -                        } -                    } - -                    buf = NULL; -                    xSemaphoreTake(mutex, portMAX_DELAY); -                    if (pcm_hold_tx && (eos_msgq_len(&pcm_evt_q) == PCM_HOLD_CNT_TX)) pcm_hold_tx = 0; -                    if (!pcm_hold_tx) eos_msgq_pop(&pcm_evt_q, &_type, &buf, &bytes_e, NULL); -                    xSemaphoreGive(mutex); - -                    if (buf) { -                        i2s_write(I2S_NUM_0, (const void *)buf, bytes_e, &bytes_w, portMAX_DELAY); -                        xSemaphoreTake(mutex, portMAX_DELAY); -                        eos_bufq_push(&pcm_buf_q, buf); -                        xSemaphoreGive(mutex); -                    } -                    break; -                case I2S_EVENT_DMA_ERROR: -                    ESP_LOGE(TAG, "*** I2S DMA ERROR ***"); -                    break; -                case I2S_EVENT_MAX: -                    hold_cnt = PCM_HOLD_CNT_RX; -                    break; -                default: -                    break; -            } -        } -    } -    vTaskDelete(NULL); -} - -void eos_cell_pcm_init(void) { -    int i; - -    i2s_config_t i2s_config = { -        .mode = I2S_MODE_SLAVE | I2S_MODE_TX | I2S_MODE_RX, -        .sample_rate = 32000, -        .bits_per_sample = 32, -        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, -        .communication_format = I2S_COMM_FORMAT_I2S, -        .dma_buf_count = 4, -        .dma_buf_len = PCM_MIC_WM, -        .use_apll = true, -        .fixed_mclk = 2048000 * 8, -        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 -    }; - -    i2s_pin_config_t pin_config = { -        .bck_io_num     = PCM_GPIO_BCK, -        .ws_io_num      = PCM_GPIO_WS, -        .data_in_num    = PCM_GPIO_DIN, -        .data_out_num   = PCM_GPIO_DOUT -    }; -    i2s_driver_install(I2S_NUM_0, &i2s_config, 10, &i2s_queue);   //install and start i2s driver -    i2s_stop(I2S_NUM_0); -    i2s_set_pin(I2S_NUM_0, &pin_config); -    gpio_matrix_in(pin_config.ws_io_num, I2S0I_WS_IN_IDX, 1); -    gpio_matrix_in(pin_config.bck_io_num, I2S0I_BCK_IN_IDX, 1); -    ESP_LOGI(TAG, "TX FIFO:%d TX CHAN:%d RX FIFO:%d RX CHAN:%d", I2S[I2S_NUM_0]->fifo_conf.tx_fifo_mod, I2S[I2S_NUM_0]->conf_chan.tx_chan_mod, I2S[I2S_NUM_0]->fifo_conf.rx_fifo_mod, I2S[I2S_NUM_0]->conf_chan.rx_chan_mod); - -    I2S[I2S_NUM_0]->fifo_conf.tx_fifo_mod = 2; -    I2S[I2S_NUM_0]->conf_chan.tx_chan_mod = 0; - -    I2S[I2S_NUM_0]->fifo_conf.rx_fifo_mod = 3; -    I2S[I2S_NUM_0]->conf_chan.rx_chan_mod = 1; -    // I2S[I2S_NUM_0]->conf.tx_mono = 1; -    I2S[I2S_NUM_0]->conf.rx_mono = 1; -    // I2S[I2S_NUM_0]->timing.tx_dsync_sw = 1 -    // I2S[I2S_NUM_0]->timing.rx_dsync_sw = 1 -    // I2S[I2S_NUM_0]->conf.sig_loopback = 0; - -    // I2S[I2S_NUM_0]->timing.tx_bck_in_inv = 1; - -    eos_msgq_init(&pcm_evt_q, pcm_evtq_array, PCM_SIZE_BUFQ); -    eos_bufq_init(&pcm_buf_q, pcm_bufq_array, PCM_SIZE_BUFQ); -    for (i=0; i<PCM_SIZE_BUFQ; i++) { -        eos_bufq_push(&pcm_buf_q, malloc(PCM_SIZE_BUF)); -    } - -    mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(mutex); - -    // Create a task to handle i2s event from ISR -    xTaskCreate(i2s_event_task, "i2s_event", EOS_TASK_SSIZE_I2S, NULL, EOS_TASK_PRIORITY_I2S, NULL); -    ESP_LOGI(TAG, "INIT"); -} - -ssize_t eos_cell_pcm_read(unsigned char *data, size_t size) { -    static unsigned char buf[PCM_SIZE_BUF]; -    size_t bytes_r; -    int i; - -    if (size > PCM_MIC_WM) return EOS_ERR; - -    esp_err_t ret = i2s_read(I2S_NUM_0, (void *)buf, size * 4, &bytes_r, portMAX_DELAY); -    if (ret != ESP_OK) return EOS_ERR; - -    for (i=0; i<size/2; i++) { -        data[i * 2] = buf[i * 8 + 3]; -        data[i * 2 + 1] = buf[i * 8 + 2]; -    } - -    return bytes_r / 4; -} - -static ssize_t pcm_expand(unsigned char *buf, unsigned char *data, size_t size) { -    int i; - -    if (size > PCM_MIC_WM) return EOS_ERR; - -    memset(buf, 0, PCM_SIZE_BUF); -    for (i=0; i<size/2; i++) { -        buf[i * 8 + 3] = data[i * 2]; -        buf[i * 8 + 2] = data[i * 2 + 1]; -    } - -    return size * 4; -} - -int eos_cell_pcm_push(unsigned char *data, size_t size) { -    unsigned char *buf = NULL; -    ssize_t esize; -    int rv; - -    if (size > PCM_MIC_WM) return EOS_ERR; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (pcm_hold_tx && (eos_msgq_len(&pcm_evt_q) == PCM_HOLD_CNT_TX)) { -        unsigned char _type; -        uint16_t _len; - -        eos_msgq_pop(&pcm_evt_q, &_type, &buf, &_len, NULL); -    } else { -        buf = eos_bufq_pop(&pcm_buf_q); -    } -    xSemaphoreGive(mutex); - -    if (buf == NULL) return EOS_ERR_EMPTY; - -    esize = pcm_expand(buf, data, size); -    if (esize < 0) { -        xSemaphoreTake(mutex, portMAX_DELAY); -        eos_bufq_push(&pcm_buf_q, buf); -        xSemaphoreGive(mutex); -        return esize; -    } - -    xSemaphoreTake(mutex, portMAX_DELAY); -    rv = eos_msgq_push(&pcm_evt_q, PCM_ETYPE_WRITE, buf, esize, 0); -    if (rv) eos_bufq_push(&pcm_buf_q, buf); -    xSemaphoreGive(mutex); - -    return rv; -} - -void eos_cell_pcm_start(void) { -    i2s_event_t evt; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    while (1) { -        unsigned char _type; -        unsigned char *buf; -        uint16_t len; - -        eos_msgq_pop(&pcm_evt_q, &_type, &buf, &len, NULL); -        if (buf) { -            eos_bufq_push(&pcm_buf_q, buf); -        } else { -            break; -        } -    } -    pcm_hold_tx = 1; -    xSemaphoreGive(mutex); - -    evt.type = I2S_EVENT_MAX;   /* my type */ -    xQueueSend(i2s_queue, &evt, portMAX_DELAY); -    i2s_zero_dma_buffer(I2S_NUM_0); -    i2s_start(I2S_NUM_0); -} - -void eos_cell_pcm_stop(void) { -    i2s_stop(I2S_NUM_0); -} diff --git a/code/esp32/components/eos/cell_sms.c b/code/esp32/components/eos/cell_sms.c deleted file mode 100644 index 05acc50..0000000 --- a/code/esp32/components/eos/cell_sms.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> - -#include <esp_log.h> - -#include "eos.h" -#include "cell.h" - - -void eos_cell_sms_handler(unsigned char mtype, unsigned char *buffer, uint16_t size) { -    int rv; - -    rv = eos_modem_take(1000); -    if (rv) return; - -    buffer += 1; -    size -= 1; -    switch (mtype) { -    } - -    eos_modem_give(); -} diff --git a/code/esp32/components/eos/cell_ussd.c b/code/esp32/components/eos/cell_ussd.c deleted file mode 100644 index 2daa00f..0000000 --- a/code/esp32/components/eos/cell_ussd.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> - -#include <esp_log.h> - -#include "at_cmd.h" -#include "cell.h" -#include "gsm.h" - -static char cmd[256]; - -void eos_cell_ussd_handler(unsigned char mtype, unsigned char *buffer, uint16_t size) { -    int cmd_len, rv; - -    rv = eos_modem_take(1000); -    if (rv) return; - -    buffer += 1; -    size -= 1; -    switch (mtype) { -        case EOS_CELL_MTYPE_USSD_REQUEST: -            if (size == 0) return; - -            buffer[size] = '\0'; -            cmd_len = snprintf(cmd, sizeof(cmd), "AT+CUSD=1,\"%s\",15\r", buffer); -            if ((cmd_len < 0) || (cmd_len >= sizeof(cmd))) return; -            at_cmd(cmd); - -            break; -    } - -    eos_modem_give(); -} - diff --git a/code/esp32/components/eos/cell_voice.c b/code/esp32/components/eos/cell_voice.c deleted file mode 100644 index 3f6a2a5..0000000 --- a/code/esp32/components/eos/cell_voice.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdlib.h> - -#include <esp_log.h> - -#include "eos.h" -#include "cell.h" - -void eos_cell_voice_handler(unsigned char mtype, unsigned char *buffer, uint16_t size) { -    int rv; - -    rv = eos_modem_take(1000); -    if (rv) return; - -    buffer += 1; -    size -= 1; -    switch (mtype) { -    } - -    eos_modem_give(); -} diff --git a/code/esp32/components/eos/component.mk b/code/esp32/components/eos/component.mk deleted file mode 100644 index e69de29..0000000 --- a/code/esp32/components/eos/component.mk +++ /dev/null diff --git a/code/esp32/components/eos/drv2605l.c b/code/esp32/components/eos/drv2605l.c deleted file mode 100644 index 3944289..0000000 --- a/code/esp32/components/eos/drv2605l.c +++ /dev/null @@ -1,82 +0,0 @@ -#include <stdlib.h> - -#include <esp_log.h> - -#include "eos.h" -#include "i2c.h" - -static const char *TAG = "EOS DRV2605L"; - -#define DRV2605L_ADDR                0x5A - -#define DRV2605_REG_STATUS 0x00       ///< Status register -#define DRV2605_REG_MODE 0x01         ///< Mode register -#define DRV2605_MODE_INTTRIG 0x00     ///< Internal trigger mode -#define DRV2605_MODE_EXTTRIGEDGE 0x01 ///< External edge trigger mode -#define DRV2605_MODE_EXTTRIGLVL 0x02  ///< External level trigger mode -#define DRV2605_MODE_PWMANALOG 0x03   ///< PWM/Analog input mode -#define DRV2605_MODE_AUDIOVIBE 0x04   ///< Audio-to-vibe mode -#define DRV2605_MODE_REALTIME 0x05    ///< Real-time playback (RTP) mode -#define DRV2605_MODE_DIAGNOS 0x06     ///< Diagnostics mode -#define DRV2605_MODE_AUTOCAL 0x07     ///< Auto calibration mode - -#define DRV2605_REG_RTPIN 0x02        ///< Real-time playback input register -#define DRV2605_REG_LIBRARY 0x03      ///< Waveform library selection register -#define DRV2605_REG_WAVESEQ1 0x04     ///< Waveform sequence register 1 -#define DRV2605_REG_WAVESEQ2 0x05     ///< Waveform sequence register 2 -#define DRV2605_REG_WAVESEQ3 0x06     ///< Waveform sequence register 3 -#define DRV2605_REG_WAVESEQ4 0x07     ///< Waveform sequence register 4 -#define DRV2605_REG_WAVESEQ5 0x08     ///< Waveform sequence register 5 -#define DRV2605_REG_WAVESEQ6 0x09     ///< Waveform sequence register 6 -#define DRV2605_REG_WAVESEQ7 0x0A     ///< Waveform sequence register 7 -#define DRV2605_REG_WAVESEQ8 0x0B     ///< Waveform sequence register 8 - -#define DRV2605_REG_GO 0x0C           ///< Go register -#define DRV2605_REG_OVERDRIVE 0x0D    ///< Overdrive time offset register -#define DRV2605_REG_SUSTAINPOS 0x0E   ///< Sustain time offset, positive register -#define DRV2605_REG_SUSTAINNEG 0x0F   ///< Sustain time offset, negative register -#define DRV2605_REG_BREAK 0x10        ///< Brake time offset register -#define DRV2605_REG_AUDIOCTRL 0x11    ///< Audio-to-vibe control register -#define DRV2605_REG_AUDIOLVL 0x12     ///< Audio-to-vibe minimum input level register -#define DRV2605_REG_AUDIOMAX 0x13     ///< Audio-to-vibe maximum input level register -#define DRV2605_REG_AUDIOOUTMIN 0x14  ///< Audio-to-vibe minimum output drive register -#define DRV2605_REG_AUDIOOUTMAX 0x15  ///< Audio-to-vibe maximum output drive register -#define DRV2605_REG_RATEDV 0x16       ///< Rated voltage register -#define DRV2605_REG_CLAMPV 0x17       ///< Overdrive clamp voltage register -#define DRV2605_REG_AUTOCALCOMP 0x18  ///< Auto-calibration compensation result register -#define DRV2605_REG_AUTOCALEMP 0x19   ///< Auto-calibration back-EMF result register -#define DRV2605_REG_FEEDBACK 0x1A     ///< Feedback control register -#define DRV2605_REG_CONTROL1 0x1B     ///< Control1 Register -#define DRV2605_REG_CONTROL2 0x1C     ///< Control2 Register -#define DRV2605_REG_CONTROL3 0x1D     ///< Control3 Register -#define DRV2605_REG_CONTROL4 0x1E     ///< Control4 Register -#define DRV2605_REG_VBAT 0x21         ///< Vbat voltage-monitor register -#define DRV2605_REG_LRARESON 0x22     ///< LRA resonance-period register - -void eos_drv2605l_test(void) { -    uint8_t data = 0; - -    int ret = eos_i2c_read(DRV2605L_ADDR, DRV2605_REG_STATUS, &data, 1); -    if (ret) ESP_LOGE(TAG, "I2C ERROR!"); - -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_MODE, 0x00);      // out of standby -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_RTPIN, 0x00);     // no real-time-playback - -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_WAVESEQ1, 1);     // strong click -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_WAVESEQ2, 0);     // end sequence - -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_OVERDRIVE, 0);    // no overdrive - -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_SUSTAINPOS, 0); -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_SUSTAINNEG, 0); -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_BREAK, 0); -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_AUDIOMAX, 0x64); - -    // LRA open loop -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_FEEDBACK, eos_i2c_read8(DRV2605L_ADDR, DRV2605_REG_FEEDBACK) | 0x80);     // turn on N_ERM_LRA -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_CONTROL3, eos_i2c_read8(DRV2605L_ADDR, DRV2605_REG_CONTROL3) | 0x01);     // turn on LRA_OPEN_LOOP - -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_LIBRARY, 6);      // set LRA library -    eos_i2c_write8(DRV2605L_ADDR, DRV2605_REG_GO, 1);           // go - -} diff --git a/code/esp32/components/eos/gsm.c b/code/esp32/components/eos/gsm.c deleted file mode 100644 index 788722e..0000000 --- a/code/esp32/components/eos/gsm.c +++ /dev/null @@ -1,453 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include "gsm.h" - -#define DIVC(x,y)                   ((x) / (y) + ((x) % (y) != 0)) - -uint8_t pdu_getc(char *pdu) { -    int ch; -    sscanf(pdu, "%2X", &ch); -    return ch; -} - -void pdu_putc(uint8_t ch, char *pdu) { -    sprintf(pdu, "%.2X", ch); -} - -void pdu_puts(uint8_t *s, int s_len, char *pdu) { -    int i; - -    for (i=0; i<s_len; i++) { -        sprintf(pdu + 2 * i, "%.2X", s[i]); -    } -} - -void pdu_gets(char *pdu, uint8_t *s, int s_len) { -    int i, ch; - -    for (i=0; i<s_len; i++) { -        sscanf(pdu + 2 * i, "%2X", &ch); -        s[i] = ch; -    } -} - -void gsm_dcs_dec(uint8_t dcs, uint8_t *enc, uint16_t *flags) { -    if ((dcs & GSM_DCS_GENERAL_IND) == 0) { -        *enc = dcs & GSM_DCS_ENC; -        if (dcs & GSM_DCS_CLASS_IND) { -            *flags |= GSM_FLAG_CLASS; -            *flags |= (uint16_t)(dcs & GSM_DCS_CLASS) << 8; -        } -        if (dcs & GSM_DCS_COMPRESS_IND) *flags |= GSM_FLAG_COMPRESS; -        if (dcs & GSM_DCS_DELETE_IND) *flags |= GSM_FLAG_DELETE; -    } else { -        uint8_t group = dcs & GSM_DCS_GROUP; - -        switch (group) { -            case GSM_DCS_MWI_DISCARD: -            case GSM_DCS_MWI_STORE_GSM7: -            case GSM_DCS_MWI_STORE_UCS2: -                if (group == GSM_DCS_MWI_STORE_UCS2) { -                    *enc = GSM_ENC_UCS2; -                } else { -                    *enc = GSM_ENC_7BIT; -                } -                if (GSM_DCS_MWI_DISCARD) *flags |= GSM_FLAG_DISCARD; -                *flags |= GSM_FLAG_MWI; -                *flags |= (uint16_t)(dcs & (GSM_DCS_MWI_SENSE | GSM_DCS_MWI_TYPE)) << 12; -                break; - -            case GSM_DCS_ENCLASS: -                *flags |= GSM_FLAG_CLASS; -                *flags |= (uint16_t)(dcs & GSM_DCS_CLASS) << 8; -                *enc = dcs & GSM_DCS_ENCLASS_ENC ? GSM_ENC_8BIT : GSM_ENC_7BIT; -                break; -        } -    } -} - -void gsm_dcs_enc(uint8_t enc, uint16_t flags, uint8_t *dcs) { -    *dcs = enc; -    if (flags & GSM_FLAG_CLASS) { -        *dcs |= GSM_DCS_CLASS_IND; -        *dcs |= (flags >> 8) & GSM_DCS_CLASS; -    } -    if (flags & GSM_FLAG_COMPRESS) *dcs |= GSM_DCS_COMPRESS_IND; -    if (flags & GSM_FLAG_DELETE) *dcs |= GSM_DCS_DELETE_IND; -} - -int gsm_ts_enc(char *ts, char *pdu, int pdu_size) { -    uint8_t tz; -    int tz_hh, tz_mm; - -    if (pdu_size < 14) return GSM_ERR; - -    pdu[1]  = ts[2];    // YY -    pdu[0]  = ts[3]; - -    pdu[3]  = ts[5];    // MM -    pdu[2]  = ts[6]; - -    pdu[5]  = ts[8];    // DD -    pdu[4]  = ts[9]; - -    pdu[7]  = ts[11];   // hh -    pdu[6]  = ts[12]; - -    pdu[9]  = ts[14];   // mm -    pdu[8]  = ts[15]; - -    pdu[11] = ts[17];   // ss -    pdu[10] = ts[18]; - -    sscanf(ts + 20, "%2d:%2d", &tz_hh, &tz_mm); -    tz = tz_hh * 4 + tz_mm / 15; -    tz = (tz / 10) | ((tz % 10) << 4); -    if (ts[19] == '-') tz |= 0x08; - -    pdu_putc(tz, pdu + 12); - -    return 14; -} - -int gsm_ts_dec(char *pdu, int pdu_len, char *ts) { -    uint8_t tz; - -    if (pdu_len < 14) return GSM_ERR; - -    ts[0]  = '2'; -    ts[1]  = '0'; -    ts[2]  = pdu[1];    // YY -    ts[3]  = pdu[0]; -    ts[4]  = '-'; -    ts[5]  = pdu[3];    // MM -    ts[6]  = pdu[2]; -    ts[7]  = '-'; -    ts[8]  = pdu[5];    // DD -    ts[9]  = pdu[4]; -    ts[10] = 'T'; -    ts[11] = pdu[7];    // hh -    ts[12] = pdu[6]; -    ts[13] = ':'; -    ts[14] = pdu[9];    // mm -    ts[15] = pdu[8]; -    ts[16] = ':'; -    ts[17] = pdu[11];   // ss -    ts[18] = pdu[10]; - -    tz = pdu_getc(pdu + 12); -    if (tz & 0x08) { -        ts[19] = '-'; -        tz = tz & ~0x08; -    } else { -        ts[19] = '+'; -    } -    tz = (tz & 0x0f) * 10 + (tz >> 4); -    sprintf(ts + 20, "%.2d:%.2d", tz / 4, (tz % 4) * 15); - -    return 14; -} - -int gsm_7bit_enc(char *text, int text_len, char *pdu, int padb) { -    uint8_t carry = 0; -    int i = 0, pdu_len = 0, shc = 0; - -    if (!text_len) return 0; - -    if (padb) { -        shc = 7 - padb; -    } else { -        carry = *text; -        i++; -    } - -    while (i < text_len) { -        pdu_putc(carry | (*(text + i) << (7 - shc)), pdu + pdu_len); -        pdu_len += 2; - -        shc++; -        shc = shc % 7; -        if (!shc) { -            i++; -            if (i == text_len) return pdu_len; -        } - -        carry = *(text + i) >> shc; -        i++; -    } -    pdu_putc(carry, pdu + pdu_len); -    pdu_len += 2; - -    return pdu_len; -} - -int gsm_7bit_dec(char *pdu, char *text, int text_len, int padb) { -    uint8_t ch; -    uint8_t carry = 0; -    int i = 0, pdu_len = 0, shc = 0; - -    if (!text_len) return 0; - -    if (padb) { -        ch = pdu_getc(pdu); -        pdu_len += 2; -        if (padb == 1) { -            *text = ch >> 1; -            i++; -        } else { -            carry = ch >> padb; -            shc = 8 - padb; -        } -    } - -    while (i < text_len) { -        ch = pdu_getc(pdu + pdu_len); -        pdu_len += 2; - -        *(text + i) = ((ch << shc) | carry) & 0x7f; -        carry = ch >> (7 - shc); -        i++; - -        shc++; -        shc = shc % 7; -        if (!shc && (i < text_len)) { -            *(text + i) = carry; -            carry = 0; -            i++; -        } -    } - -    return pdu_len; -} - -int gsm_addr_enc(char *addr, int addr_len, uint8_t addr_type, char *pdu, int pdu_size) { -    int _pdu_len; - -    addr_type |= GSM_EXT; - -    if ((addr_type & GSM_TON) == GSM_TON_ALPHANUMERIC) { -        int _addr_len = DIVC(addr_len * 7, 4); - -        _pdu_len = 4 + DIVC(_addr_len, 2) * 2; -        if (pdu_size < _pdu_len) return GSM_ERR; - -        pdu_putc(_addr_len, pdu); -        pdu_putc(addr_type, pdu + 2); -        gsm_7bit_enc(addr, addr_len, pdu, 0); -    } else { -        int i; - -        if (addr_type & GSM_TON_INTERNATIONAL) { -            if (addr[0] != '+') return GSM_ERR; -            addr++; -            addr_len--; -        } -        _pdu_len = 4 + DIVC(addr_len, 2) * 2; -        if (pdu_size < _pdu_len) return GSM_ERR; - -        pdu_putc(addr_len, pdu); -        pdu_putc(addr_type, pdu + 2); -        for (i=0; i<addr_len / 2; i++) { -            pdu[4 + 2 * i] = addr[2 * i + 1]; -            pdu[4 + 2 * i + 1] = addr[2 * i]; -        } -        if (addr_len % 2 != 0) { -            pdu[4 + 2 * i] = 'F'; -            pdu[4 + 2 * i + 1] = addr[2 * i]; -        } -    } - -    return _pdu_len; -} - -int gsm_addr_dec(char *pdu, int pdu_len, char *addr, int addr_size, int *addr_len, uint8_t *addr_type) { -    int _pdu_len; - -    if (pdu_len < 4) return GSM_ERR; - -    *addr_len = pdu_getc(pdu); -    *addr_type = pdu_getc(pdu + 2); - -    if (!(*addr_type & GSM_EXT)) return GSM_ERR; - -    _pdu_len = 4 + DIVC(*addr_len, 2) * 2; -    if (pdu_len < _pdu_len) return GSM_ERR; - -    if ((*addr_type & GSM_TON) == GSM_TON_ALPHANUMERIC) { -        *addr_len = (*addr_len * 4) / 7; -        if (addr_size < *addr_len) return GSM_ERR; - -        gsm_7bit_dec(pdu + 4, addr, *addr_len, 0); -    } else { -        int i; -        int _addr_len = *addr_len; - -        if (*addr_type & GSM_TON_INTERNATIONAL) { -            addr[0] = '+'; -            addr++; -            (*addr_len)++; -        } -        if (addr_size < *addr_len) return GSM_ERR; - -        for (i=0; i<_addr_len / 2; i++) { -            addr[2 * i] = pdu[4 + 2 * i + 1]; -            addr[2 * i + 1] = pdu[4 + 2 * i]; -        } -        if (_addr_len % 2 != 0) { -            addr[2 * i] = pdu[4 + 2 * i + 1]; -        } -    } - -    return _pdu_len; -} - -int gsm_sms_enc(uint8_t pid, char *addr, int addr_len, uint8_t addr_type, uint8_t *udh, int udh_len, uint8_t *msg, int msg_len, uint8_t enc, uint16_t flags, char *pdu, int pdu_size) { -    int rv, _pdu_len = 0; -    uint8_t mti = GSM_MTI_SUBMIT; -    uint8_t dcs = 0; -    uint8_t udl; - -    if (udh_len) mti |= GSM_UDHI; - -    if (pdu_size < 4) return GSM_ERR; -    pdu_putc(mti, pdu); -    pdu_putc(00, pdu + 2); -    _pdu_len += 4; - -    rv = gsm_addr_enc(addr, addr_len, addr_type, pdu + _pdu_len, pdu_size - _pdu_len); -    if (rv < 0) return rv; -    _pdu_len += rv; - -    if (pdu_size < _pdu_len + 4) return GSM_ERR; -    gsm_dcs_enc(enc, flags, &dcs); -    pdu_putc(pid, pdu + _pdu_len); -    pdu_putc(dcs, pdu + _pdu_len + 2); -    _pdu_len += 4; - -    if (enc == GSM_ENC_7BIT) { -        int udh_blen = 0; -        int padb = 0; - -        if (udh_len) { -            udh_blen = 8 * (udh_len + 1); -            padb = DIVC(udh_blen, 7) * 7 - udh_blen; -        } -        udl = DIVC(udh_blen, 7) + msg_len; - -        if (pdu_size < _pdu_len + (DIVC(udl * 7, 8) + 1) * 2) return GSM_ERR; -        pdu_putc(udl, pdu + _pdu_len); -        _pdu_len += 2; - -        if (udh_len) { -            pdu_putc(udh_len, pdu + _pdu_len); -            pdu_puts(udh, udh_len, pdu + _pdu_len + 2); -            _pdu_len += (udh_len + 1) * 2; -        } - -        rv = gsm_7bit_enc((char *)msg, msg_len, pdu + _pdu_len, padb); -        if (rv < 0) return rv; -        _pdu_len += rv; -    } else { -        udl = msg_len + (udh_len ? udh_len + 1 : 0); - -        if (pdu_size < _pdu_len + (udl + 1) * 2) return GSM_ERR; -        pdu_putc(udl, pdu + _pdu_len); -        _pdu_len += 2; - -        if (udh_len) { -            pdu_putc(udh_len, pdu + _pdu_len); -            pdu_puts(udh, udh_len, pdu + _pdu_len + 2); -            _pdu_len += (udh_len + 1) * 2; -        } - -        pdu_puts(msg, msg_len, pdu + _pdu_len); -        _pdu_len += msg_len * 2; -    } - -    return _pdu_len; -} - -int gsm_sms_dec(char *pdu, int pdu_len, uint8_t *pid, char *addr, int addr_size, int *addr_len, uint8_t *addr_type, uint8_t *udh, int udh_size, int *udh_len, uint8_t *msg, int msg_size, int *msg_len, char *ts, uint8_t *enc, uint16_t *flags) { -    int rv, _pdu_len = 0; -    uint8_t mti; -    uint8_t dcs; -    uint8_t udl; - -    if (pdu_len < 2) return GSM_ERR; -    mti = pdu_getc(pdu); -    _pdu_len += 2; -    if ((mti & GSM_MTI) != GSM_MTI_DELIVER) return GSM_ERR; - -    rv = gsm_addr_dec(pdu + _pdu_len, pdu_len - _pdu_len, addr, addr_size, addr_len, addr_type); -    if (rv < 0) return rv; -    _pdu_len += rv; - -    if (pdu_len < _pdu_len + 4) return GSM_ERR; -    *pid = pdu_getc(pdu + _pdu_len); -    dcs = pdu_getc(pdu + _pdu_len + 2); -    _pdu_len += 4; -    gsm_dcs_dec(dcs, enc, flags); - -    rv = gsm_ts_dec(pdu + _pdu_len, pdu_len - _pdu_len, ts); -    if (rv < 0) return rv; -    _pdu_len += rv; - -    if (pdu_len < _pdu_len + 2) return GSM_ERR; -    udl = pdu_getc(pdu + _pdu_len); -    _pdu_len += 2; - -    if ((mti & GSM_UDHI) && (udl == 0)) return GSM_ERR; -    *udh_len = 0; - -    if (*enc == GSM_ENC_7BIT) { -        int udh_blen = 0; -        int padb = 0; - -        if (pdu_len < _pdu_len + DIVC(udl * 7, 8) * 2) return GSM_ERR; - -        if (mti & GSM_UDHI) { -            *udh_len = pdu_getc(pdu + _pdu_len); -            udh_blen = 8 * (*udh_len + 1); -            padb = DIVC(udh_blen, 7) * 7 - udh_blen; - -            if (udl * 7 < udh_blen) return GSM_ERR; -            if (udh_size < *udh_len) return GSM_ERR; - -            pdu_gets(pdu + _pdu_len + 2, udh, *udh_len); -            _pdu_len += (*udh_len + 1) * 2; -        } else { -            *udh_len = 0; -        } - -        *msg_len = udl - DIVC(udh_blen, 7); -        if (msg_size < *msg_len) return GSM_ERR; - -        rv = gsm_7bit_dec(pdu + _pdu_len, (char *)msg, *msg_len, padb); -        if (rv < 0) return rv; -        _pdu_len += rv; -    } else { -        if (pdu_len < _pdu_len + udl * 2) return GSM_ERR; - -        if (mti & GSM_UDHI) { -            *udh_len = pdu_getc(pdu + _pdu_len); - -            if (udl < *udh_len + 1) return GSM_ERR; -            if (udh_size < *udh_len) return GSM_ERR; - -            pdu_gets(pdu + _pdu_len + 2, udh, *udh_len); -            _pdu_len += (*udh_len + 1) * 2; -        } else { -            *udh_len = 0; -        } - -        *msg_len = udl - (*udh_len ? *udh_len + 1 : 0); -        if (msg_size < *msg_len) return GSM_ERR; - -        pdu_gets(pdu + _pdu_len, msg, *msg_len); -        _pdu_len += *msg_len * 2; -    } - -    return _pdu_len; -} diff --git a/code/esp32/components/eos/gsm_cp.c b/code/esp32/components/eos/gsm_cp.c deleted file mode 100644 index 3ab98c5..0000000 --- a/code/esp32/components/eos/gsm_cp.c +++ /dev/null @@ -1,109 +0,0 @@ -#include <stdint.h> - -#include "gsm.h" - -#define UCS2_SUPL_SIZE  11 - -static const uint16_t gsm7_to_ucs2[128] = { -    0x0040, 0x00a3, 0x0024, 0x00a5, 0x00e8, 0x00e9, 0x00f9, 0x00ec, 0x00f2, 0x00c7, 0x000a, 0x00d8, 0x00f8, 0x000d, 0x00c5, 0x00e5, -    0x0394, 0x005f, 0x03a6, 0x0393, 0x039b, 0x03a9, 0x03a0, 0x03a8, 0x03a3, 0x0398, 0x039e, 0x001b, 0x00c6, 0x00e6, 0x00df, 0x00c9, -    0x0020, 0x0021, 0x0022, 0x0023, 0x00a4, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, -    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, -    0x00a1, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, -    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00c4, 0x00d6, 0x00d1, 0x00dc, 0x00a7, -    0x00bf, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, -    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00e4, 0x00f6, 0x00f1, 0x00fc, 0x00e0 -}; - -static const uint16_t gsm7e_to_ucs2[128] = { -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x000c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0x005e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x007b, 0x007d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x005c, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x005b, 0x007e, 0x005d, 0xffff, -    0x007c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x20ac, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff -}; - -static const uint16_t ucs2_to_gsm7[256] = { -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x000a, 0xffff, 0x1b0a, 0x000d, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x001b, 0xffff, 0xffff, 0xffff, 0xffff, -    0x0020, 0x0021, 0x0022, 0x0023, 0x0002, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, -    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, -    0x0000, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, -    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x1b3c, 0x1b2f, 0x1b3e, 0x1b14, 0x0011, -    0xffff, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, -    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x1b28, 0x1b40, 0x1b29, 0x1b3d, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0x0040, 0xffff, 0x0001, 0x0024, 0x0003, 0xffff, 0x005f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0060, -    0xffff, 0xffff, 0xffff, 0xffff, 0x005b, 0x000e, 0x001c, 0x0009, 0xffff, 0x001f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -    0xffff, 0x005d, 0xffff, 0xffff, 0xffff, 0xffff, 0x005c, 0xffff, 0x000b, 0xffff, 0xffff, 0xffff, 0x005e, 0xffff, 0xffff, 0x001e, -    0x007f, 0xffff, 0xffff, 0xffff, 0x007b, 0x000f, 0x001d, 0xffff, 0x0004, 0x0005, 0xffff, 0xffff, 0x0007, 0xffff, 0xffff, 0xffff, -    0xffff, 0x007d, 0x0008, 0xffff, 0xffff, 0xffff, 0x007c, 0xffff, 0x000c, 0x0006, 0xffff, 0xffff, 0x007e, 0xffff, 0xffff, 0xffff -}; - -static const uint16_t ucs2_to_gsm7_supl[UCS2_SUPL_SIZE][2] = { -    {0x0394, 0x10}, -    {0x03a6, 0x12}, -    {0x0393, 0x13}, -    {0x039b, 0x14}, -    {0x03a9, 0x15}, -    {0x03a0, 0x16}, -    {0x03a8, 0x17}, -    {0x03a3, 0x18}, -    {0x0398, 0x19}, -    {0x039e, 0x1a}, -    {0x20ac, 0x1b65} -}; - -int gsm_ucs2_to_7bit(uint16_t ucs2, char *gsm7, int gsm7_size) { -    uint16_t ch = 0xffff; -    int ret = 0; - -    if (gsm7_size < 1) return GSM_ERR; - -    if (ucs2 < 256) { -        ch = ucs2_to_gsm7[ucs2]; -    } else { -        int i; - -        for (i=0; i<UCS2_SUPL_SIZE; i++) { -            if (ucs2_to_gsm7_supl[i][0] == ucs2) { -                ch = ucs2_to_gsm7_supl[i][1]; -                break; -            } -        } -    } -    if (ch == 0xffff) return GSM_ERR; -    if (ch & 0xff00) { -        if (gsm7_size < 2) return GSM_ERR; -        *gsm7 = 0x1b; -        gsm7++; -        ret++; -    } -    *gsm7 = ch & 0x7f; -    ret++; - -    return ret; -} - -int gsm_7bit_to_ucs2(char *gsm7, int gsm7_len, uint16_t *ucs2) { -    int ret; - -    if (gsm7_len < 1) return GSM_ERR; -    if (*gsm7 != 0x1b) { -        *ucs2 = gsm7_to_ucs2[*gsm7 & 0x7f]; -        ret = 1; -    } else { -        if (gsm7_len < 2) return GSM_ERR; -        gsm7++; -        ret = 2; -        *ucs2 = gsm7e_to_ucs2[*gsm7 & 0x7f]; -    } -    if (*ucs2 == 0xffff) return GSM_ERR; - -    return ret; -} diff --git a/code/esp32/components/eos/i2c.c b/code/esp32/components/eos/i2c.c deleted file mode 100644 index 5b8fcc7..0000000 --- a/code/esp32/components/eos/i2c.c +++ /dev/null @@ -1,103 +0,0 @@ -#include <stdlib.h> - -#include <esp_log.h> -#include <driver/i2c.h> - -#include "eos.h" - -static const char *TAG = "EOS I2C"; - -#define I2C_MASTER_NUM              I2C_NUM_0 -#define I2C_MASTER_FREQ_HZ          100000 -#define I2C_MASTER_GPIO_SCL         25 -#define I2C_MASTER_GPIO_SDA         26 - -#define I2C_MASTER_TX_BUF_DISABLE   0       /*!< I2C master doesn't need buffer */ -#define I2C_MASTER_RX_BUF_DISABLE   0       /*!< I2C master doesn't need buffer */ -#define ACK_CHECK_EN                0x1     /*!< I2C master will check ack from slave*/ -#define ACK_CHECK_DIS               0x0     /*!< I2C master will not check ack from slave */ -#define ACK_VAL                     0x0     /*!< I2C ack value */ -#define NCK_VAL                     0x1     /*!< I2C nack value */ - -/** - * @brief i2c initialization - */ - -void eos_i2c_init(void) { -    i2c_config_t conf; -    conf.mode = I2C_MODE_MASTER; -    conf.sda_io_num = I2C_MASTER_GPIO_SDA; -    conf.sda_pullup_en = GPIO_PULLUP_ENABLE; -    conf.scl_io_num = I2C_MASTER_GPIO_SCL; -    conf.scl_pullup_en = GPIO_PULLUP_ENABLE; -    conf.master.clk_speed = I2C_MASTER_FREQ_HZ; -    i2c_param_config(I2C_MASTER_NUM, &conf); -    i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); -    ESP_LOGI(TAG, "INIT"); -} - -/** - * @brief i2c read - */ - -int eos_i2c_read(uint8_t addr, uint8_t reg, uint8_t *data, size_t len) { -    int i, ret; -    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); -    i2c_master_start(cmd); -    i2c_master_write_byte(cmd, addr << 1 | I2C_MASTER_WRITE, ACK_CHECK_EN); -    i2c_master_write_byte(cmd, reg, ACK_CHECK_EN); -    i2c_master_start(cmd); -    i2c_master_write_byte(cmd, addr << 1 | I2C_MASTER_READ, ACK_CHECK_EN); -    for (i=0; i < len - 1; i++) { -        i2c_master_read_byte(cmd, data+i, ACK_VAL); -    } -    i2c_master_read_byte(cmd, data+i, NCK_VAL); -    i2c_master_stop(cmd); -    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS); -    i2c_cmd_link_delete(cmd); -    if (ret != ESP_OK) { -        return EOS_ERR; -    } -    return EOS_OK; -} - -/** - * @brief i2c read8 - */ - -uint8_t eos_i2c_read8(uint8_t addr, uint8_t reg) { -    uint8_t data; -    eos_i2c_read(addr, reg, &data, 1); -    return data; -} - -/** - * @brief i2c write - */ - -int eos_i2c_write(uint8_t addr, uint8_t reg, uint8_t *data, size_t len) { -    int i, ret; -    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); -    i2c_master_start(cmd); -    i2c_master_write_byte(cmd, addr << 1 | I2C_MASTER_WRITE, ACK_CHECK_EN); -    i2c_master_write_byte(cmd, reg, ACK_CHECK_EN); -    for (i=0; i < len; i++) { -        i2c_master_write_byte(cmd, *(data+i), ACK_CHECK_EN); -    } -    i2c_master_stop(cmd); -    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS); -    i2c_cmd_link_delete(cmd); -    if (ret != ESP_OK) { -        return EOS_ERR; -    } -    return EOS_OK; -} - -/** - * @brief i2c write8 - */ - -void eos_i2c_write8(uint8_t addr, uint8_t reg, uint8_t data) { -    eos_i2c_write(addr, reg, &data, 1); -} - diff --git a/code/esp32/components/eos/include/_net.h b/code/esp32/components/eos/include/_net.h deleted file mode 100644 index 35b5308..0000000 --- a/code/esp32/components/eos/include/_net.h +++ /dev/null @@ -1 +0,0 @@ -#include "net.h"
\ No newline at end of file diff --git a/code/esp32/components/eos/include/at_cmd.h b/code/esp32/components/eos/include/at_cmd.h deleted file mode 100644 index 615a1c1..0000000 --- a/code/esp32/components/eos/include/at_cmd.h +++ /dev/null @@ -1,20 +0,0 @@ -#include <sys/types.h> -#include <stdint.h> -#include <regex.h> - -#define AT_SIZE_NMATCH      4 -#define AT_SIZE_PATTERN     64 - -#define AT_SIZE_URC_LIST    16 - -#define AT_URC_OK           0 -#define AT_URC_MORE         1 - -typedef int (*at_urc_cb_t) (char *, regmatch_t[]); - -void at_init(void); -int at_urc_process(char *urc); -int at_urc_insert(char *pattern, at_urc_cb_t cb, int flags); -int at_urc_delete(char *pattern); -void at_cmd(char *cmd); -int at_expect(char *str_ok, char *str_err, uint32_t timeout); diff --git a/code/esp32/components/eos/include/bq25895.h b/code/esp32/components/eos/include/bq25895.h deleted file mode 100644 index b5a7f92..0000000 --- a/code/esp32/components/eos/include/bq25895.h +++ /dev/null @@ -1,3 +0,0 @@ -#include <stdint.h> - -void eos_bq25895_set_ilim(void);
\ No newline at end of file diff --git a/code/esp32/components/eos/include/cell.h b/code/esp32/components/eos/include/cell.h deleted file mode 100644 index 3bf6b32..0000000 --- a/code/esp32/components/eos/include/cell.h +++ /dev/null @@ -1,68 +0,0 @@ -#include <sys/types.h> -#include <stdint.h> - -#define EOS_CELL_MTYPE_DEV          0x00 -#define EOS_CELL_MTYPE_VOICE        0x10 -#define EOS_CELL_MTYPE_SMS          0x20 -#define EOS_CELL_MTYPE_CBS          0x30 -#define EOS_CELL_MTYPE_USSD         0x40 -#define EOS_CELL_MTYPE_DATA         0x70 - -#define EOS_CELL_MTYPE_MASK         0xf0 -#define EOS_CELL_MAX_MTYPE          8 - -#define EOS_CELL_MTYPE_READY        0 -#define EOS_CELL_MTYPE_UART_DATA    1 -#define EOS_CELL_MTYPE_UART_TAKE    2 -#define EOS_CELL_MTYPE_UART_GIVE    3 -#define EOS_CELL_MTYPE_PCM_DATA     4 -#define EOS_CELL_MTYPE_PCM_START    5 -#define EOS_CELL_MTYPE_PCM_STOP     6 - -#define EOS_CELL_MTYPE_VOICE_DIAL   1 -#define EOS_CELL_MTYPE_VOICE_RING   2 -#define EOS_CELL_MTYPE_VOICE_ANSWER 3 -#define EOS_CELL_MTYPE_VOICE_HANGUP 4 -#define EOS_CELL_MTYPE_VOICE_BEGIN  5 -#define EOS_CELL_MTYPE_VOICE_END    6 - -#define EOS_CELL_MTYPE_USSD_REQUEST 1 -#define EOS_CELL_MTYPE_USSD_REPLY   2 - -#define EOS_CELL_UART_MODE_NONE     0 -#define EOS_CELL_UART_MODE_ATCMD    1 -#define EOS_CELL_UART_MODE_PPP      2 -#define EOS_CELL_UART_MODE_RELAY    3 - -#define EOS_CELL_UART_SIZE_BUF      128 - -void eos_cell_init(void); - -void eos_modem_init(void); -void eos_modem_flush(void); -size_t eos_modem_write(void *data, size_t size); -size_t eos_modem_read(void *data, size_t size, uint32_t timeout); -int eos_modem_readln(char *buf, size_t buf_size, uint32_t timeout); -int eos_modem_resp(char *ok_str, char *err_str, uint32_t timeout); -uint8_t eos_modem_get_mode(void); -int eos_modem_set_mode(uint8_t mode); -int eos_modem_take(uint32_t timeout); -void eos_modem_give(void); -void eos_modem_sleep(uint8_t mode); -void eos_modem_wake(uint8_t source, uint8_t mode); - -void eos_ppp_set_apn(char *apn); -void eos_ppp_set_auth(char *user, char *pass); -int eos_ppp_connect(void); -int eos_ppp_disconnect(void); - -void eos_cell_pcm_init(void); -ssize_t eos_cell_pcm_read(unsigned char *data, size_t size); -int eos_cell_pcm_push(unsigned char *data, size_t size); -void eos_cell_pcm_start(void); -void eos_cell_pcm_stop(void); - -void eos_cell_voice_handler(unsigned char mtype, unsigned char *buffer, uint16_t size); -void eos_cell_sms_handler(unsigned char mtype, unsigned char *buffer, uint16_t size); -void eos_cell_ussd_handler(unsigned char mtype, unsigned char *buffer, uint16_t size); -void eos_cell_data_handler(unsigned char mtype, unsigned char *buffer, uint16_t size); diff --git a/code/esp32/components/eos/include/drv2605l.h b/code/esp32/components/eos/include/drv2605l.h deleted file mode 100644 index de222e4..0000000 --- a/code/esp32/components/eos/include/drv2605l.h +++ /dev/null @@ -1,3 +0,0 @@ -#include <stdint.h> - -void eos_drv2605l_test(void);
\ No newline at end of file diff --git a/code/esp32/components/eos/include/eos.h b/code/esp32/components/eos/include/eos.h deleted file mode 100644 index 0e660fb..0000000 --- a/code/esp32/components/eos/include/eos.h +++ /dev/null @@ -1,23 +0,0 @@ -#define EOS_OK                      0 -#define EOS_ERR                     -1 -#define EOS_ERR_TIMEOUT             -2 -#define EOS_ERR_BUSY                -3 - -#define EOS_ERR_FULL                -10 -#define EOS_ERR_EMPTY               -11 -#define EOS_ERR_NOTFOUND            -12 - -#define EOS_TASK_PRIORITY_UART      1 -#define EOS_TASK_PRIORITY_MODEM     1 -#define EOS_TASK_PRIORITY_I2S       1 -#define EOS_TASK_PRIORITY_NET_XCHG  1 -#define EOS_TASK_PRIORITY_UDP_RCVR  1 -#define EOS_TASK_PRIORITY_PWR       1 - -#define EOS_TASK_SSIZE_UART         4096 -#define EOS_TASK_SSIZE_MODEM        4096 -#define EOS_TASK_SSIZE_I2S          4096 -#define EOS_TASK_SSIZE_NET_XCHG     8192 -#define EOS_TASK_SSIZE_UDP_RCVR     4096 -#define EOS_TASK_SSIZE_PWR          4096 - diff --git a/code/esp32/components/eos/include/gsm.h b/code/esp32/components/eos/include/gsm.h deleted file mode 100644 index 2c4f7b4..0000000 --- a/code/esp32/components/eos/include/gsm.h +++ /dev/null @@ -1,117 +0,0 @@ -#define GSM_OK                      0 -#define GSM_ERR                     -1 - -/* Message-Type-Indicator */ -#define GSM_MTI                     0x03 -#define GSM_MTI_DELIVER             0x00 -#define GSM_MTI_DELIVER_REPORT      0x00 -#define GSM_MTI_SUBMIT              0x01 -#define GSM_MTI_SUBMIT_REPORT       0x01 -#define GSM_MTI_COMMAND             0x02 -#define GSM_MTI_COMMAND_REPORT      0x02 - -#define GSM_MMS                     0x04    /* More-Messages-to-Send */ -#define GSM_RD                      0x04    /* Reject-Duplicates */ -#define GSM_LP                      0x08    /* Loop-Prevention */ - -/* Validity-Period-Format */ -#define GSM_VPF                     0x18 -#define GSM_VPF_NONE                0x00 -#define GSM_VPF_ENHANCED            0x08 -#define GSM_VPF_RELATIVE            0x10 -#define GSM_VPF_ABSOLUTE            0x18 - -#define GSM_SRI                     0x20    /* Status-Report-Indication */ -#define GSM_SRR                     0x20    /* Status-Report-Request */ -#define GSM_SRQ                     0x20    /* Status-Report-Qualifier */ -#define GSM_UDHI                    0x40    /* User-Data-Header-Indicator  */ -#define GSM_RP                      0x80    /* Reply-Path */ - -/* Type-of-Number */ -#define GSM_TON                     0x70 -#define GSM_TON_UNKNOWN             0x00 -#define GSM_TON_INTERNATIONAL       0x10 -#define GSM_TON_NATIONAL            0x20 -#define GSM_TON_NETWORK             0x30 -#define GSM_TON_SUBSCRIBER          0x40 -#define GSM_TON_ALPHANUMERIC        0x50 -#define GSM_TON_ABBRREVIATED        0x60 - -/* Numbering-Plan-Identification */ -#define GSM_NPI                     0x0f -#define GSM_NPI_UNKNOWN             0x00 -#define GSM_NPI_TELEPHONE           0x01 -#define GSM_NPI_DATA                0x03 -#define GSM_NPI_TELEX               0x04 -#define GSM_NPI_SCS1                0x05 -#define GSM_NPI_SCS2                0x06 -#define GSM_NPI_NATIONAL            0x08 -#define GSM_NPI_PRIVATE             0x09 -#define GSM_NPI_ERMES               0x0a - -#define GSM_EXT                     0x80 - -/* Protocol-Identifier */ -#define GSM_PID_DEFAULT             0 -#define GSM_PID_TYPE0               64 - -/* Data-Coding-Scheme */ -#define GSM_DCS_CLASS               0x03 -#define GSM_DCS_ENC                 0x0c - -#define GSM_DCS_CLASS_IND           0x10 -#define GSM_DCS_COMPRESS_IND        0x20 -#define GSM_DCS_DELETE_IND          0x40 -#define GSM_DCS_GENERAL_IND         0x80 -#define GSM_DCS_GROUP               0xf0 - -#define GSM_DCS_MWI_DISCARD         0xc0 -#define GSM_DCS_MWI_STORE_GSM7      0xd0 -#define GSM_DCS_MWI_STORE_UCS2      0xe0 -#define GSM_DCS_MWI_SENSE           0x08 -#define GSM_DCS_MWI_TYPE            0x03 - -#define GSM_DCS_ENCLASS             0xf0 -#define GSM_DCS_ENCLASS_ENC         0x04 - -/* Parameter-Indicator */ -#define GSM_PI_PID                  0x01 -#define GSM_PI_DCS                  0x02 -#define GSM_PI_UD                   0x04 -#define GSM_PI_EXT                  0x08 - -/* character set */ -#define GSM_ENC_7BIT                0x00 -#define GSM_ENC_8BIT                0x04 -#define GSM_ENC_UCS2                0x08 - -/* message waiting indication */ -#define GSM_MWI_TYPE_VOICEMAIL      0x00 -#define GSM_MWI_TYPE_FAX            0x01 -#define GSM_MWI_TYPE_EMAIL          0x02 -#define GSM_MWI_TYPE_OTHER          0x03 - -/* flags */ -#define GSM_FLAG_COMPRESS           0x0001 -#define GSM_FLAG_DELETE             0x0002 -#define GSM_FLAG_DISCARD            0x0004 - -/* message class */ -#define GSM_FLAG_CLASS              0x0400 -#define GSM_FLAG_CLASS0             0x0000  /* Flash */ -#define GSM_FLAG_CLASS1             0x0100  /* ME-specific */ -#define GSM_FLAG_CLASS2             0x0200  /* (U)SIM-specific */ -#define GSM_FLAG_CLASS4             0x0300  /* TE-specific */ -#define GSM_FLAG_CLASS_MASK         0x0f00 - -/* message waiting indication */ -#define GSM_FLAG_MWI                0x4000 -#define GSM_FLAG_MWI_SENSE          0x8000 -#define GSM_FLAG_MWI_VOICEMAIL      0x0000 -#define GSM_FLAG_MWI_FAX            0x1000 -#define GSM_FLAG_MWI_EMAIL          0x2000 -#define GSM_FLAG_MWI_OTHER          0x3000 -#define GSM_FLAG_MWI_MASK           0xf000 - -int gsm_7bit_enc(char *text, int text_len, char *pdu, int padb); -int gsm_7bit_dec(char *pdu, char *text, int text_len, int padb); diff --git a/code/esp32/components/eos/include/i2c.h b/code/esp32/components/eos/include/i2c.h deleted file mode 100644 index 144f5e1..0000000 --- a/code/esp32/components/eos/include/i2c.h +++ /dev/null @@ -1,9 +0,0 @@ -#include <sys/types.h> -#include <stdint.h> - -void eos_i2c_init(void); - -int eos_i2c_read(uint8_t addr, uint8_t reg, uint8_t *data, size_t len); -uint8_t eos_i2c_read8(uint8_t addr, uint8_t reg); -int eos_i2c_write(uint8_t addr, uint8_t reg, uint8_t *data, size_t len); -void eos_i2c_write8(uint8_t addr, uint8_t reg, uint8_t data); diff --git a/code/esp32/components/eos/include/msgq.h b/code/esp32/components/eos/include/msgq.h deleted file mode 100644 index 86bb067..0000000 --- a/code/esp32/components/eos/include/msgq.h +++ /dev/null @@ -1,32 +0,0 @@ -#include <stdint.h> - -typedef struct EOSMsgItem { -    unsigned char type; -    unsigned char *buffer; -    uint16_t len; -    uint8_t flags; -} EOSMsgItem; - -typedef struct EOSMsgQ { -    uint8_t idx_r; -    uint8_t idx_w; -    uint8_t size; -    EOSMsgItem *array; -} EOSMsgQ; - -void eos_msgq_init(EOSMsgQ *msgq, EOSMsgItem *array, uint8_t size); -int eos_msgq_push(EOSMsgQ *msgq, unsigned char type, unsigned char *buffer, uint16_t len, uint8_t flags); -void eos_msgq_pop(EOSMsgQ *msgq, unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *flags); -uint8_t eos_msgq_len(EOSMsgQ *msgq); - -typedef struct EOSBufQ { -    uint8_t idx_r; -    uint8_t idx_w; -    uint8_t size; -    unsigned char **array; -} EOSBufQ; - -void eos_bufq_init(EOSBufQ *bufq, unsigned char **array, uint8_t size); -int eos_bufq_push(EOSBufQ *bufq, unsigned char *buffer); -unsigned char *eos_bufq_pop(EOSBufQ *bufq); -uint8_t eos_bufq_len(EOSBufQ *bufq); diff --git a/code/esp32/components/eos/include/net.h b/code/esp32/components/eos/include/net.h deleted file mode 100644 index 54bad6d..0000000 --- a/code/esp32/components/eos/include/net.h +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdint.h> - -/* common */ -#define EOS_NET_SIZE_BUF            1500 - -#define EOS_NET_MTYPE_SOCK          1 -#define EOS_NET_MTYPE_POWER         4 - -#define EOS_NET_MTYPE_WIFI          5 -#define EOS_NET_MTYPE_CELL          6 -#define EOS_NET_MTYPE_SIP           7 -#define EOS_NET_MTYPE_APP           8 - -#define EOS_NET_MAX_MTYPE           8 - -#define EOS_NET_MTYPE_FLAG_ONEW     0x80 - -/* esp32 specific */ -#define EOS_NET_SIZE_BUFQ           4 -#define EOS_NET_SIZE_SNDQ           4 - -#define EOS_NET_FLAG_BFREE          0x1 -#define EOS_NET_FLAG_BCOPY          0x2 - -typedef void (*eos_net_fptr_t) (unsigned char, unsigned char *, uint16_t); - -void eos_net_init(void); - -unsigned char *eos_net_alloc(void); -void eos_net_free(unsigned char *buf); -int eos_net_send(unsigned char mtype, unsigned char *buffer, uint16_t len, uint8_t flags); -void eos_net_set_handler(unsigned char mtype, eos_net_fptr_t handler); -void eos_net_sleep_done(uint8_t mode); -void eos_net_wake(uint8_t source, uint8_t mode); diff --git a/code/esp32/components/eos/include/power.h b/code/esp32/components/eos/include/power.h deleted file mode 100644 index 0a57b19..0000000 --- a/code/esp32/components/eos/include/power.h +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdint.h> - -#define EOS_PWR_MTYPE_BUTTON    0 - -#define EOS_PWR_WAKE_RST        0 -#define EOS_PWR_WAKE_BTN        1 -#define EOS_PWR_WAKE_NET        2 -#define EOS_PWR_WAKE_MSG        3 -#define EOS_PWR_WAKE_UART       4 - -#define EOS_PWR_SMODE_LIGHT     1 -#define EOS_PWR_SMODE_DEEP      2 - -void eos_power_init(void); - -void eos_power_wait4init(void); -uint8_t eos_power_wakeup_cause(void); -void eos_power_sleep(void); -void eos_power_wake(uint8_t source); -void eos_power_net_ready(void);
\ No newline at end of file diff --git a/code/esp32/components/eos/include/sock.h b/code/esp32/components/eos/include/sock.h deleted file mode 100644 index 7e937cb..0000000 --- a/code/esp32/components/eos/include/sock.h +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdint.h> - -#define EOS_SOCK_MTYPE_PKT          0 -#define EOS_SOCK_MTYPE_OPEN_DGRAM   1 -#define EOS_SOCK_MTYPE_CLOSE        127 - -#define EOS_SOCK_MAX_SOCK           2 - -#define EOS_SOCK_SIZE_UDP_HDR       8 - -#define EOS_IPv4_ADDR_SIZE          4 - -typedef struct EOSNetAddr { -    unsigned char host[EOS_IPv4_ADDR_SIZE]; -    uint16_t port; -} EOSNetAddr; - -void eos_sock_init(void);
\ No newline at end of file diff --git a/code/esp32/components/eos/include/unicode.h b/code/esp32/components/eos/include/unicode.h deleted file mode 120000 index e859a65..0000000 --- a/code/esp32/components/eos/include/unicode.h +++ /dev/null @@ -1 +0,0 @@ -../../../../fe310/eos/unicode.h
\ No newline at end of file diff --git a/code/esp32/components/eos/include/wifi.h b/code/esp32/components/eos/include/wifi.h deleted file mode 100644 index 6009f7c..0000000 --- a/code/esp32/components/eos/include/wifi.h +++ /dev/null @@ -1,12 +0,0 @@ -#define EOS_WIFI_MTYPE_SCAN         0 -#define EOS_WIFI_MTYPE_CONNECT      1 -#define EOS_WIFI_MTYPE_DISCONNECT   2 - -#define EOS_WIFI_MAX_MTYPE          3 - -void eos_wifi_init(void); - -int eos_wifi_scan(void); -int eos_wifi_set_auth(char *ssid, char *pass); -int eos_wifi_connect(void); -int eos_wifi_disconnect(void); diff --git a/code/esp32/components/eos/msgq.c b/code/esp32/components/eos/msgq.c deleted file mode 100644 index c704399..0000000 --- a/code/esp32/components/eos/msgq.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdlib.h> - -#include "eos.h" -#include "msgq.h" - -#define IDX_MASK(IDX, SIZE)     ((IDX) & ((SIZE) - 1)) - -void eos_msgq_init(EOSMsgQ *msgq, EOSMsgItem *array, uint8_t size) { -    msgq->idx_r = 0; -    msgq->idx_w = 0; -    msgq->size = size; -    msgq->array = array; -} - -int eos_msgq_push(EOSMsgQ *msgq, unsigned char type, unsigned char *buffer, uint16_t len, uint8_t flags) { -    if ((uint8_t)(msgq->idx_w - msgq->idx_r) == msgq->size) return EOS_ERR_FULL; - -    uint8_t idx = IDX_MASK(msgq->idx_w, msgq->size); -    msgq->array[idx].type = type; -    msgq->array[idx].buffer = buffer; -    msgq->array[idx].len = len; -    msgq->array[idx].flags = flags; -    msgq->idx_w++; -    return EOS_OK; -} - -void eos_msgq_pop(EOSMsgQ *msgq, unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *flags) { -    if (msgq->idx_r == msgq->idx_w) { -        *type = 0; -        *buffer = NULL; -        *len = 0; -        if (flags) *flags = 0; -    } else { -        uint8_t idx = IDX_MASK(msgq->idx_r, msgq->size); -        *type = msgq->array[idx].type; -        *buffer = msgq->array[idx].buffer; -        *len = msgq->array[idx].len; -        if (flags) *flags = msgq->array[idx].flags; -        msgq->idx_r++; -    } -} - -uint8_t eos_msgq_len(EOSMsgQ *msgq) { -    return (uint8_t)(msgq->idx_w - msgq->idx_r); -} - -void eos_bufq_init(EOSBufQ *bufq, unsigned char **array, uint8_t size) { -    bufq->idx_r = 0; -    bufq->idx_w = 0; -    bufq->size = size; -    bufq->array = array; -} - -int eos_bufq_push(EOSBufQ *bufq, unsigned char *buffer) { -    if ((uint8_t)(bufq->idx_w - bufq->idx_r) == bufq->size) return EOS_ERR_FULL; - -    bufq->array[IDX_MASK(bufq->idx_w++, bufq->size)] = buffer; -    return EOS_OK; -} - -unsigned char *eos_bufq_pop(EOSBufQ *bufq) { -    if (bufq->idx_r == bufq->idx_w) return NULL; - -    return bufq->array[IDX_MASK(bufq->idx_r++, bufq->size)]; -} - -uint8_t eos_bufq_len(EOSBufQ *bufq) { -    return (uint8_t)(bufq->idx_w - bufq->idx_r); -} diff --git a/code/esp32/components/eos/net.c b/code/esp32/components/eos/net.c deleted file mode 100644 index 9a4a024..0000000 --- a/code/esp32/components/eos/net.c +++ /dev/null @@ -1,285 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> -#include <string.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/semphr.h> -#include <freertos/task.h> - -#include <esp_system.h> -#include <esp_log.h> -#include <esp_err.h> -#include <esp_heap_caps.h> -#include <driver/gpio.h> -#include <driver/spi_slave.h> - -#include "eos.h" -#include "msgq.h" -#include "power.h" -#include "net.h" - -#define SPI_GPIO_RTS        22 -#define SPI_GPIO_CTS        21 -#define SPI_GPIO_MOSI       23 -#define SPI_GPIO_MISO       19 -#define SPI_GPIO_SCLK       18 -#define SPI_GPIO_CS         5 - -#define SPI_SIZE_BUF        (EOS_NET_SIZE_BUF + 8) - -static volatile char net_sleep = 0; - -static EOSBufQ net_buf_q; -static unsigned char *net_bufq_array[EOS_NET_SIZE_BUFQ]; - -static EOSMsgQ net_send_q; -static EOSMsgItem net_sndq_array[EOS_NET_SIZE_SNDQ]; - -static SemaphoreHandle_t mutex; -static SemaphoreHandle_t semaph; -static TaskHandle_t net_xchg_task_handle; -static const char *TAG = "EOS NET"; - -static eos_net_fptr_t mtype_handler[EOS_NET_MAX_MTYPE]; - -static void bad_handler(unsigned char mtype, unsigned char *buffer, uint16_t len) { -    ESP_LOGE(TAG, "bad handler: %d len: %d", mtype, len); -} - -// Called after a transaction is queued and ready for pickup by master. We use this to set the handshake line high. -static void _post_setup_cb(spi_slave_transaction_t *trans) { -    gpio_set_level(SPI_GPIO_CTS, 1); -} - -// Called after transaction is sent/received. We use this to set the handshake line low. -static void _post_trans_cb(spi_slave_transaction_t *trans) { -    gpio_set_level(SPI_GPIO_CTS, 0); -} - -static void net_xchg_task(void *pvParameters) { -    int repeat = 0; -    int wake = 0; -    unsigned char mtype = 0; -    unsigned char *buffer; -    uint16_t len; -    uint8_t flags; -    unsigned char *buf_send = heap_caps_malloc(SPI_SIZE_BUF, MALLOC_CAP_DMA); -    unsigned char *buf_recv = heap_caps_malloc(SPI_SIZE_BUF, MALLOC_CAP_DMA); -    esp_err_t ret; -    spi_slave_transaction_t spi_tr; - -    //Configuration for the SPI bus -    spi_bus_config_t spi_bus_cfg = { -        .mosi_io_num = SPI_GPIO_MOSI, -        .miso_io_num = SPI_GPIO_MISO, -        .sclk_io_num = SPI_GPIO_SCLK -    }; - -    //Configuration for the SPI slave interface -    spi_slave_interface_config_t spi_slave_cfg = { -        .mode = 0, -        .spics_io_num = SPI_GPIO_CS, -        .queue_size = 2, -        .flags = 0, -        .post_setup_cb = _post_setup_cb, -        .post_trans_cb = _post_trans_cb -    }; - -    //Initialize SPI slave interface -    ret = spi_slave_initialize(VSPI_HOST, &spi_bus_cfg, &spi_slave_cfg, 1); -    assert(ret == ESP_OK); - -    memset(&spi_tr, 0, sizeof(spi_tr)); -    spi_tr.length = SPI_SIZE_BUF * 8; -    spi_tr.tx_buffer = buf_send; -    spi_tr.rx_buffer = buf_recv; - -    if (eos_power_wakeup_cause()) { -        wake = 1; -        repeat = 1; -    } - -    eos_power_wait4init(); -    while (1) { -        if (!repeat) { -            xSemaphoreTake(mutex, portMAX_DELAY); - -            eos_msgq_pop(&net_send_q, &mtype, &buffer, &len, &flags); -            if (mtype) { -                buf_send[0] = mtype; -                buf_send[1] = len >> 8; -                buf_send[2] = len & 0xFF; -                if (buffer) { -                    memcpy(buf_send + 3, buffer, len); -                    if (flags & EOS_NET_FLAG_BFREE) { -                        free(buffer); -                    } else { -                        eos_bufq_push(&net_buf_q, buffer); -                        xSemaphoreGive(semaph); -                    } -                } -            } else { -                gpio_set_level(SPI_GPIO_RTS, 0); -                buf_send[0] = 0; -                buf_send[1] = 0; -                buf_send[2] = 0; -            } - -            xSemaphoreGive(mutex); -        } -        repeat = 0; - -        buf_recv[0] = 0; -        buf_recv[1] = 0; -        buf_recv[2] = 0; -        spi_slave_transmit(VSPI_HOST, &spi_tr, portMAX_DELAY); -        ESP_LOGD(TAG, "RECV:%d", buf_recv[0]); - -        if (wake) { -            eos_power_net_ready(); -            wake = 0; -        } -        if (buf_recv[0] == 0x00) continue; -        if (buf_recv[0] == 0xFF) {  // Sleep req -            if (buf_send[0] == 0) { -                int abort = 0; - -                xSemaphoreTake(mutex, portMAX_DELAY); -                net_sleep = 1; -                if (eos_msgq_len(&net_send_q)) abort = 1; -                xSemaphoreGive(mutex); - -                spi_slave_free(VSPI_HOST); - -                eos_power_sleep(); -                if (abort) eos_power_wake(EOS_PWR_WAKE_MSG); - -                vTaskSuspend(NULL); - -                xSemaphoreTake(mutex, portMAX_DELAY); -                net_sleep = 0; -                xSemaphoreGive(mutex); - -                spi_slave_initialize(VSPI_HOST, &spi_bus_cfg, &spi_slave_cfg, 1); -                wake = 1; -                repeat = 1; -            } -            continue; -        } -        mtype = buf_recv[0]; -        len   = (uint16_t)buf_recv[1] << 8; -        len  |= (uint16_t)buf_recv[2] & 0xFF; -        buffer = buf_recv + 3; -        if (mtype & EOS_NET_MTYPE_FLAG_ONEW) { -            mtype &= ~EOS_NET_MTYPE_FLAG_ONEW; -            if (buf_send[0]) repeat = 1; -        } -        if (mtype <= EOS_NET_MAX_MTYPE) { -            mtype_handler[mtype-1](mtype, buffer, len); -        } else { -            bad_handler(mtype, buffer, len); -        } -    } -    vTaskDelete(NULL); -} - -void eos_net_init(void) { -    int i; - -    // Configuration for the handshake lines -    gpio_config_t io_conf; - -    io_conf.intr_type = GPIO_INTR_DISABLE; -    io_conf.mode = GPIO_MODE_OUTPUT; -    io_conf.pull_up_en = 0; -    io_conf.pull_down_en = 0; -    io_conf.pin_bit_mask = ((uint64_t)1 << SPI_GPIO_CTS); -    gpio_config(&io_conf); -    gpio_set_level(SPI_GPIO_CTS, 0); - -    io_conf.intr_type = GPIO_INTR_DISABLE; -    io_conf.mode = GPIO_MODE_OUTPUT; -    io_conf.pull_up_en = 0; -    io_conf.pull_down_en = 0; -    io_conf.pin_bit_mask = ((uint64_t)1 << SPI_GPIO_RTS); -    gpio_config(&io_conf); -    gpio_set_level(SPI_GPIO_RTS, 0); - -    eos_msgq_init(&net_send_q, net_sndq_array, EOS_NET_SIZE_SNDQ); -    eos_bufq_init(&net_buf_q, net_bufq_array, EOS_NET_SIZE_BUFQ); -    for (i=0; i<EOS_NET_SIZE_BUFQ; i++) { -        eos_bufq_push(&net_buf_q, malloc(EOS_NET_SIZE_BUF)); -    } - -    for (i=0; i<EOS_NET_MAX_MTYPE; i++) { -        mtype_handler[i] = bad_handler; -    } - -    semaph = xSemaphoreCreateCounting(EOS_NET_SIZE_BUFQ, EOS_NET_SIZE_BUFQ); -    mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(mutex); -    xTaskCreate(&net_xchg_task, "net_xchg", EOS_TASK_SSIZE_NET_XCHG, NULL, EOS_TASK_PRIORITY_NET_XCHG, &net_xchg_task_handle); -    ESP_LOGI(TAG, "INIT"); -} - -unsigned char *eos_net_alloc(void) { -    unsigned char *ret; - -    xSemaphoreTake(semaph, portMAX_DELAY); -    xSemaphoreTake(mutex, portMAX_DELAY); -    ret = eos_bufq_pop(&net_buf_q); -    xSemaphoreGive(mutex); - -    return ret; -} - -void eos_net_free(unsigned char *buf) { -    xSemaphoreTake(mutex, portMAX_DELAY); -    eos_bufq_push(&net_buf_q, buf); -    xSemaphoreGive(semaph); -    xSemaphoreGive(mutex); -} - -int eos_net_send(unsigned char mtype, unsigned char *buffer, uint16_t len, uint8_t flags) { -    int rv, sleep; - -    if (flags & EOS_NET_FLAG_BCOPY) xSemaphoreTake(semaph, portMAX_DELAY); -    xSemaphoreTake(mutex, portMAX_DELAY); -    sleep = net_sleep; -    gpio_set_level(SPI_GPIO_RTS, 1); -    if (flags & EOS_NET_FLAG_BCOPY) { -        unsigned char *b = eos_bufq_pop(&net_buf_q); -        memcpy(b, buffer, len); -        buffer = b; -    } -    rv = eos_msgq_push(&net_send_q, mtype, buffer, len, flags); -    xSemaphoreGive(mutex); - -    if (sleep) eos_power_wake(EOS_PWR_WAKE_MSG); - -    return rv; -} - -void eos_net_set_handler(unsigned char mtype, eos_net_fptr_t handler) { -    mtype_handler[mtype-1] = handler; -} - -void eos_net_sleep_done(uint8_t mode) { -    gpio_set_level(SPI_GPIO_CTS, 1); -    vTaskDelay(200 / portTICK_PERIOD_MS); -    gpio_set_level(SPI_GPIO_CTS, 0); -} - -void eos_net_wake(uint8_t source, uint8_t mode) { -    int sleep; - -    if (mode == EOS_PWR_SMODE_DEEP) return; -    do { -        vTaskResume(net_xchg_task_handle); -        vTaskDelay(10 / portTICK_PERIOD_MS); - -        xSemaphoreTake(mutex, portMAX_DELAY); -        sleep = net_sleep; -        xSemaphoreGive(mutex); -    } while (sleep); -} diff --git a/code/esp32/components/eos/power.c b/code/esp32/components/eos/power.c deleted file mode 100644 index f07e67b..0000000 --- a/code/esp32/components/eos/power.c +++ /dev/null @@ -1,325 +0,0 @@ -#include <stdlib.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/task.h> -#include <freertos/queue.h> -#include <driver/gpio.h> -#include <esp_sleep.h> -#include <esp_pm.h> -#include <esp_log.h> - -#include "eos.h" -#include "net.h" -#include "cell.h" -#include "power.h" - -#define POWER_GPIO_BTN      0 -#define POWER_GPIO_NET      5 -#define POWER_GPIO_UART     35 - -#define POWER_ETYPE_BTN     1 -#define POWER_ETYPE_SLEEP   2 -#define POWER_ETYPE_WAKE    3 -#define POWER_ETYPE_NETRDY  4 - -typedef struct { -    uint8_t type; -    union { -        uint8_t source; -        uint8_t level; -    }; -} power_event_t; - -static esp_pm_lock_handle_t power_lock_cpu_freq; -static esp_pm_lock_handle_t power_lock_apb_freq; -static esp_pm_lock_handle_t power_lock_no_sleep; - -static const char *TAG = "EOS POWER"; - -static QueueHandle_t power_queue; - -static volatile int init_done = 0; - -static void IRAM_ATTR btn_handler(void *arg) { -    power_event_t evt; - -    evt.type = POWER_ETYPE_BTN; -    evt.level = gpio_get_level(POWER_GPIO_BTN); -    xQueueSendFromISR(power_queue, &evt, NULL); -} - -static void IRAM_ATTR btn_wake_handler(void *arg) { -    power_event_t evt; - -    gpio_intr_disable(POWER_GPIO_BTN); - -    evt.type = POWER_ETYPE_WAKE; -    evt.source = EOS_PWR_WAKE_BTN; -    xQueueSendFromISR(power_queue, &evt, NULL); - -} - -static void IRAM_ATTR net_wake_handler(void *arg) { -    power_event_t evt; - -    gpio_intr_disable(POWER_GPIO_NET); - -    evt.type = POWER_ETYPE_WAKE; -    evt.source = EOS_PWR_WAKE_NET; -    xQueueSendFromISR(power_queue, &evt, NULL); -} - -static void IRAM_ATTR uart_wake_handler(void *arg) { -    power_event_t evt; - -    gpio_intr_disable(POWER_GPIO_UART); - -    evt.type = POWER_ETYPE_WAKE; -    evt.source = EOS_PWR_WAKE_UART; -    xQueueSendFromISR(power_queue, &evt, NULL); -} - -void power_sleep(uint8_t mode) { -    gpio_config_t io_conf; - -    eos_modem_sleep(mode); -    eos_net_sleep_done(mode); - -    switch (mode) { -        case EOS_PWR_SMODE_LIGHT: -            io_conf.intr_type = GPIO_INTR_DISABLE; -            io_conf.mode = GPIO_MODE_INPUT; -            io_conf.pin_bit_mask = ((uint64_t)1 << POWER_GPIO_NET); -            io_conf.pull_up_en = 0; -            io_conf.pull_down_en = 0; -            gpio_config(&io_conf); - -            gpio_isr_handler_add(POWER_GPIO_BTN, btn_wake_handler, NULL); -            gpio_isr_handler_add(POWER_GPIO_NET, net_wake_handler, NULL); -            gpio_isr_handler_add(POWER_GPIO_UART, uart_wake_handler, NULL); - -            esp_sleep_enable_gpio_wakeup(); -            gpio_wakeup_enable(POWER_GPIO_BTN, GPIO_INTR_LOW_LEVEL); -            gpio_wakeup_enable(POWER_GPIO_NET, GPIO_INTR_LOW_LEVEL); -            gpio_wakeup_enable(POWER_GPIO_UART, GPIO_INTR_LOW_LEVEL); - -            ESP_LOGD(TAG, "SLEEP"); - -            esp_pm_lock_release(power_lock_apb_freq); -            esp_pm_lock_release(power_lock_no_sleep); - -            break; - -        case EOS_PWR_SMODE_DEEP: -            gpio_deep_sleep_hold_en(); -            esp_sleep_enable_ext0_wakeup(POWER_GPIO_BTN, 0); -            esp_sleep_enable_ext1_wakeup((uint64_t)1 << POWER_GPIO_UART, ESP_EXT1_WAKEUP_ALL_LOW); - -            ESP_LOGD(TAG, "SLEEP"); - -            esp_deep_sleep_start(); -            break; - -        default: -            break; -    } -} - -void power_wake_stage1(uint8_t source, uint8_t mode) { -    gpio_config_t io_conf; - -    if (mode == EOS_PWR_SMODE_LIGHT) { -        esp_pm_lock_acquire(power_lock_apb_freq); -        esp_pm_lock_acquire(power_lock_no_sleep); - -        gpio_wakeup_disable(POWER_GPIO_BTN); -        gpio_wakeup_disable(POWER_GPIO_NET); -        gpio_wakeup_disable(POWER_GPIO_UART); - -        gpio_isr_handler_remove(POWER_GPIO_NET); -        io_conf.intr_type = GPIO_INTR_DISABLE; -        io_conf.mode = GPIO_MODE_DISABLE; -        io_conf.pin_bit_mask = ((uint64_t)1 << POWER_GPIO_NET); -        io_conf.pull_up_en = 0; -        io_conf.pull_down_en = 0; -        gpio_config(&io_conf); -    } - -    gpio_intr_disable(POWER_GPIO_BTN); -    if ((source != EOS_PWR_WAKE_BTN) && (source != EOS_PWR_WAKE_NET)) { -        gpio_set_direction(POWER_GPIO_BTN, GPIO_MODE_OUTPUT); -        gpio_set_level(POWER_GPIO_BTN, 0); -        vTaskDelay(200 / portTICK_PERIOD_MS); -        gpio_set_direction(POWER_GPIO_BTN, GPIO_MODE_INPUT); -    } - -    eos_net_wake(source, mode); -} - -void power_wake_stage2(uint8_t source, uint8_t mode) { -    eos_modem_wake(source, mode); - -    gpio_set_intr_type(POWER_GPIO_BTN, GPIO_INTR_ANYEDGE); -    gpio_isr_handler_add(POWER_GPIO_BTN, btn_handler, NULL); - -    ESP_LOGD(TAG, "WAKE"); -} - -static void power_event_task(void *pvParameters) { -    unsigned char *buf; -    power_event_t evt; -    uint8_t source; -    uint8_t wakeup_cause; -    uint8_t mode; -    int sleep; - -    source = 0; -    wakeup_cause = eos_power_wakeup_cause(); -    if (wakeup_cause) { -        mode = EOS_PWR_SMODE_DEEP; -        sleep = 1; -    } else { -        mode = EOS_PWR_SMODE_LIGHT; -        sleep = 0; -    } - -    while (1) { -        if (xQueueReceive(power_queue, &evt, portMAX_DELAY)) { -            switch (evt.type) { -                case POWER_ETYPE_SLEEP: -                    if (!sleep) { -                        mode = EOS_PWR_SMODE_DEEP; -                        power_sleep(mode); -                        sleep = 1; -                    } -                    break; - -                case POWER_ETYPE_WAKE: -                    if (sleep) { -                        source = evt.source; -                        power_wake_stage1(source, mode); -                    } -                    break; - -                case POWER_ETYPE_NETRDY: -                    if (sleep && source) { -                        power_wake_stage2(source, mode); -                        sleep = 0; -                        source = 0; -                    } -                    break; - -                case POWER_ETYPE_BTN: -                    buf = eos_net_alloc(); -                    buf[0] = EOS_PWR_MTYPE_BUTTON; -                    buf[1] = evt.level; -                    eos_net_send(EOS_NET_MTYPE_POWER, buf, 2, 0); -                    break; - -                default: -                    break; -            } -        } -    } -    vTaskDelete(NULL); -} - -void eos_power_init(void) { -    esp_err_t ret; -    gpio_config_t io_conf; -    esp_pm_config_esp32_t pwr_conf; -    uint8_t wakeup_cause; - -    io_conf.intr_type = GPIO_INTR_ANYEDGE; -    io_conf.mode = GPIO_MODE_INPUT; -    io_conf.pin_bit_mask = ((uint64_t)1 << POWER_GPIO_BTN); -    io_conf.pull_up_en = 1; -    io_conf.pull_down_en = 0; -    gpio_config(&io_conf); -    gpio_isr_handler_add(POWER_GPIO_BTN, btn_handler, NULL); - -    /* -    ret = esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); -    assert(ret == ESP_OK); -    ret = esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_ON); -    assert(ret == ESP_OK); -    ret = esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON); -    assert(ret == ESP_OK); -    */ - -    ret = esp_pm_lock_create(ESP_PM_CPU_FREQ_MAX, 0, NULL, &power_lock_cpu_freq); -    assert(ret == ESP_OK); -    ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, NULL, &power_lock_apb_freq); -    assert(ret == ESP_OK); -    ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, NULL, &power_lock_no_sleep); -    assert(ret == ESP_OK); - -    ret = esp_pm_lock_acquire(power_lock_cpu_freq); -    assert(ret == ESP_OK); -    ret = esp_pm_lock_acquire(power_lock_apb_freq); -    assert(ret == ESP_OK); -    ret = esp_pm_lock_acquire(power_lock_no_sleep); -    assert(ret == ESP_OK); - -    pwr_conf.max_freq_mhz = 160; -    pwr_conf.min_freq_mhz = 80; -    pwr_conf.light_sleep_enable = 1; - -    ret = esp_pm_configure(&pwr_conf); -    assert(ret == ESP_OK); - -    power_queue = xQueueCreate(4, sizeof(power_event_t)); -    xTaskCreate(power_event_task, "power_event", EOS_TASK_SSIZE_PWR, NULL, EOS_TASK_PRIORITY_PWR, NULL); - -    wakeup_cause = eos_power_wakeup_cause(); -    if (wakeup_cause) eos_power_wake(wakeup_cause); - -    init_done = 1; -    ESP_LOGI(TAG, "INIT"); -} - -void eos_power_wait4init(void) { -    while (!init_done); -} - -uint8_t eos_power_wakeup_cause(void) { -    esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); - -    switch (cause) { -        case ESP_SLEEP_WAKEUP_EXT0: -            return EOS_PWR_WAKE_BTN; - -        case ESP_SLEEP_WAKEUP_EXT1: -            return EOS_PWR_WAKE_UART; - -        default: -        case ESP_SLEEP_WAKEUP_UNDEFINED: -            return EOS_PWR_WAKE_RST; -    } -} - -void eos_power_sleep(void) { -    power_event_t evt; - -    evt.type = POWER_ETYPE_SLEEP; -    evt.source = 0; -    xQueueSend(power_queue, &evt, portMAX_DELAY); -} - -void eos_power_wake(uint8_t source) { -    power_event_t evt; - -    evt.type = POWER_ETYPE_WAKE; -    evt.source = source; - -    xQueueSend(power_queue, &evt, portMAX_DELAY); -} - -void eos_power_net_ready(void) { -    power_event_t evt; - -    evt.type = POWER_ETYPE_NETRDY; -    evt.source = 0; - -    xQueueSend(power_queue, &evt, portMAX_DELAY); -} diff --git a/code/esp32/components/eos/sock.c b/code/esp32/components/eos/sock.c deleted file mode 100644 index 17357e4..0000000 --- a/code/esp32/components/eos/sock.c +++ /dev/null @@ -1,163 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> -#include <string.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/semphr.h> -#include <freertos/task.h> - -#include <esp_system.h> -#include <esp_event.h> -#include <esp_event_loop.h> -#include <esp_log.h> -#include <esp_err.h> -#include <esp_wifi.h> -#include <nvs_flash.h> - -#include <lwip/sockets.h> -#include <lwip/err.h> -#include <lwip/sockets.h> -#include <lwip/sys.h> -#include <lwip/netdb.h> -#include <lwip/dns.h> - -#include "eos.h" -#include "net.h" -#include "sock.h" - -static const char *TAG = "EOS SOCK"; -static SemaphoreHandle_t mutex; -static int _socks[EOS_SOCK_MAX_SOCK]; - -static int t_open_dgram(void) { -    struct sockaddr_in _myaddr; -    int sock; - -    sock = socket(PF_INET, SOCK_DGRAM, 0); -    if (sock < 0) return sock; - -    memset((char *)&_myaddr, 0, sizeof(_myaddr)); -    _myaddr.sin_family = AF_INET; -    _myaddr.sin_addr.s_addr = htonl(INADDR_ANY); -    _myaddr.sin_port = htons(3000); - -    int rv = bind(sock, (struct sockaddr *)&_myaddr, sizeof(_myaddr)); -    if (rv < 0) { -        close(sock); -        return rv; -    } -    return sock; -} - -static void t_close(int sock) { -    close(sock); -} - -static ssize_t t_sendto(int sock, void *msg, size_t msg_size, EOSNetAddr *addr) { -    struct sockaddr_in servaddr; - -    memset((void *)&servaddr, 0, sizeof(servaddr)); -    servaddr.sin_family = AF_INET; -    servaddr.sin_port = addr->port; -    memcpy((void *)&servaddr.sin_addr, addr->host, sizeof(addr->host)); -    return sendto(sock, msg, msg_size, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); -} - -static ssize_t t_recvfrom(int sock, void *msg, size_t msg_size, EOSNetAddr *addr) { -    struct sockaddr_in servaddr; -    socklen_t addrlen = sizeof(servaddr); -    memset((void *)&servaddr, 0, sizeof(servaddr)); - -    ssize_t recvlen = recvfrom(sock, msg, msg_size, 0, (struct sockaddr *)&servaddr, &addrlen); -    if (recvlen < 0) return recvlen; - -    if (addr) { -        addr->port = servaddr.sin_port; -        memcpy(addr->host, (void *)&servaddr.sin_addr, sizeof(addr->host)); -    } -    return recvlen; -} - -static void udp_rcvr_task(void *pvParameters) { -    EOSNetAddr addr; -    uint8_t esock = (uint8_t)pvParameters; -    int sock = _socks[esock-1]; -    unsigned char *buf; - -    do { -        ssize_t rv; - -        buf = eos_net_alloc(); -        rv = t_recvfrom(sock, buf+EOS_SOCK_SIZE_UDP_HDR, EOS_NET_SIZE_BUF-EOS_SOCK_SIZE_UDP_HDR, &addr); -        if (rv < 0) { -            sock = 0; -            ESP_LOGE(TAG, "UDP RECV ERR:%d", rv); -            continue; -        } -        buf[0] = EOS_SOCK_MTYPE_PKT; -        buf[1] = esock; -        memcpy(buf+2, addr.host, sizeof(addr.host)); -        memcpy(buf+2+sizeof(addr.host), &addr.port, sizeof(addr.port)); -        eos_net_send(EOS_NET_MTYPE_SOCK, buf, rv+EOS_SOCK_SIZE_UDP_HDR, 0); -    } while(sock); -    xSemaphoreTake(mutex, portMAX_DELAY); -    _socks[esock-1] = 0; -    xSemaphoreGive(mutex); -    vTaskDelete(NULL); -} - -static void sock_handler(unsigned char type, unsigned char *buffer, uint16_t size) { -    EOSNetAddr addr; -    uint8_t esock; -    int sock, i; -    unsigned char *rbuf; - -    if (size < 1) return; - -    switch(buffer[0]) { -        case EOS_SOCK_MTYPE_PKT: -            if (size < EOS_SOCK_SIZE_UDP_HDR) return; -            sock = _socks[buffer[1]-1]; -            memcpy(addr.host, buffer+2, sizeof(addr.host)); -            memcpy(&addr.port, buffer+2+sizeof(addr.host), sizeof(addr.port)); -            t_sendto(sock, buffer+EOS_SOCK_SIZE_UDP_HDR, size-EOS_SOCK_SIZE_UDP_HDR, &addr); -            break; - -        case EOS_SOCK_MTYPE_OPEN_DGRAM: -            sock = t_open_dgram(); -            esock = 0; -            if (sock > 0) { -                xSemaphoreTake(mutex, portMAX_DELAY); -                for (i=0; i<EOS_SOCK_MAX_SOCK; i++) { -                    if (_socks[i] == 0) { -                        esock = i+1; -                        _socks[i] = sock; -                    } -                } -                xSemaphoreGive(mutex); -            } -            // xTaskCreatePinnedToCore(&sock_receiver, "sock_receiver", EOS_TASK_SSIZE_UDP_RCVR, (void *)esock, EOS_TASK_PRIORITY_UDP_RCVR, NULL, 1); -            xTaskCreate(&udp_rcvr_task, "udp_rcvr", EOS_TASK_SSIZE_UDP_RCVR, (void *)esock, EOS_TASK_PRIORITY_UDP_RCVR, NULL); -            rbuf = eos_net_alloc(); -            rbuf[0] = EOS_SOCK_MTYPE_OPEN_DGRAM; -            rbuf[1] = esock; -            eos_net_send(EOS_NET_MTYPE_SOCK, rbuf, 2, 0); -            break; - -        case EOS_SOCK_MTYPE_CLOSE: -            if (size < 2) return; -            sock = _socks[buffer[1]-1]; -            t_close(sock); -            break; - -        default: -            break; -    } -} - -void eos_sock_init(void) { -    mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(mutex); -    eos_net_set_handler(EOS_NET_MTYPE_SOCK, sock_handler); -    ESP_LOGI(TAG, "INIT"); -}
\ No newline at end of file diff --git a/code/esp32/components/eos/unicode.c b/code/esp32/components/eos/unicode.c deleted file mode 120000 index 4cdffa7..0000000 --- a/code/esp32/components/eos/unicode.c +++ /dev/null @@ -1 +0,0 @@ -../../../fe310/eos/unicode.c
\ No newline at end of file diff --git a/code/esp32/components/eos/wifi.c b/code/esp32/components/eos/wifi.c deleted file mode 100755 index 3dd90ba..0000000 --- a/code/esp32/components/eos/wifi.c +++ /dev/null @@ -1,302 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> -#include <string.h> - -#include <freertos/FreeRTOS.h> -#include <freertos/task.h> - -#include <esp_system.h> -#include <esp_event.h> -#include <esp_event_loop.h> -#include <esp_log.h> -#include <esp_err.h> -#include <esp_wifi.h> - -#include "eos.h" -#include "net.h" -#include "wifi.h" - -// XXX: WiFi fail due to no DHCP server - -#define WIFI_MAX_SCAN_RECORDS       20 -#define WIFI_MAX_CONNECT_ATTEMPTS   3 - -#define WIFI_STATE_STOPPED          0 -#define WIFI_STATE_SCANNING         1 -#define WIFI_STATE_CONNECTING       2 -#define WIFI_STATE_CONNECTED        3 -#define WIFI_STATE_DISCONNECTING    4 -#define WIFI_STATE_DISCONNECTED     5 - -#define WIFI_ACTION_NONE            0 -#define WIFI_ACTION_SCAN            1 -#define WIFI_ACTION_CONNECT         2 -#define WIFI_ACTION_DISCONNECT      3 - -static const char *TAG = "EOS WIFI"; - -static SemaphoreHandle_t mutex; - -static wifi_config_t wifi_sta_config; -static wifi_scan_config_t wifi_scan_config; - -static int wifi_connect_cnt = 0; -static uint8_t wifi_action; -static uint8_t wifi_state; - -static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) { -    esp_err_t ret = ESP_OK; -    char _disconnect; -    uint8_t _action, _state; -    unsigned char *rbuf; -    wifi_ap_record_t scan_r[WIFI_MAX_SCAN_RECORDS]; -    uint16_t scan_n = WIFI_MAX_SCAN_RECORDS; - -    switch(event->event_id) { -        case WIFI_EVENT_SCAN_DONE: -            memset(scan_r, 0, sizeof(scan_r)); -            esp_wifi_scan_get_ap_records(&scan_n, scan_r); - -            xSemaphoreTake(mutex, portMAX_DELAY); -            _state = wifi_state; -            if (wifi_state == WIFI_STATE_CONNECTED) wifi_action = WIFI_ACTION_NONE; -            xSemaphoreGive(mutex); - -            if (_state != WIFI_STATE_CONNECTED) ret = esp_wifi_stop(); -            break; - -        case WIFI_EVENT_STA_START: -            xSemaphoreTake(mutex, portMAX_DELAY); -            _action = wifi_action; -            xSemaphoreGive(mutex); - -            switch (_action) { -                case WIFI_ACTION_SCAN: -                    ret = esp_wifi_scan_start(&wifi_scan_config, 0); -                    break; - -                case WIFI_ACTION_CONNECT: -                    ret = esp_wifi_connect(); -                    break; - -                default: -                    break; -            } -            break; - -        case WIFI_EVENT_STA_STOP: -            xSemaphoreTake(mutex, portMAX_DELAY); -            wifi_state = WIFI_STATE_STOPPED; -            wifi_action = WIFI_ACTION_NONE; -            xSemaphoreGive(mutex); -            break; - -        case WIFI_EVENT_STA_CONNECTED: -            xSemaphoreTake(mutex, portMAX_DELAY); -            wifi_state = WIFI_STATE_CONNECTED; -            wifi_action = WIFI_ACTION_NONE; -            wifi_connect_cnt = WIFI_MAX_CONNECT_ATTEMPTS; -            xSemaphoreGive(mutex); -            break; - -        case WIFI_EVENT_STA_DISCONNECTED: -            xSemaphoreTake(mutex, portMAX_DELAY); -            if (wifi_connect_cnt) wifi_connect_cnt--; -            _action = wifi_action; -            _disconnect = (wifi_connect_cnt == 0); -            if (_disconnect) wifi_state = WIFI_STATE_DISCONNECTED; -            xSemaphoreGive(mutex); - -            if (_disconnect) { -                rbuf = eos_net_alloc(); -                if (_action == WIFI_ACTION_CONNECT) { -                    rbuf[0] = EOS_WIFI_MTYPE_CONNECT; -                    rbuf[1] = EOS_ERR; -                    eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, 2, 0); -                } else { -                    rbuf[0] = EOS_WIFI_MTYPE_DISCONNECT; -                    eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, 1, 0); -                } -                if (!_action) ret = esp_wifi_stop(); -            } else { -                ret = esp_wifi_connect(); -            } -            break; - -        case IP_EVENT_STA_GOT_IP: -            ESP_LOGD(TAG, "IP address: " IPSTR, IP2STR(&event->event_info.got_ip.ip_info.ip)); -            if (event->event_info.got_ip.ip_changed) { -                // send wifi reconnect -            } else { -                rbuf = eos_net_alloc(); -                rbuf[0] = EOS_WIFI_MTYPE_CONNECT; -                rbuf[1] = EOS_OK; -                eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, 2, 0); -            } -            break; - -        default: // Ignore the other event types -            break; -    } -    if (ret != ESP_OK) ESP_LOGD(TAG, "ESP WIFI ERR: %d", ret); - -    return ESP_OK; -} - -static void wifi_handler(unsigned char _mtype, unsigned char *buffer, uint16_t size) { -    int rv = EOS_OK; -    uint8_t mtype = buffer[0]; -    char *ssid, *pass; - -    switch (mtype) { -        case EOS_WIFI_MTYPE_SCAN: -            rv = eos_wifi_scan(); -            break; - -        case EOS_WIFI_MTYPE_CONNECT: -            ssid = (char *)buffer+1; -            pass = ssid+strlen(ssid)+1; -            rv = eos_wifi_set_auth(ssid, pass); -            if (!rv) rv = eos_wifi_connect(); -            break; - -        case EOS_WIFI_MTYPE_DISCONNECT: -            rv = eos_wifi_disconnect(); -            break; -    } -    if (rv) ESP_LOGD(TAG, "WIFI HANDLER ERR: %d", rv); -} - -void eos_wifi_init(void) { -    esp_err_t ret; -    wifi_init_config_t wifi_config = WIFI_INIT_CONFIG_DEFAULT(); - -    memset(&wifi_sta_config, 0, sizeof(wifi_sta_config)); - -    ret = esp_event_loop_init(wifi_event_handler, NULL); -    assert(ret == ESP_OK); - -    ret = esp_wifi_init(&wifi_config); -    assert(ret == ESP_OK); - -    ret = esp_wifi_set_storage(WIFI_STORAGE_RAM); -    assert(ret == ESP_OK); - -    ret = esp_wifi_set_mode(WIFI_MODE_STA); -    assert(ret == ESP_OK); - -    ret = esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config); -    assert(ret == ESP_OK); - -    ret = esp_wifi_stop(); -    assert(ret == ESP_OK); - -    mutex = xSemaphoreCreateBinary(); -    xSemaphoreGive(mutex); - -    eos_net_set_handler(EOS_NET_MTYPE_WIFI, wifi_handler); -    ESP_LOGI(TAG, "INIT"); -} - -int eos_wifi_scan(void) { -    int rv = EOS_OK; -    esp_err_t ret = ESP_OK; -    uint8_t _wifi_state = 0; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (!wifi_action) { -        _wifi_state = wifi_state; - -        wifi_action = WIFI_ACTION_SCAN; -        if (wifi_state == WIFI_STATE_STOPPED) wifi_state = WIFI_STATE_SCANNING; - -        memset(&wifi_scan_config, 0, sizeof(wifi_scan_config)); -    } else { -        rv = EOS_ERR_BUSY; -    } -    xSemaphoreGive(mutex); - -    if (rv) return rv; - -    if (_wifi_state == WIFI_STATE_STOPPED) { -        ret = esp_wifi_start(); -    } else { -        ret = esp_wifi_scan_start(&wifi_scan_config, 0); -    } -    if (ret != ESP_OK) rv = EOS_ERR; - -    return rv; -} - -int eos_wifi_set_auth(char *ssid, char *pass) { -    int rv = EOS_OK; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (!wifi_action) { -        if (ssid) strncpy((char *)wifi_sta_config.sta.ssid, ssid, sizeof(wifi_sta_config.sta.ssid) - 1); -        if (pass) strncpy((char *)wifi_sta_config.sta.password, pass, sizeof(wifi_sta_config.sta.password) - 1); -    } else { -        rv = EOS_ERR_BUSY; - -    } -    xSemaphoreGive(mutex); - -    return rv; -} - -int eos_wifi_connect(void) { -    int rv = EOS_OK; -    esp_err_t ret = ESP_OK; -    uint8_t _wifi_state = 0; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (!wifi_action) { -        _wifi_state = wifi_state; - -        wifi_action = WIFI_ACTION_CONNECT; -        wifi_state = WIFI_STATE_CONNECTING; -        wifi_connect_cnt = WIFI_MAX_CONNECT_ATTEMPTS; -    } else { -        rv = EOS_ERR_BUSY; -    } -    xSemaphoreGive(mutex); - -    if (rv) return rv; - -    esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config); - -    if (_wifi_state == WIFI_STATE_STOPPED) { -        ret = esp_wifi_start(); -    } else { -        ret = esp_wifi_connect(); -    } -    if (ret != ESP_OK) rv = EOS_ERR; - -    return rv; -} - -int eos_wifi_disconnect(void) { -    int rv = EOS_OK; -    esp_err_t ret = ESP_OK; - -    xSemaphoreTake(mutex, portMAX_DELAY); -    if (!wifi_action) { -        wifi_action = WIFI_ACTION_DISCONNECT; -        wifi_state = WIFI_STATE_DISCONNECTING; -        wifi_connect_cnt = 0; - -        memset(wifi_sta_config.sta.ssid, 0, sizeof(wifi_sta_config.sta.ssid)); -        memset(wifi_sta_config.sta.password, 0, sizeof(wifi_sta_config.sta.password)); -    } else { -        rv = EOS_ERR_BUSY; -    } -    xSemaphoreGive(mutex); - -    if (rv) return rv; - -    ret = esp_wifi_stop(); -    if (ret != ESP_OK) rv = EOS_ERR; - -    return rv; -} - diff --git a/code/esp32/main/app_main.c b/code/esp32/main/app_main.c deleted file mode 100644 index 4babcdc..0000000 --- a/code/esp32/main/app_main.c +++ /dev/null @@ -1,38 +0,0 @@ -#include <freertos/FreeRTOS.h> -#include <freertos/task.h> - -#include <tcpip_adapter.h> -#include <driver/gpio.h> -#include <esp_sleep.h> - -#include "i2c.h" -#include "cell.h" -#include "_net.h" -#include "wifi.h" -#include "sock.h" -#include "power.h" -#include "bq25895.h" - -#define ESP_INTR_FLAG_DEFAULT   0 - -// Main application -void app_main() { -    tcpip_adapter_init(); - -    eos_net_init(); - -    eos_cell_pcm_init(); -    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); -    eos_modem_init(); - -    eos_cell_init(); -    eos_wifi_init(); -    eos_sock_init(); - -    eos_power_init(); - -    eos_i2c_init(); -    eos_bq25895_set_ilim(); -} - - diff --git a/code/esp32/main/component.mk b/code/esp32/main/component.mk deleted file mode 100644 index 61f8990..0000000 --- a/code/esp32/main/component.mk +++ /dev/null @@ -1,8 +0,0 @@ -# -# Main component makefile. -# -# This Makefile can be left empty. By default, it will take the sources in the  -# src/ directory, compile them and link them into lib(subdirectory_name).a  -# in the build directory. This behaviour is entirely configurable, -# please read the ESP-IDF documents if you need to do this. -#  | 
