chore: migrate to local (#26)
All checks were successful
continuous-integration/drone/push Build is passing

* Add Drone CI configuration
* Change URLs
* Remove Gitlab CI configuration

Reviewed-on: #26
Co-authored-by: James Harton <james@harton.nz>
Co-committed-by: James Harton <james@harton.nz>
This commit is contained in:
James Harton 2024-02-14 16:15:59 +13:00 committed by James Harton
parent 64c1b12cd2
commit b8624141f2
11 changed files with 484 additions and 182 deletions

383
.drone.yml Normal file
View file

@ -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

View file

@ -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

2
.tool-versions Normal file
View file

@ -0,0 +1,2 @@
erlang 26.2.2
elixir 1.16.1

View file

@ -5,14 +5,10 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline
<!-- changelog -->
## [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)

View file

@ -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)
@ -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

View file

@ -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"

View file

@ -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, <<msb, lsb>>) do
with {:ok, conn} <- Registers.write_mailbox_lsb(conn, <<lsb>>),
{:ok, conn} <- Registers.write_mailbox_msb(conn, <<msb>>),

View file

@ -27,7 +27,7 @@ defmodule PCA9641.MixProject do
maintainers: ["James Harton <james@harton.nz>"],
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"}

View file

@ -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"},

View file

@ -1,3 +0,0 @@
{
"extends": ["gitlab>jimsy/renovate"]
}

View file

@ -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