Skip to content

Commit 110d20c

Browse files
author
Bernhard Trinnes
committed
Initial commit
0 parents  commit 110d20c

18 files changed

Lines changed: 731 additions & 0 deletions

.github/workflows/update-site.yml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
name: Generate Tutorials Index
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
generate-tutorials-index:
8+
runs-on: ubuntu-latest
9+
10+
steps:
11+
- name: Checkout repository
12+
uses: actions/checkout@v3
13+
14+
- name: Set up Python
15+
uses: actions/setup-python@v4
16+
with:
17+
python-version: '3.x'
18+
19+
- name: Generate tutorials.json
20+
env:
21+
GH_USERNAME: Boernsman
22+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # or a PAT if needed
23+
run: |
24+
python3 <<EOF
25+
import requests, json
26+
27+
headers = {
28+
"Accept": "application/vnd.github.mercy-preview+json",
29+
"Authorization": f"token '{os.environ['GH_TOKEN']}'"
30+
}
31+
32+
res = requests.get(f"https://api.github.com/users/{os.environ['GH_USERNAME']}/repos", headers=headers)
33+
repos = res.json()
34+
35+
tutorials = []
36+
for repo in repos:
37+
if not repo.get('fork'):
38+
r = requests.get(repo['url'], headers=headers).json()
39+
if 'topics' in r and 'tutorial' in r['topics']:
40+
tutorials.append({
41+
"name": repo["name"],
42+
"html_url": repo["html_url"],
43+
"description": repo.get("description", "")
44+
})
45+
46+
with open("tutorials.json", "w") as f:
47+
json.dump(tutorials, f, indent=2)
48+
EOF
49+
50+
- name: Commit and push tutorials.json
51+
run: |
52+
git config user.name "github-actions"
53+
git config user.email "actions@github.com"
54+
git add tutorials.json
55+
git commit -m "Update tutorials index" || echo "No changes to commit"
56+
git push
57+

