mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-27 01:48:38 +03:00
Compare commits
11 Commits
I2S-4MFlas
...
SqueezeAmp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
60b163676a | ||
|
|
f49c3f7206 | ||
|
|
3fade26793 | ||
|
|
856303d8f1 | ||
|
|
b20c8306fa | ||
|
|
877f16181b | ||
|
|
2cba6972ff | ||
|
|
fbd9516667 | ||
|
|
646a220fd0 | ||
|
|
962dbf89c8 | ||
|
|
3a658f3ba2 |
@@ -1,5 +1,8 @@
|
||||
name: Manually executable test for ESP-IDF v4.3.1
|
||||
name: Platform Build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**4.3'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ui_build:
|
||||
@@ -10,9 +13,6 @@ on:
|
||||
description: 'Force a Release build. When not forced, the system will check for release word in the last commit message to trigger a release'
|
||||
required: true
|
||||
type: boolean
|
||||
# push:
|
||||
# branches:
|
||||
# - '**4.3'
|
||||
|
||||
jobs:
|
||||
bootstrap:
|
||||
@@ -15,7 +15,7 @@ ENV GCC_TOOLS_BASE=/opt/esp/tools/xtensa-esp32-elf/esp-2021r2-8.4.0/xtensa-esp32
|
||||
# To run the image interactive (windows):
|
||||
# docker run --rm -v %cd%:/project -w /project -it sle118/squeezelite-esp32-idfv43
|
||||
# To run the image interactive (linux):
|
||||
# docker run --rm -v `pwd`:/project -w /project -it sle118/squeezelite-esp32-idfv4-master
|
||||
# docker run --rm -v `pwd`:/project -w /project -it sle118/squeezelite-esp32-idfv43
|
||||
# to build the web app inside of the interactive session
|
||||
# pushd components/wifi-manager/webapp/ && npm install && npm run-script build && popd
|
||||
#
|
||||
@@ -90,7 +90,7 @@ RUN : \
|
||||
&& pip show pygit2 \
|
||||
&& python --version \
|
||||
&& pip --version \
|
||||
&& pip3 install protobuf grpcio-tools \
|
||||
&& pip install protobuf grpcio-tools \
|
||||
&& rm -rf $IDF_TOOLS_PATH/dist \
|
||||
&& :
|
||||
|
||||
|
||||
@@ -259,7 +259,7 @@ CONFIG_CSPOT_SINK=y
|
||||
# Various I/O
|
||||
#
|
||||
CONFIG_I2C_CONFIG=""
|
||||
CONFIG_SET_GPIO=""
|
||||
CONFIG_SET_GPIO="0=ir"
|
||||
CONFIG_ROTARY_ENCODER=""
|
||||
# end of Various I/O
|
||||
|
||||
|
||||
@@ -83,15 +83,13 @@ static void bt_app_task_handler(void *arg)
|
||||
|
||||
esp_bt_controller_mem_release(ESP_BT_MODE_BLE);
|
||||
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
|
||||
if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE ){
|
||||
|
||||
|
||||
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE ) {
|
||||
if ((err = esp_bt_controller_init(&bt_cfg)) != ESP_OK) {
|
||||
ESP_LOGE(TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(err));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if ((err = esp_bt_controller_enable(ESP_BT_MODE_BTDM)) != ESP_OK) {
|
||||
if ((err = esp_bt_controller_enable(ESP_BT_MODE_CLASSIC_BT)) != ESP_OK) {
|
||||
ESP_LOGE(TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(err));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ bool create_rotary(void *id, int A, int B, int SW, int long_press, rotary_handle
|
||||
// create companion button if rotary has a switch
|
||||
if (SW != -1) button_create(id, SW, BUTTON_LOW, true, 0, rotary_button_handler, long_press, -1);
|
||||
|
||||
ESP_LOGI(TAG, "Creating rotary encoder A:%d B:%d, SW:%d", A, B, SW);
|
||||
ESP_LOGI(TAG, "Created rotary encoder A:%d B:%d, SW:%d", A, B, SW);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -432,5 +432,7 @@ bool create_infrared(int gpio, infrared_handler handler) {
|
||||
common_task_init();
|
||||
xRingbufferAddToQueueSetRead(infrared.rb, common_queue_set);
|
||||
|
||||
ESP_LOGI(TAG, "Created infrared receiver using GPIO %u", gpio);
|
||||
|
||||
return (infrared.rb != NULL);
|
||||
}
|
||||
|
||||
@@ -162,6 +162,8 @@ ESP_LOGI(TAG, "Getting Spotify event %d ", (int) event.eventType);
|
||||
}
|
||||
});
|
||||
|
||||
// need to make sure mercuryManager is running otherwise we'll loop and destroy instances
|
||||
while (!mercuryManager->isRunning) vTaskDelay(pdMS_TO_TICKS(25));
|
||||
mercuryManager->reconnectedCallback = []() {
|
||||
return spircController->subscribe();
|
||||
};
|
||||
|
||||
@@ -36,7 +36,7 @@ if(UNIX AND NOT APPLE)
|
||||
endif()
|
||||
|
||||
# Build protobuf code
|
||||
if(0)
|
||||
if(1)
|
||||
set(NANOPB_OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
file(GLOB PROTOS protobuf/*.proto)
|
||||
nanopb_generate_cpp(PROTO_SRCS PROTO_HDRS RELPATH ${CMAKE_CURRENT_SOURCE_DIR} ${PROTOS})
|
||||
|
||||
1
components/spotify/cspot/bell/nanopb/generator/protoc-gen-nanopb
Normal file → Executable file
1
components/spotify/cspot/bell/nanopb/generator/protoc-gen-nanopb
Normal file → Executable file
@@ -10,5 +10,4 @@
|
||||
# --plugin= on the command line.
|
||||
|
||||
MYPATH=$(dirname "$0")
|
||||
echo "Executing $MYPATH/nanopb_generator.py "
|
||||
exec "$MYPATH/nanopb_generator.py" --protoc-plugin
|
||||
|
||||
@@ -179,6 +179,7 @@ size_t PlainConnection::writeBlock(const std::vector<uint8_t> &data)
|
||||
break;
|
||||
default:
|
||||
if (retries++ > 4) throw std::runtime_error("Error in write");
|
||||
goto WRITE;
|
||||
}
|
||||
}
|
||||
idx += n;
|
||||
|
||||
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/index.html.gz
vendored
BIN
components/wifi-manager/webapp/dist/index.html.gz
vendored
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/js/index.6ae91e.bundle.js.gz
vendored
Normal file
BIN
components/wifi-manager/webapp/dist/js/index.6ae91e.bundle.js.gz
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -19,6 +19,8 @@ declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
@@ -40,6 +42,10 @@ declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.7964a13ec910c36040b8.css.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/favicon-32x32.png BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/index.html.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.3b7a54.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.3b7a54.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.6ae91e.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.6ae91e.bundle.js.gz BINARY)
|
||||
|
||||
@@ -6,29 +6,29 @@ extern const uint8_t _favicon_32x32_png_start[] asm("_binary_favicon_32x32_png_s
|
||||
extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
|
||||
extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
|
||||
extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
|
||||
extern const uint8_t _index_3b7a54_bundle_js_gz_start[] asm("_binary_index_3b7a54_bundle_js_gz_start");
|
||||
extern const uint8_t _index_3b7a54_bundle_js_gz_end[] asm("_binary_index_3b7a54_bundle_js_gz_end");
|
||||
extern const uint8_t _node_vendors_3b7a54_bundle_js_gz_start[] asm("_binary_node_vendors_3b7a54_bundle_js_gz_start");
|
||||
extern const uint8_t _node_vendors_3b7a54_bundle_js_gz_end[] asm("_binary_node_vendors_3b7a54_bundle_js_gz_end");
|
||||
extern const uint8_t _index_6ae91e_bundle_js_gz_start[] asm("_binary_index_6ae91e_bundle_js_gz_start");
|
||||
extern const uint8_t _index_6ae91e_bundle_js_gz_end[] asm("_binary_index_6ae91e_bundle_js_gz_end");
|
||||
extern const uint8_t _node_vendors_6ae91e_bundle_js_gz_start[] asm("_binary_node_vendors_6ae91e_bundle_js_gz_start");
|
||||
extern const uint8_t _node_vendors_6ae91e_bundle_js_gz_end[] asm("_binary_node_vendors_6ae91e_bundle_js_gz_end");
|
||||
const char * resource_lookups[] = {
|
||||
"/css/index.7964a13ec910c36040b8.css.gz",
|
||||
"/favicon-32x32.png",
|
||||
"/index.html.gz",
|
||||
"/js/index.3b7a54.bundle.js.gz",
|
||||
"/js/node_vendors.3b7a54.bundle.js.gz",
|
||||
"/js/index.6ae91e.bundle.js.gz",
|
||||
"/js/node_vendors.6ae91e.bundle.js.gz",
|
||||
""
|
||||
};
|
||||
const uint8_t * resource_map_start[] = {
|
||||
_index_7964a13ec910c36040b8_css_gz_start,
|
||||
_favicon_32x32_png_start,
|
||||
_index_html_gz_start,
|
||||
_index_3b7a54_bundle_js_gz_start,
|
||||
_node_vendors_3b7a54_bundle_js_gz_start
|
||||
_index_6ae91e_bundle_js_gz_start,
|
||||
_node_vendors_6ae91e_bundle_js_gz_start
|
||||
};
|
||||
const uint8_t * resource_map_end[] = {
|
||||
_index_7964a13ec910c36040b8_css_gz_end,
|
||||
_favicon_32x32_png_end,
|
||||
_index_html_gz_end,
|
||||
_index_3b7a54_bundle_js_gz_end,
|
||||
_node_vendors_3b7a54_bundle_js_gz_end
|
||||
_index_6ae91e_bundle_js_gz_end,
|
||||
_node_vendors_6ae91e_bundle_js_gz_end
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/***********************************
|
||||
webpack_headers
|
||||
dist/css/index.7964a13ec910c36040b8.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.3b7a54.bundle.js.gz,dist/js/node_vendors.3b7a54.bundle.js.gz
|
||||
dist/css/index.7964a13ec910c36040b8.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.6ae91e.bundle.js.gz,dist/js/node_vendors.6ae91e.bundle.js.gz
|
||||
***********************************/
|
||||
#pragma once
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -15,9 +15,11 @@ from requests import Response
|
||||
|
||||
class Logger:
|
||||
NEWLINE_CHAR = '\n'
|
||||
with_crlf = False
|
||||
@classmethod
|
||||
def print_message(cls,message,prefix=''):
|
||||
trimmed=re.sub(r'\n', r'%0A', message,flags=re.MULTILINE)
|
||||
if not Logger.with_crlf:
|
||||
trimmed=re.sub(r'\n', r'%0A', message,flags=re.MULTILINE)
|
||||
print(f'{prefix}{trimmed}')
|
||||
@classmethod
|
||||
def debug(cls,message):
|
||||
@@ -131,10 +133,16 @@ parser = argparse.ArgumentParser(
|
||||
description='Handles some parts of the squeezelite-esp32 build process')
|
||||
parser.add_argument('--cwd', type=str,
|
||||
help='Working directory', default=os.getcwd())
|
||||
parser.add_argument('--with_crlf', action='store_true',help='To prevent replacing cr/lf with hex representation')
|
||||
parser.add_argument('--loglevel', type=str, choices={
|
||||
'CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'NOTSET'}, help='Logging level', default='INFO')
|
||||
subparsers = parser.add_subparsers(dest='command', required=True)
|
||||
|
||||
parser_commits = subparsers.add_parser("list_commits",add_help=False,
|
||||
description="Commits list",
|
||||
help="Lists the last commits"
|
||||
)
|
||||
|
||||
parser_dir = subparsers.add_parser("list_files",
|
||||
add_help=False,
|
||||
description="List Files parser",
|
||||
@@ -208,14 +216,13 @@ parser_build_flags.add_argument(
|
||||
parser_build_flags.add_argument(
|
||||
'--ui_build', action='store_true', help='Include building the web UI')
|
||||
|
||||
|
||||
def format_commit(commit):
|
||||
# 463a9d8b7 Merge branch 'bugfix/ci_deploy_tags_v4.0' into 'release/v4.0' (2020-01-11T14:08:55+08:00)
|
||||
dt = datetime.fromtimestamp(float(commit.author.time), timezone(
|
||||
timedelta(minutes=commit.author.offset)))
|
||||
timestr = dt.strftime('%c%z')
|
||||
cmesg:str = commit.message.replace('\n', ' ')
|
||||
cmesg = cmesg.replace('*','-')
|
||||
#timestr = dt.strftime('%c%z')
|
||||
timestr = dt.strftime('%F %R %Z')
|
||||
cmesg:str = commit.message.replace('\n', ' ').replace('\r','').replace('*','-')
|
||||
return f'{commit.short_id} {cmesg} ({timestr}) <{commit.author.name}>'.replace(' ', ' ', )
|
||||
|
||||
|
||||
@@ -886,10 +893,10 @@ def push_if_change(repo: Repository, token: str, source_path: str, manif_json):
|
||||
remote: Remote = repo.remotes['origin']
|
||||
auth_methods = ['x-access-token','x-oauth-basic']
|
||||
for method in auth_methods:
|
||||
if push_with_method('x-access-token', token, remote, [reference]):
|
||||
if push_with_method(method, token, remote, [reference]):
|
||||
print(f'::notice Web installer updated for {format_artifact_from_manifest(manif_json)}')
|
||||
return
|
||||
|
||||
raise Exception('Unable to push web installer.')
|
||||
|
||||
else:
|
||||
print(f'WARNING: No change found. Skipping update')
|
||||
@@ -946,6 +953,10 @@ def handle_list_files(args):
|
||||
print(f'Content of {args.cwd}:')
|
||||
print(Logger.NEWLINE_CHAR.join(get_file_list(args.cwd)))
|
||||
|
||||
def handle_commits(args):
|
||||
set_workdir(args)
|
||||
print(Releases.get_commit_list_descriptions())
|
||||
|
||||
|
||||
parser_environment.set_defaults(func=handle_environment, cmd='environment')
|
||||
parser_manifest.set_defaults(func=handle_manifest, cmd='manifest')
|
||||
@@ -953,11 +964,13 @@ parser_pushinstaller.set_defaults(func=handle_pushinstaller, cmd='installer')
|
||||
parser_show.set_defaults(func=handle_show, cmd='show')
|
||||
parser_build_flags.set_defaults(func=handle_build_flags, cmd='build_flags')
|
||||
parser_dir.set_defaults(func=handle_list_files, cmd='list_files')
|
||||
parser_commits.set_defaults(func=handle_commits,cmd='list_commits')
|
||||
|
||||
|
||||
def main():
|
||||
exit_result_code = 0
|
||||
args = parser.parse_args()
|
||||
Logger.with_crlf = args.with_crlf
|
||||
print(f'::group::{args.command}')
|
||||
print(f'build_tools version : {tool_version}')
|
||||
print(f'Processing command {args.command}')
|
||||
|
||||
@@ -117,7 +117,7 @@ menu "Squeezelite-ESP32"
|
||||
string
|
||||
default "dc=27,data=19,clk=18" if TWATCH2020
|
||||
default "mosi=15,miso=2,clk=14" if MUSE
|
||||
default ""
|
||||
default ""
|
||||
config DISPLAY_CONFIG
|
||||
string
|
||||
default "SPI,driver=ST7789,width=240,height=240,cs=5,back=12,speed=16000000,HFlip,VFlip" if TWATCH2020
|
||||
@@ -125,7 +125,7 @@ menu "Squeezelite-ESP32"
|
||||
config ETH_CONFIG
|
||||
string
|
||||
default ""
|
||||
# AGGREGATES - end
|
||||
# AGGREGATES - end
|
||||
config DAC_CONTROLSET
|
||||
string
|
||||
default "{ \"init\": [ {\"reg\":41, \"val\":128}, {\"reg\":18, \"val\":255} ], \"poweron\": [ {\"reg\":18, \"val\":64, \"mode\":\"or\"} ], \"poweroff\": [ {\"reg\":18, \"val\":191, \"mode\":\"and\"} ] }" if TWATCH2020
|
||||
@@ -168,6 +168,9 @@ menu "Squeezelite-ESP32"
|
||||
int
|
||||
default 13 if SQUEEZEAMP
|
||||
default -1
|
||||
config SET_GPIO
|
||||
string
|
||||
default "0=ir" if SQUEEZEAMP
|
||||
endmenu
|
||||
|
||||
menu "Audio settings"
|
||||
@@ -342,14 +345,15 @@ menu "Squeezelite-ESP32"
|
||||
data=<gpio>,clk=<gpio>[,d/c=<num>][,host=<0|1|2>]
|
||||
config SET_GPIO
|
||||
string "Special GPIO configuration"
|
||||
default ""
|
||||
help
|
||||
Set parameters of shared GPIO with special values.
|
||||
<gpio_1>=Vcc|GND|amp[:0|1]|jack[:0|1][,<gpio_n>=Vcc|GND|amp[:0|1]|jack[:0|1]]
|
||||
<gpio_1>=Vcc|GND|amp[:0|1]|jack[:0|1][ir][spkfault[:0|1][,<gpio_n>=Vcc|GND|amp[:0|1]|jack[:0|1]]
|
||||
'amp' => GPIO that is set when playback starts
|
||||
'jack' => GPIO used for audio jack detection
|
||||
'green', 'red' => GPIO for status LED
|
||||
'[:0|1] means set the active value for that GPIO can be low or high
|
||||
'spkfault' => GPIO used for speaker fault detection
|
||||
'ir' => GPIO used for Infrared Receiver
|
||||
[:0|1] means set the active value for that GPIO can be low or high
|
||||
config ROTARY_ENCODER
|
||||
string "Rotary Encoder configuration"
|
||||
default ""
|
||||
|
||||
@@ -262,7 +262,7 @@ CONFIG_AIRPLAY_PORT="5000"
|
||||
# Various I/O
|
||||
#
|
||||
CONFIG_I2C_CONFIG=""
|
||||
CONFIG_SET_GPIO=""
|
||||
# CONFIG_SET_GPIO= is not set
|
||||
CONFIG_ROTARY_ENCODER=""
|
||||
# end of Various I/O
|
||||
|
||||
|
||||
BIN
server_certs/DigiCertGlobalRootCA.crt.23
Normal file
BIN
server_certs/DigiCertGlobalRootCA.crt.23
Normal file
Binary file not shown.
BIN
server_certs/DigiCertGlobalRootCA.crt.24
Normal file
BIN
server_certs/DigiCertGlobalRootCA.crt.24
Normal file
Binary file not shown.
BIN
server_certs/rootca1.cer.22
Normal file
BIN
server_certs/rootca1.cer.22
Normal file
Binary file not shown.
BIN
server_certs/rootca1.cer.23
Normal file
BIN
server_certs/rootca1.cer.23
Normal file
Binary file not shown.
Reference in New Issue
Block a user