From b8624141f28591b9ccc91e3849e5c651a6f34ead Mon Sep 17 00:00:00 2001 From: James Harton Date: Wed, 14 Feb 2024 16:15:59 +1300 Subject: [PATCH] chore: migrate to local (#26) * Add Drone CI configuration * Change URLs * Remove Gitlab CI configuration Reviewed-on: https://harton.dev/james/pca9641/pulls/26 Co-authored-by: James Harton Co-committed-by: James Harton --- .drone.yml | 383 ++++++++++++++++++++++++++++++++++++++++++ .gitlab-ci.yml | 139 --------------- .tool-versions | 2 + CHANGELOG.md | 12 +- README.md | 12 +- config/config.exs | 2 +- lib/pca9641.ex | 94 ++++++++--- mix.exs | 8 +- mix.lock | 4 + renovate.json | 3 - test/pca9641_test.exs | 7 +- 11 files changed, 484 insertions(+), 182 deletions(-) create mode 100644 .drone.yml delete mode 100644 .gitlab-ci.yml create mode 100644 .tool-versions delete mode 100644 renovate.json diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..238b987 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,383 @@ +kind: pipeline +type: docker +name: build + +steps: +- name: restore ASDF cache + image: meltwater/drone-cache + pull: "always" + environment: + AWS_ACCESS_KEY_ID: + from_secret: ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY: + from_secret: SECRET_ACCESS_KEY + AWS_PLUGIN_PATH_STYLE: true + settings: + restore: true + endpoint: + from_secret: S3_ENDPOINT + bucket: + from_secret: CACHE_BUCKET + region: us-east-1 + path-style: true + cache_key: 'asdf-{{ os }}-{{ arch }}-{{ checksum ".tool-versions" }}' + mount: + - .asdf + +- name: restore build cache + image: meltwater/drone-cache + environment: + AWS_ACCESS_KEY_ID: + from_secret: ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY: + from_secret: SECRET_ACCESS_KEY + AWS_PLUGIN_PATH_STYLE: true + settings: + restore: true + endpoint: + from_secret: S3_ENDPOINT + bucket: + from_secret: CACHE_BUCKET + region: us-east-1 + path-style: true + cache_key: 'elixir-{{ checksum "mix.lock" }}-{{ checksum ".tool-versions" }}' + mount: + - deps + - _build + - .hex + - .mix + - .rebar3 + +- name: install dependencies + image: harton.dev/james/asdf_container:latest + pull: "always" + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + ASDF_DIR: /root/.asdf + depends_on: + - restore ASDF cache + - restore build cache + commands: + - asdf_install + - rm -rf .asdf/downloads + - . $ASDF_DIR/asdf.sh + - mix local.hex --if-missing --force + - mix local.rebar --if-missing --force + - mix deps.get + - mix deps.compile + - mix dialyzer --plt + +- name: store ASDF cache + image: meltwater/drone-cache + environment: + AWS_ACCESS_KEY_ID: + from_secret: ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY: + from_secret: SECRET_ACCESS_KEY + AWS_PLUGIN_PATH_STYLE: true + depends_on: + - install dependencies + settings: + rebuild: true + override: false + endpoint: + from_secret: S3_ENDPOINT + bucket: + from_secret: CACHE_BUCKET + region: us-east-1 + path-style: true + cache_key: 'asdf-{{ os }}-{{ arch }}-{{ checksum ".tool-versions" }}' + mount: + - .asdf + +- name: store build cache + image: meltwater/drone-cache + environment: + AWS_ACCESS_KEY_ID: + from_secret: ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY: + from_secret: SECRET_ACCESS_KEY + AWS_PLUGIN_PATH_STYLE: true + depends_on: + - install dependencies + settings: + rebuild: true + override: false + endpoint: + from_secret: S3_ENDPOINT + bucket: + from_secret: CACHE_BUCKET + region: us-east-1 + path-style: true + cache_key: 'elixir-{{ checksum "mix.lock" }}-{{ checksum ".tool-versions" }}' + mount: + - deps + - _build + - .hex + - .mix + - .rebar3 + +- name: mix compile + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - install dependencies + commands: + - asdf mix compile --warnings-as-errors + +- name: mix test + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix test + +- name: mix credo + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix credo --strict + +- name: mix dialyzer + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix dialyzer + +- name: mix hex.audit + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix hex.audit + +- name: mix format + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix format --check-formatted + +- name: mix deps.unlock + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix deps.unlock --check-unused + +- name: mix doctor + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - asdf mix doctor --full + +- name: mix git_ops.check_message + image: harton.dev/james/asdf_container:latest + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + depends_on: + - mix compile + commands: + - git log -1 --format=%s > .last_commit_message + - asdf mix git_ops.check_message .last_commit_message + +- name: mix git_ops.release + image: harton.dev/james/asdf_container:latest + when: + branch: + - main + event: + exclude: + - pull_request + depends_on: + - mix test + - mix credo + - mix dialyzer + - mix hex.audit + - mix format + - mix deps.unlock + - mix doctor + - mix git_ops.check_message + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + ASDF_DIR: /root/.asdf + DRONE_TOKEN: + from_secret: DRONE_TOKEN + commands: + - git fetch --tags + - . $ASDF_DIR/asdf.sh + - mix git_ops.project_info --format=shell > before.env + - mix git_ops.release --yes --no-major || true + - mix git_ops.project_info --format=shell > after.env + - . ./before.env + - export OLD_APP_VERSION=$${APP_VERSION} + - . ./after.env + - export NEW_APP_VERSION=$${APP_VERSION} + - if [ "v$${OLD_APP_VERSION}" != "v$${NEW_APP_VERSION}" ]; then + - export GIT_URL=$(echo $DRONE_GIT_HTTP_URL | sed -e "s/:\\/\\//:\\/\\/$DRONE_REPO_OWNER:$DRONE_TOKEN@/") + - git push $${GIT_URL} "HEAD:${DRONE_COMMIT_REF}" "refs/tags/v$${NEW_APP_VERSION}" + - fi + +- name: build artifacts + image: harton.dev/james/asdf_container:latest + when: + event: + - tag + refs: + include: + - refs/tags/v* + depends_on: + - mix test + - mix credo + - mix dialyzer + - mix hex.audit + - mix format + - mix deps.unlock + - mix doctor + - mix git_ops.check_message + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + ASDF_DIR: /root/.asdf + commands: + - . $ASDF_DIR/asdf.sh + - mix git_ops.project_info --format=shell > app.env + - . ./app.env + - mkdir artifacts + - mix hex.build -o "artifacts/$${APP_NAME}-$${APP_VERSION}-pkg.tar" + - gzip "artifacts/$${APP_NAME}-$${APP_VERSION}-pkg.tar" + - mix docs + - tar zcvf "artifacts/$${APP_NAME}-$${APP_VERSION}-docs.tar.gz" doc/ + - git tag -l --format='%(contents:subject)' v$${APP_VERSION} > tag_subject + - git tag -l --format='%(contents:body)' v$${APP_VERSION} > tag_body + +- name: gitea release + image: plugins/gitea-release + when: + event: + - tag + refs: + include: + - refs/tags/v* + depends_on: + - build artifacts + settings: + api_key: + from_secret: DRONE_TOKEN + base_url: https://harton.dev + files: artifacts/*.tar.gz + checksum: sha256 + title: tag_subject + note: tag_body + +- name: docs release + when: + event: + - tag + refs: + include: + - refs/tags/v* + image: minio/mc + environment: + S3_ENDPOINT: + from_secret: S3_ENDPOINT + ACCESS_KEY: + from_secret: ACCESS_KEY_ID + SECRET_KEY: + from_secret: SECRET_ACCESS_KEY + depends_on: + - build artifacts + commands: + - mc alias set store $${S3_ENDPOINT} $${ACCESS_KEY} $${SECRET_KEY} + - mc mb -p store/docs.harton.nz + - mc anonymous set download store/docs.harton.nz + - mc mirror --overwrite doc/ store/docs.harton.nz/$${DRONE_REPO}/$${DRONE_TAG} + - mc mirror --overwrite doc/ store/docs.harton.nz/$${DRONE_REPO} + +- name: hex release + image: harton.dev/james/asdf_container:latest + when: + event: + - tag + refs: + include: + - refs/tags/v* + depends_on: + - build artifacts + environment: + MIX_ENV: test + HEX_HOME: /drone/src/.hex + MIX_HOME: /drone/src/.mix + REBAR_BASE_DIR: /drone/src/.rebar3 + ASDF_DATA_DIR: /drone/src/.asdf + ASDF_DIR: /root/.asdf + HEX_API_KEY: + from_secret: HEX_API_KEY + commands: + - . $ASDF_DIR/asdf.sh + - mix hex.publish --yes diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 5bfcdd4..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,139 +0,0 @@ -stages: - - build - - test - - release - -variables: - MIX_ENV: "test" - PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/" - HEX_HOME: "$CI_PROJECT_DIR/.hex" - MIX_HOME: "$CI_PROJECT_DIR/.mix" - -build: - image: elixir:latest - stage: build - cache: - key: "$CI_JOB_NAME" - paths: - - deps - - _build - - .hex - - .mix - script: - - mix local.hex --force - - mix local.rebar --force - - mix deps.get - - mix deps.compile - - mix git_ops.project_info -f dotenv > project_info.env - artifacts: - paths: - - _build/ - - deps/ - - .hex - - .mix - reports: - dotenv: project_info.env - -test: - image: elixir:latest - dependencies: - - build - stage: test - script: - - mix test - -credo: - image: elixir:latest - dependencies: - - build - stage: test - script: - - mix credo - -audit: - image: elixir:latest - dependencies: - - build - stage: test - script: - - mix hex.audit - -format: - image: elixir:latest - dependencies: - - build - stage: test - script: - - mix format --check-formatted - -pages: - image: elixir:latest - dependencies: - - build - stage: release - script: - - mix docs -o public - artifacts: - paths: - - public - only: - - main - -git_ops: - image: elixir:latest - dependencies: - - build - stage: release - only: - refs: - - main - except: - variables: - - $CI_COMMIT_MESSAGE =~ /chore\:\ release version/ - script: - - | - export OLD_APP_VERSION=$APP_VERSION - mkdir -p artifacts - git config --global user.name "Gitlab Runner for ${GITLAB_USER_NAME}" - git config --global user.email "${GITLAB_USER_EMAIL}" - mix git_ops.release --yes || true - mix git_ops.project_info -f shell > artifacts/env - source artifacts/env - if [ "v${OLD_APP_VERSION}" != "v${APP_VERSION}" ]; then - mix hex.build -o "artifacts/${APP_NAME}-${APP_VERSION}.tar" - gzip "artifacts/${APP_NAME}-${APP_VERSION}.tar" - mix docs && tar zcvf "artifacts/${APP_NAME}-${APP_VERSION}-docs.tar.gz" doc/ - curl --header "JOB_TOKEN: ${CI_JOB_TOKEN}" --upload-file "artifacts/${APP_NAME}-${APP_VERSION}.tar.gz" "${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}.tar.gz" - curl --header "JOB_TOKEN: ${CI_JOB_TOKEN}" --upload-file "artifacts/${APP_NAME}-${APP_VERSION}-docs.tar.gz" "${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}-docs.tar.gz" - git push "https://project_${CI_PROJECT_ID}_bot:${RELEASE_TOKEN}@gitlab.com/${CI_PROJECT_PATH}.git" "HEAD:${CI_COMMIT_REF_NAME}" "refs/tags/v${APP_VERSION}" - fi - artifacts: - paths: - - artifacts/* - -release-gitlab: - image: registry.gitlab.com/gitlab-org/release-cli:latest - dependencies: - - build - stage: release - only: - - tags - - /^v\d+\.\d+\.\d+(-\w+)?$/ - script: - - release-cli create \ - --name "Release ${APP_NAME} ${APP_VERSION}" \ - --description "./CHANGELOG.md" \ - --tag-name "v${APP_VERSION}" \ - --assets-link "{\"name\":\"${APP_NAME}-${APP_VERSION}.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}.tar.gz\"}" \ - --assets-link "{\"name\":\"${APP_NAME}-${APP_VERSION}-docs.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}-docs.tar.gz\"}" - -release-hex: - image: elixir:latest - dependencies: - - build - stage: release - only: - - tags - - /^v\d+\.\d+\.\d+(-\w+)?$/ - script: - - mix hex.publish --yes diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..b80e361 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +erlang 26.2.2 +elixir 1.16.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b5abdf..f6e3999 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,14 +5,10 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline -## [v2.0.0](https://gitlab.com/jimsy/pca9641/compare/v1.0.0...v2.0.0) (2023-01-16) +## [v2.0.0](https://harton.dev/james/pca9641/compare/v1.0.0...v2.0.0) (2023-01-16) + ### Breaking Changes: -* Relicence to HL3-FULL. - - - -## [v1.0.0](https://gitlab.com/jimsy/pca9641/compare/v1.0.0...v1.0.0) (2020-12-28) - - +- Relicence to HL3-FULL. +## [v1.0.0](https://harton.dev/james/pca9641/compare/v1.0.0...v1.0.0) (2020-12-28) diff --git a/README.md b/README.md index 8425f04..e903790 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # PCA9641 -[![pipeline status](https://gitlab.com/jimsy/pca9641/badges/main/pipeline.svg)](https://gitlab.com/jimsy/pca9641/commits/main) +[![Build Status](https://drone.harton.dev/api/badges/james/pca9641/status.svg)](https://drone.harton.dev/james/pca9641) [![Hex.pm](https://img.shields.io/hexpm/v/pca9641.svg)](https://hex.pm/packages/pca9641) [![Hippocratic License HL3-FULL](https://img.shields.io/static/v1?label=Hippocratic%20License&message=HL3-FULL&labelColor=5e2751&color=bc8c3d)](https://firstdonoharm.dev/version/3/0/full.html) @@ -8,7 +8,7 @@ Driver for the PCA9641 2-channel I2C bus master arbiter chip. It's a pretty sweet little chip that lets you connect two i2c mastering devices to a shared downstream bus and makes sure that only one master can address the -downstream devices at a time. It can also relay downstream interrupts to the +downstream devices at a time. It can also relay downstream interrupts to the mastering devices. ## Installation @@ -28,6 +28,12 @@ Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_do and published on [HexDocs](https://hexdocs.pm). Once published, the docs can be found at [https://hexdocs.pm/pca9641](https://hexdocs.pm/pca9641). +## Github Mirror + +This repository is mirrored [on Github](https://github.com/jimsynz/pca9641) +from it's primary location [on my Forejo instance](https://harton.dev/james/pca9641). +Feel free to raise issues and open PRs on Github. + ## License This software is licensed under the terms of the @@ -35,7 +41,7 @@ This software is licensed under the terms of the this package for the terms. This license actively proscribes this software being used by and for some -industries, countries and activities. If your usage of this software doesn't +industries, countries and activities. If your usage of this software doesn't comply with the terms of this license, then [contact me](mailto:james@harton.nz) with the details of your use-case to organise the purchase of a license - the cost of which may include a donation to a suitable charity or NGO. diff --git a/config/config.exs b/config/config.exs index cbfbf1f..1ebcb99 100644 --- a/config/config.exs +++ b/config/config.exs @@ -3,7 +3,7 @@ import Config config :git_ops, mix_project: Mix.Project.get!(), changelog_file: "CHANGELOG.md", - repository_url: "https://gitlab.com/jimsy/pca9641", + repository_url: "https://harton.dev/james/pca9641", manage_mix_version?: true, manage_readme_version: "README.md", version_tag_prefix: "v" diff --git a/lib/pca9641.ex b/lib/pca9641.ex index 9bec6cc..fda7baf 100644 --- a/lib/pca9641.ex +++ b/lib/pca9641.ex @@ -163,8 +163,13 @@ defmodule PCA9641 do masters request the downstream bus at the same time. """ @spec priority(t, boolean) :: {:ok, t} | {:error, reason :: any} - def priority(%PCA9641{conn: conn} = dev, value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 7, value)), + def priority(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 7)), + do: {:ok, %{dev | conn: conn}} + end + + def priority(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 7)), do: {:ok, %{dev | conn: conn}} end @@ -197,8 +202,13 @@ defmodule PCA9641 do disconnected upon detecting an SMBus time-out condition. """ @spec downstream_disconnect_on_timeout(t, boolean) :: {:ok, t} | {:error, term} - def downstream_disconnect_on_timeout(%PCA9641{conn: conn} = dev, value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 6, value)), + def downstream_disconnect_on_timeout(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 6)), + do: {:ok, %{dev | conn: conn}} + end + + def downstream_disconnect_on_timeout(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 6)), do: {:ok, %{dev | conn: conn}} end @@ -237,8 +247,13 @@ defmodule PCA9641 do ms, the connection between master and downstream bus will be disconnected. """ @spec idle_timer_disconnect(t, boolean) :: {:ok, t} | {:error, term} - def idle_timer_disconnect(%{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 5, value)), + def idle_timer_disconnect(%{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 5)), + do: {:ok, %{dev | conn: conn}} + end + + def idle_timer_disconnect(%{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 5)), do: {:ok, %{dev | conn: conn}} end @@ -271,8 +286,13 @@ defmodule PCA9641 do general call soft reset from master. """ @spec smbus_software_reset(t, boolean) :: {:ok, t} | {:error, term} - def smbus_software_reset(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 4, value)), + def smbus_software_reset(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 4)), + do: {:ok, %{dev | conn: conn}} + end + + def smbus_software_reset(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 4)), do: {:ok, %{dev | conn: conn}} end @@ -311,8 +331,13 @@ defmodule PCA9641 do bus. """ @spec bus_init(t, boolean) :: {:ok, t} | {:error, term} - def bus_init(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 3, value)), + def bus_init(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 3)), + do: {:ok, %{dev | conn: conn}} + end + + def bus_init(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 3)), do: {:ok, %{dev | conn: conn}} end @@ -343,8 +368,13 @@ defmodule PCA9641 do - `true` -> Connect downstream bus; the internal switch is closed only if LOCK_GRANT = 1. """ @spec bus_connect(t, boolean) :: {:ok, t} | {:error, term} - def bus_connect(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 2, value)), + def bus_connect(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 2)), + do: {:ok, %{dev | conn: conn}} + end + + def bus_connect(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 2)), do: {:ok, %{dev | conn: conn}} end @@ -402,8 +432,13 @@ defmodule PCA9641 do - `true` -> Master is requesting a lock on the downstream bus. """ @spec lock_request(t, boolean) :: {:ok, t} | {:error, term} - def lock_request(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 0, value)), + def lock_request(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_control(conn, &set_bit(&1, 0)), + do: {:ok, %{dev | conn: conn}} + end + + def lock_request(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_control(conn, &clear_bit(&1, 0)), do: {:ok, %{dev | conn: conn}} end @@ -446,8 +481,13 @@ defmodule PCA9641 do When written, PCA9641 drives SDA pin of the downstream bus HIGH. """ @spec sda_becomes_io(t, boolean) :: {:ok, t} | {:error, term} - def sda_becomes_io(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_status(conn, &set_bit(&1, 7, value)), + def sda_becomes_io(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_status(conn, &set_bit(&1, 7)), + do: {:ok, %{dev | conn: conn}} + end + + def sda_becomes_io(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_status(conn, &clear_bit(&1, 7)), do: {:ok, %{dev | conn: conn}} end @@ -490,8 +530,13 @@ defmodule PCA9641 do written, PCA9641 drives SCL pin of the downstream bus HIGH. """ @spec scl_becomes_io(t, boolean) :: {:ok, t} | {:error, term} - def scl_becomes_io(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_status(conn, &set_bit(&1, 6, value)), + def scl_becomes_io(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_status(conn, &set_bit(&1, 6)), + do: {:ok, %{dev | conn: conn}} + end + + def scl_becomes_io(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_status(conn, &clear_bit(&1, 6)), do: {:ok, %{dev | conn: conn}} end @@ -530,8 +575,13 @@ defmodule PCA9641 do Routine to handle housekeeping tasks. """ @spec test_interrupt_pin(t, boolean) :: {:ok, t} | {:error, term} - def test_interrupt_pin(%PCA9641{conn: conn} = dev, value) when is_boolean(value) do - with {:ok, conn} <- Registers.update_status(conn, &set_bit(&1, 5, value)), + def test_interrupt_pin(%PCA9641{conn: conn} = dev, true) do + with {:ok, conn} <- Registers.update_status(conn, &set_bit(&1, 5)), + do: {:ok, %{dev | conn: conn}} + end + + def test_interrupt_pin(%PCA9641{conn: conn} = dev, false) do + with {:ok, conn} <- Registers.update_status(conn, &clear_bit(&1, 5)), do: {:ok, %{dev | conn: conn}} end @@ -827,7 +877,7 @@ defmodule PCA9641 do downstream bus. - `true` -> Interrupt generated; this master has a lock on the downstream bus. """ - @spec lock_grant_interrupt?(pid) :: boolean + @spec lock_grant_interrupt?(t) :: boolean def lock_grant_interrupt?(%PCA9641{conn: conn}) do with {:ok, data} <- Registers.read_interrupt_status(conn), true <- get_bool(data, 2), @@ -982,7 +1032,7 @@ defmodule PCA9641 do @doc """ Write shared mailbox. """ - @spec write_mailbox(pid, mailbox_data) :: :ok | {:error, term} + @spec write_mailbox(t, mailbox_data) :: {:ok, t} | {:error, term} def write_mailbox(%PCA9641{conn: conn} = dev, <>) do with {:ok, conn} <- Registers.write_mailbox_lsb(conn, <>), {:ok, conn} <- Registers.write_mailbox_msb(conn, <>), diff --git a/mix.exs b/mix.exs index 2f6cceb..9c3a122 100644 --- a/mix.exs +++ b/mix.exs @@ -27,7 +27,7 @@ defmodule PCA9641.MixProject do maintainers: ["James Harton "], licenses: ["HL3-FULL"], links: %{ - "Source" => "https://gitlab.com/jimsy/pca9641" + "Source" => "https://harton.dev/james/pca9641" } ] end @@ -38,9 +38,11 @@ defmodule PCA9641.MixProject do {:circuits_gpio, "~> 1.0", optional: true}, {:circuits_i2c, "~> 2.0", optional: true}, {:credo, "~> 1.6", only: ~w[dev test]a, runtime: false}, - {:earmark, "~> 1.4", only: ~w[dev test]a}, + {:dialyxir, "~> 1.4", only: ~w[dev test]a, runtime: false}, + {:doctor, "~> 0.21", only: ~w[dev test]a, runtime: false}, + {:earmark, "~> 1.4", only: ~w[dev test]a, runtime: false}, {:elixir_ale, "~> 1.2", optional: true}, - {:ex_doc, "~> 0.30", only: ~w[dev test]a}, + {:ex_doc, "~> 0.30", only: ~w[dev test]a, runtime: false}, {:git_ops, "~> 2.4", only: ~w[dev test]a, runtime: false}, {:mimic, "~> 1.5", only: :test}, {:wafer, "~> 1.0"} diff --git a/mix.lock b/mix.lock index 5ee23b8..fc4e24d 100644 --- a/mix.lock +++ b/mix.lock @@ -3,10 +3,14 @@ "circuits_gpio": {:hex, :circuits_gpio, "1.1.0", "cda895fd0a12fdf50e27f6d61cc349587dff29755fca640b93233a661925d97a", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "11dab3c7b39cbe08588e9527c9fd98117be485f70b61641874abdda50340e991"}, "circuits_i2c": {:hex, :circuits_i2c, "2.0.0", "8343b12879189f844835abeaf31a36c5626b8ace58413a582794fdfe60c2dc0e", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "06eccd33b36bcedf41730cac8da58e359967ea63a2cd899cea58c2a138634cc4"}, "credo": {:hex, :credo, "1.6.1", "7dc76dcdb764a4316c1596804c48eada9fff44bd4b733a91ccbf0c0f368be61e", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "698607fb5993720c7e93d2d8e76f2175bba024de964e160e2f7151ef3ab82ac5"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"}, + "doctor": {:hex, :doctor, "0.21.0", "20ef89355c67778e206225fe74913e96141c4d001cb04efdeba1a2a9704f1ab5", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "a227831daa79784eb24cdeedfa403c46a4cb7d0eab0e31232ec654314447e4e0"}, "earmark": {:hex, :earmark, "1.4.19", "3854a17305c880cc46305af15fb1630568d23a709aba21aaa996ced082fc29d7", [:mix], [{:earmark_parser, ">= 1.4.18", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "d5a8c9f9e37159a8fdd3ea8437fb4e229eaf56d5129b9a011dc4780a4872079d"}, "earmark_parser": {:hex, :earmark_parser, "1.4.33", "3c3fd9673bb5dcc9edc28dd90f50c87ce506d1f71b70e3de69aa8154bc695d44", [:mix], [], "hexpm", "2d526833729b59b9fdb85785078697c72ac5e5066350663e5be6a1182da61b8f"}, "elixir_ale": {:hex, :elixir_ale, "1.2.1", "07ac2f17a0191b8bd3b0df6b526c7f699a3a4d690c9def573fcb5824eef24d98", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "bfb099137500a3b8c4a1750cf07f2d704897ef9feac3412064bf9edc7d74193c"}, "elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"}, + "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "ex_doc": {:hex, :ex_doc, "0.30.0", "ed94bf5183f559d2f825e4f866cc0eab277bbb17da76aff40f8e0f149656943e", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "6743fe46704fe27e2f2558faa61f00e5356528768807badb2092d38476d6dac2"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "git_cli": {:hex, :git_cli, "0.3.0", "a5422f9b95c99483385b976f5d43f7e8233283a47cda13533d7c16131cb14df5", [:mix], [], "hexpm", "78cb952f4c86a41f4d3511f1d3ecb28edb268e3a7df278de2faa1bd4672eaf9b"}, diff --git a/renovate.json b/renovate.json deleted file mode 100644 index a932bc9..0000000 --- a/renovate.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["gitlab>jimsy/renovate"] -} diff --git a/test/pca9641_test.exs b/test/pca9641_test.exs index 1a9bc91..23f949a 100644 --- a/test/pca9641_test.exs +++ b/test/pca9641_test.exs @@ -1,7 +1,6 @@ defmodule PCA9641Test do use ExUnit.Case, async: true use Mimic - use Bitwise alias PCA9641.Registers, as: Registers alias Wafer.Driver.Fake, as: Driver @@ -927,11 +926,13 @@ defmodule PCA9641Test do {:ok, conn} end) - assert {:ok, conn} = PCA9641.abandon_downstream_bus(conn()) + assert {:ok, _conn} = PCA9641.abandon_downstream_bus(conn()) end end defp conn do - with {:ok, conn} <- Driver.acquire([]), {:ok, conn} <- PCA9641.acquire(conn: conn), do: conn + with {:ok, conn} <- Driver.acquire([]), + {:ok, conn} <- PCA9641.acquire(conn: conn), + do: conn end end