.gitignore

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
~*
2+
3+
# ignore node/grunt dependency directories
4+
node_modules/
5+
6+
# Ignore build directories.
7+
/build
8+
/dist
9+
10+
# ignore composer vendor directory
11+
/vendor
12+
13+
# ignore components loaded via Bower
14+
/bower_components
15+
16+
# ignore jekyll build directory
17+
/_site
18+
19+
# ignore OS generated files
20+
ehthumbs.db
21+
Thumbs.db
22+
23+
# ignore Editor files
24+
*.sublime-project
25+
*.sublime-workspace
26+
*.komodoproject
27+
28+
# ignore log files and databases
29+
*.log
30+
*.sql
31+
*.sqlite
32+
33+
# ignore compiled files
34+
*.com
35+
*.class
36+
*.dll
37+
*.exe
38+
*.o
39+
*.so
40+
41+
# ignore packaged files
42+
*.7z
43+
*.dmg
44+
*.gz
45+
*.iso
46+
*.jar
47+
*.rar
48+
*.tar
49+
*.zip
50+
51+
# ignore private/secret files
52+
*.der
53+
*.key
54+
*.pem
55+
56+
# --------------------------------------------------------
57+
# BEGIN Explictly Allowed Files (i.e. do NOT ignore these)
58+
# --------------------------------------------------------
59+
60+
# track these files, if they exist
61+
!.dockerignore
62+
!.editorconfig
63+
!.env.example
64+
!.git-blame-ignore-revs
65+
!.gitignore
66+
!.nvmrc
67+
!.phpcs.xml.dist

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Bitcrush Testing Github.io Page
2+
3+
Please visit [github.io](https://bitcrushtesting.github.io)
4+

_config.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Site settings
2+
title: Bitcrush Testing
3+
email: contact@bitcrushtesting.com
4+
description: > # this means to ignore newlines until "baseurl:"
5+
Write an awesome description for your new site here. You can edit this
6+
line in _config.yml. It will appear in your document head meta (for
7+
Google search results) and in your feed.xml site description.
8+
baseurl: "/example" # the subpath of your site, e.g. /blog/
9+
url: "http://bitcrushtesting.github.io" # the base hostname & protocol for your site
10+
github_username: bitcrushtesting
11+
12+
# Build settings
13+
markdown: kramdown
14+
permalink: /:year/:title:output_ext

_includes/footer.html

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<footer class="site-footer">
2+
3+
<div class="wrapper">
4+
5+
<h2 class="footer-heading">{{ site.title }}</h2>
6+
7+
<div class="footer-col-wrapper">
8+
<div class="footer-col footer-col-1">
9+
<ul class="contact-list">
10+
<li>{{ site.title }}</li>
11+
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
12+
</ul>
13+
</div>
14+
15+
<div class="footer-col footer-col-2">
16+
<ul class="social-media-list">
17+
{% if site.github_username %}
18+
<li>
19+
<a href="https://github.com/{{ site.github_username }}">
20+
<span class="icon icon--github">
21+
<svg viewBox="0 0 16 16">
22+
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
23+
</svg>
24+
</span>
25+
26+
<span class="username">{{ site.github_username }}</span>
27+
</a>
28+
</li>
29+
{% endif %}
30+
31+
{% if site.twitter_username %}
32+
<li>
33+
<a href="https://twitter.com/{{ site.twitter_username }}">
34+
<span class="icon icon--twitter">
35+
<svg viewBox="0 0 16 16">
36+
<path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
37+
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
38+
</svg>
39+
</span>
40+
41+
<span class="username">{{ site.twitter_username }}</span>
42+
</a>
43+
</li>
44+
{% endif %}
45+
</ul>
46+
</div>
47+
48+
<div class="footer-col footer-col-3">
49+
<p class="text">{{ site.description }}</p>
50+
</div>
51+
</div>
52+
53+
</div>
54+
55+
</footer>

_includes/head.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<head>
2+
<meta charset="utf-8">
3+
<meta name="viewport" content="width=device-width initial-scale=1" />
4+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
5+
6+
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
7+
<meta name="description" content="{{ site.description }}">
8+
9+
<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
10+
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
11+
</head>

_includes/header.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<header class="site-header">
2+
3+
<div class="wrapper">
4+
5+
<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
6+
7+
<nav class="site-nav">
8+
<a href="#" class="menu-icon">
9+
<svg viewBox="0 0 18 15">
10+
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
11+
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
12+
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
13+
</svg>
14+
</a>
15+
16+
<div class="trigger">
17+
{% for page in site.pages %}
18+
{% if page.title %}
19+
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
20+
{% endif %}
21+
{% endfor %}
22+
</div>
23+
</nav>
24+
25+
</div>
26+
27+
</header>

_posts/test_iec62304.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Testing for Functional Safety in the Context of IEC 62304
2+
3+
When developing medical device software, safety is not just an aspiration—it is a legal and ethical obligation. Among the many standards that govern this domain, IEC 62304 stands out as the key international standard for medical device software lifecycle processes. One essential part of compliance with IEC 62304 is systematic testing for functional safety. But what does that mean in practice?
4+
5+
As engineers and software developers, we are trained to think in terms of structure, reliability, and traceability. This mindset aligns closely with the philosophy behind IEC 62304.
6+
7+
## Understanding Functional Safety
8+
9+
Functional safety ensures that a system behaves correctly in response to its inputs, particularly under fault conditions. In the medical domain, this translates to: The software must not cause harm to a patient or user, even in the case of predictable failures.
10+
11+
For example, if a software-controlled infusion pump administers medication, the software must handle sensor failures, communication losses, and user errors in a way that prevents hazardous events. This is where functional safety comes in.
12+
13+
## IEC 62304 and Safety Classification
14+
15+
IEC 62304 defines three software safety classes:
16+
17+
* Class A: No injury or damage to health is possible
18+
* Class B: Non-serious injury is possible
19+
* Class C: Death or serious injury is possible
20+
21+
Depending on the classification, the rigor of testing and verification activities increases significantly. For Class C software, comprehensive testing strategies must be implemented, including unit testing, integration testing, and system-level verification with traceability to risk controls.
22+
23+
## The Role of Testing
24+
Testing in the context of IEC 62304 is not just about finding bugs—it is about demonstrating that the software meets its safety requirements under all foreseeable conditions. Testing must therefore be:
25+
26+
* Systematic: Following a documented and traceable processRisk-based
27+
* Risk-based: Prioritizing tests based on potential harmBidirectionally
28+
* Bidirectionally traceable: Linking each test case to a requirement and vice versa
29+
30+
Typical test activities include:
31+
32+
* Static analysis to detect potential defects early
33+
* Unit tests to verify logic at the function level
34+
* Integration tests to ensure proper communication between modules
35+
* System tests with fault injection and edge cases
36+
* Verification of risk controls, particularly those related to hardware-software interaction
37+
38+
## Traceability
39+
40+
We are known for their obsession with documentation and precision—and in this case, that’s a very good thing. IEC 62304 mandates traceability across the software lifecycle. Every requirement should be linked to:
41+
42+
* Its origin in the risk management process (typically from ISO 14971)
43+
* The corresponding architecture or design element
44+
* The test cases that verify it
45+
46+
Tools like Polarion, Codebeamer, or even open-source alternatives like ReqView and Robot Framework can help enforce this rigor.
47+
48+
## Integration with ISO 14971 and IEC 60601
49+
Testing for functional safety cannot happen in isolation. It must be harmonized with other standards like:
50+
51+
* ISO 14971 for risk management
52+
* IEC 60601 for electrical safety and essential performance
53+
54+
For example, a Class C software might include a software-implemented failsafe that activates when a hardware sensor reports inconsistent data. This behavior must be tested in both software (mocked sensor failure) and in system testing (actual fault injection).
55+
56+
## Final Thoughts
57+
58+
Testing for functional safety in line with IEC 62304 is not just a regulatory checkbox—it is a mindset. It requires a deep understanding of both the software architecture and the clinical risks involved.
59+
60+
We are in a good position to excel here. Our focus on process discipline, risk management, and engineering integrity provides a solid foundation for building safe, reliable medical software.
61+
62+
In the end, good testing is not about covering every line of code—it is about being able to sleep at night, knowing that your software will not harm anyone.

about.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
layout: page
3+
title: About
4+
permalink: /about/
5+
---
6+
7+
Bitcrush | Crushing Bytes to Bits
8+
Embedded Software Testing
9+
10+
contact@bitcrushtesting.com

0 commit comments

Comments
 (0)