2 Commits

Author SHA1 Message Date
e15e78cc26 rename deepsleep to deep_sleep_ms for clarity on expected duration
in main deep sleep was larger than required by a factor of 1000, fixed
this an renamed function to make expected duration count size obvious
from the name
2026-05-05 22:02:46 +02:00
d9aa96a3cb add containerized dev tools legacy branch 2026-05-05 21:47:41 +02:00
11 changed files with 124 additions and 11 deletions

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -euo pipefail
CONTAINER_NAME="localhost/esp-plant-dev-tools:latest"
CONTAINER_TOOLS_BASEDIR="$(dirname "$(readlink -f "$0")")"
pushd "$CONTAINER_TOOLS_BASEDIR"
podman build -t "$CONTAINER_NAME" -f "esp-plant-dev-tools.Containerfile" .
popd

View File

@@ -0,0 +1,16 @@
FROM debian:latest
RUN apt update -y && apt upgrade -y && apt install unzip curl xz-utils nodejs -y
RUN cd /root && \
curl -L -o xpack-riscv-toolchain.tar.gz "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-3/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gz" && \
mkdir xpack-toolchain && \
tar -xvf xpack-riscv-toolchain.tar.gz -C xpack-toolchain --strip-components=1 && \
mv xpack-toolchain/bin/* /usr/local/bin && \
mv xpack-toolchain/lib/ /usr/local && \
mv xpack-toolchain/lib64/ /usr/local && \
mv xpack-toolchain/libexec /usr/local && \
mv xpack-toolchain/riscv-none-elf /usr/local && \
rm -rf xpack-toolchain xpack-riscv-toolchain.tar.gz
RUN apt install npm -y

29
bin/npm Executable file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
CONTAINER_IMAGE="localhost/esp-plant-dev-tools:latest"
CONTAINER_TOOLS_BASEDIR="$(dirname "$(readlink -f "$0")")"
PLANTCTL_PROJECT_DIR="$(readlink -f "$CONTAINER_TOOLS_BASEDIR/..")"
function _fatal {
echo -e "\e[31mERROR\e[0m $(</dev/stdin)$*" 1>&2
exit 1
}
declare -a PODMAN_ARGS=(
"--rm" "-i" "--log-driver=none"
"-v" "$PLANTCTL_PROJECT_DIR:$PLANTCTL_PROJECT_DIR:rw"
"-v" "$PWD:$PWD:rw"
"-w" "$PWD"
)
[[ -t 1 ]] && PODMAN_ARGS+=("-t")
if ! podman image exists "$CONTAINER_IMAGE"; then
#attempt to build container
"$CONTAINER_TOOLS_BASEDIR/build-esp-plant-dev-tools.sh" 1>&2 ||
_fatal "faild to build local image, cannot continue! … please ensure you have an internet connection"
fi
podman run "${PODMAN_ARGS[@]}" --entrypoint npm "$CONTAINER_IMAGE" "$@"

29
bin/npx Executable file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
CONTAINER_IMAGE="localhost/esp-plant-dev-tools:latest"
CONTAINER_TOOLS_BASEDIR="$(dirname "$(readlink -f "$0")")"
PLANTCTL_PROJECT_DIR="$(readlink -f "$CONTAINER_TOOLS_BASEDIR/..")"
function _fatal {
echo -e "\e[31mERROR\e[0m $(</dev/stdin)$*" 1>&2
exit 1
}
declare -a PODMAN_ARGS=(
"--rm" "-i" "--log-driver=none"
"-v" "$PLANTCTL_PROJECT_DIR:$PLANTCTL_PROJECT_DIR:rw"
"-v" "$PWD:$PWD:rw"
"-w" "$PWD"
)
[[ -t 1 ]] && PODMAN_ARGS+=("-t")
if ! podman image exists "$CONTAINER_IMAGE"; then
#attempt to build container
"$CONTAINER_TOOLS_BASEDIR/build-esp-plant-dev-tools.sh" 1>&2 ||
_fatal "faild to build local image, cannot continue! … please ensure you have an internet connection"
fi
podman run "${PODMAN_ARGS[@]}" --entrypoint npx "$CONTAINER_IMAGE" "$@"

29
bin/riscv32-unknown-elf-gcc Executable file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
CONTAINER_IMAGE="localhost/esp-plant-dev-tools:latest"
CONTAINER_TOOLS_BASEDIR="$(dirname "$(readlink -f "$0")")"
PLANTCTL_PROJECT_DIR="$(readlink -f "$CONTAINER_TOOLS_BASEDIR/..")"
function _fatal {
echo -e "\e[31mERROR\e[0m $(</dev/stdin)$*" 1>&2
exit 1
}
declare -a PODMAN_ARGS=(
"--rm" "-i" "--log-driver=none"
"-v" "$PLANTCTL_PROJECT_DIR:$PLANTCTL_PROJECT_DIR:rw"
"-v" "$PWD:$PWD:rw"
"-w" "$PWD"
)
[[ -t 1 ]] && PODMAN_ARGS+=("-t")
if ! podman image exists "$CONTAINER_IMAGE"; then
#attempt to build container
"$CONTAINER_TOOLS_BASEDIR/build-esp-plant-dev-tools.sh" 1>&2 ||
_fatal "faild to build local image, cannot continue! … please ensure you have an internet connection"
fi
podman run "${PODMAN_ARGS[@]}" --entrypoint riscv-none-elf-gcc "$CONTAINER_IMAGE" "$@"

View File

@@ -626,7 +626,7 @@ impl Esp<'_> {
Ok(*stack) Ok(*stack)
} }
pub fn deep_sleep(&mut self, duration_in_ms: u64) -> ! { pub fn deep_sleep_ms(&mut self, duration_in_ms: u64) -> ! {
// Mark the current OTA image as valid if we reached here while in pending verify. // Mark the current OTA image as valid if we reached here while in pending verify.
if let Ok(cur) = self.ota.current_ota_state() { if let Ok(cur) = self.ota.current_ota_state() {
if cur == OtaImageState::PendingVerify { if cur == OtaImageState::PendingVerify {

View File

@@ -104,8 +104,8 @@ impl<'a> BoardInteraction<'a> for Initial<'a> {
bail!("Please configure board revision") bail!("Please configure board revision")
} }
async fn deep_sleep(&mut self, duration_in_ms: u64) -> ! { async fn deep_sleep_ms(&mut self, duration_in_ms: u64) -> ! {
self.esp.deep_sleep(duration_in_ms); self.esp.deep_sleep_ms(duration_in_ms);
} }
fn is_day(&self) -> bool { fn is_day(&self) -> bool {
false false

View File

@@ -215,7 +215,7 @@ pub trait BoardInteraction<'a> {
async fn get_time(&mut self) -> DateTime<Utc>; async fn get_time(&mut self) -> DateTime<Utc>;
async fn set_time(&mut self, time: &DateTime<FixedOffset>) -> FatResult<()>; async fn set_time(&mut self, time: &DateTime<FixedOffset>) -> FatResult<()>;
async fn set_charge_indicator(&mut self, charging: bool) -> Result<(), FatError>; async fn set_charge_indicator(&mut self, charging: bool) -> Result<(), FatError>;
async fn deep_sleep(&mut self, duration_in_ms: u64) -> !; async fn deep_sleep_ms(&mut self, duration_in_ms: u64) -> !;
fn is_day(&self) -> bool; fn is_day(&self) -> bool;
//should be multsampled //should be multsampled

View File

@@ -217,9 +217,9 @@ impl<'a> BoardInteraction<'a> for V3<'a> {
Ok(()) Ok(())
} }
async fn deep_sleep(&mut self, duration_in_ms: u64) -> ! { async fn deep_sleep_ms(&mut self, duration_in_ms: u64) -> ! {
let _ = self.shift_register.lock().await.decompose()[AWAKE].set_low(); let _ = self.shift_register.lock().await.decompose()[AWAKE].set_low();
self.esp.deep_sleep(duration_in_ms) self.esp.deep_sleep_ms(duration_in_ms)
} }
fn is_day(&self) -> bool { fn is_day(&self) -> bool {

View File

@@ -341,10 +341,10 @@ impl<'a> BoardInteraction<'a> for V4<'a> {
self.charger.set_charge_indicator(charging) self.charger.set_charge_indicator(charging)
} }
async fn deep_sleep(&mut self, duration_in_ms: u64) -> ! { async fn deep_sleep_ms(&mut self, duration_in_ms: u64) -> ! {
self.awake.set_low(); self.awake.set_low();
self.charger.power_save(); self.charger.power_save();
self.esp.deep_sleep(duration_in_ms); self.esp.deep_sleep_ms(duration_in_ms);
} }
fn is_day(&self) -> bool { fn is_day(&self) -> bool {

View File

@@ -596,7 +596,7 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
board.board_hal.get_esp().set_restart_to_conf(false); board.board_hal.get_esp().set_restart_to_conf(false);
board board
.board_hal .board_hal
.deep_sleep(1000 * 1000 * 60 * deep_sleep_duration_minutes as u64) .deep_sleep_ms(1000 * 60 * deep_sleep_duration_minutes as u64)
.await; .await;
} }
} }
@@ -991,7 +991,7 @@ async fn wait_infinity(
board.board_hal.get_esp().set_restart_to_conf(false); board.board_hal.get_esp().set_restart_to_conf(false);
// ensure clean http answer / visible confirmation // ensure clean http answer / visible confirmation
Timer::after_millis(500).await; Timer::after_millis(500).await;
board.board_hal.deep_sleep(0).await; board.board_hal.deep_sleep_ms(0).await; // not sleeping smells like a hidden reset, we should call it that!
} }
// Short tick while holding so the pattern updates smoothly. // Short tick while holding so the pattern updates smoothly.
@@ -1100,7 +1100,7 @@ async fn wait_infinity(
.lock() .lock()
.await .await
.board_hal .board_hal
.deep_sleep(0) .deep_sleep_ms(0) // not sleeping smells like a hidden reset, we should call it that!
.await; .await;
} }
} }