Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pylint.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Pylint
name: Pylint/Mypy

on: [pull_request]

Expand Down
14 changes: 10 additions & 4 deletions .github/workflows/release_pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ jobs:
run: pyinstaller arduino_logique.spec

- name: Compress the build
run: tar -czvf arduino_logique_macos.tar.gz dist/arduino_logique
run: |
cd dist
tar -czvf arduino_logique_macos.tar.gz arduino_logique

- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: macos-build
path: arduino_logique_macos.tar.gz
path: dist/arduino_logique_macos.tar.gz

build-ubuntu:
runs-on: ubuntu-latest
Expand All @@ -53,13 +55,15 @@ jobs:
run: pyinstaller arduino_logique.spec

- name: Compress the build
run: tar -czvf arduino_logique_ubuntu.tar.gz dist/arduino_logique
run: |
cd dist
tar -czvf arduino_logique_ubuntu.tar.gz arduino_logique

- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: ubuntu-build
path: arduino_logique_ubuntu.tar.gz
path: dist/arduino_logique_ubuntu.tar.gz

build-windows:
runs-on: windows-latest
Expand Down Expand Up @@ -131,3 +135,5 @@ jobs:
artifacts: "./dist/arduino_logique_macos.tar.gz,./dist/arduino_logique_ubuntu.tar.gz,./dist/arduino_logique_windows.zip"
token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ steps.bump.outputs.new_tag }}
makeLatest: ${{ !contains(steps.bump.outputs.new_tag, 'beta') }}
prerelease: ${{ contains(steps.bump.outputs.new_tag, 'beta') }}
Binary file removed Images/ReelleMini170-0.jpg
Binary file not shown.
Binary file removed Images/ReelleMini170.png
Binary file not shown.
Binary file removed Images/ResultatMini170-1.png
Binary file not shown.
Binary file removed Images/ResultatMini170-2.png
Binary file not shown.
Binary file removed Images/ResultatMini170-3.png
Binary file not shown.
Binary file removed Images/ResultatMini170-4.png
Binary file not shown.
674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion arduino_logique.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
draw a breadboard, etc.
"""

from pathlib import Path
import tkinter as tk
from tkinter import font
from breadboard import Breadboard
from component_sketch import ComponentSketcher
from menus import Menus
from sidebar import Sidebar
from toolbar import Toolbar
from utils import resource_path


def main():
Expand Down Expand Up @@ -60,7 +62,7 @@ def main():
# Creating the Sidebar instance after canvas, board, sketcher, component_data are defined
sidebar = Sidebar(
parent=win,
chip_images_path="Assets/chips",
chip_images_path=Path(resource_path("Assets/chips")).resolve(),
canvas=canvas,
sketcher=sketcher,
current_dict_circuit=sketcher.current_dict_circuit,
Expand Down
1 change: 0 additions & 1 deletion arduino_logique.spec
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ exe = EXE(
target_arch=None,
codesign_identity=None,
entitlements_file=None,
contents_directory='.',
)
coll = COLLECT(
exe,
Expand Down
4 changes: 3 additions & 1 deletion component_sketch.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
well as handling events like dragging and clicking.
"""

from pathlib import Path
import tkinter as tk
from tkinter import font
import math
Expand All @@ -28,6 +29,7 @@
OUTPUT,
)
from component_params import BOARD_830_PTS_PARAMS, DIP14_PARAMS
from utils import resource_path


class ComponentSketcher:
Expand Down Expand Up @@ -2706,7 +2708,7 @@ def draw_battery(self, x_distance, y_distance, scale=1, width=-1, direction='HOR
print("Battery already exists in the circuit.")
return x_distance, y_distance

image_path = os.path.join('Assets', 'Icons', 'battery.png')
image_path = Path(resource_path("Assets/Icons/battery.png")).resolve()

if not os.path.isfile(image_path):
print(f"Battery image not found at {image_path}.")
Expand Down
Binary file added docs/images/defender-warning-french.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
174 changes: 28 additions & 146 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,164 +1,46 @@
# ArduinoLogique
Projet design 4
# Description du projet
# Arduino-Logique

## 1) Philosophie du code
([Français](#instructions-dinstallation))

Le point d'entrée principal du projet est la fonction `circuit`, qui prend en entrée un modèle correspondant à une liste de description de circuit. Cette fonction est récursive, ce qui permet de gérer une imbriquation infinie de listes et donc d'avoir une structure hiérarchique illimitée pour la création ou l'installation de composants.
[![GitHub release](https://img.shields.io/github/v/release/Team-Arduino-Logique/Arduino-Logique?sort=semver)](https://github.com/Team-Arduino-Logique/Arduino-Logique/releases/latest)
[![GitHub latest pre-release](https://img.shields.io/github/v/tag/Team-Arduino-Logique/Arduino-Logique?include_prereleases&sort=semver)](https://github.com/Team-Arduino-Logique/Arduino-Logique/tags)

Cette approche rend le code modulaire (en théorie, car il reste encore quelques ajustements à effectuer).
[![GitHub issues](https://img.shields.io/github/issues/Team-Arduino-Logique/Arduino-Logique.svg)](https://github.com/Team-Arduino-Logique/Arduino-Logique/issues)
[![GitHub license](https://img.shields.io/github/license/Team-Arduino-Logique/Arduino-Logique.svg)](https://github.com/Team-Arduino-Logique/Arduino-Logique/blob/master/LICENSE)
[![Pylint Workflow](https://github.com/Team-Arduino-Logique/Arduino-Logique/actions/workflows/pylint.yml/badge.svg)](https://github.com/Team-Arduino-Logique/Arduino-Logique/actions/workflows/pylint.yml)
[![Build and Release Workflow](https://github.com/Team-Arduino-Logique/Arduino-Logique/actions/workflows/release_pipeline.yml/badge.svg)](https://github.com/Team-Arduino-Logique/Arduino-Logique/actions/workflows/release_pipeline.yml)

## 2) Exemples
## Contents

La suite des explications sera illustrée par des exemples afin d'être à la fois plus pragmatique et plus claire:
- créer une plaquette
- créer une puce
- créer un cable
- créer une entrée/sortie
- créer un circuit
- [Installation Instructions (English)](#installation-instructions)
- [Windows installation](#windows-installation)
- [Microcontroller](#microcontroller)
- [Instructions d'installation (Français)](#instructions-dinstallation)
- [Microcontrôleur](#microcontrôleur)
- [Installation sur Windows](#installation-sur-windows)

### a) Créer une plaquette:
Il existe 4 types de platine standart:
## Installation Instructions

#### Types de Breadboard
Please go to the [release page](https://github.com/Team-Arduino-Logique/Arduino-Logique/releases) and download the latest release for your operating system.

##### - Mini Breadboard
- **170 points** : Une petite platine souvent utilisée pour des circuits simples ou des prototypes de petite taille.
- **Dimensions approximatives** : 45 mm x 34 mm.
### Windows installation

##### - Half Size Breadboard
- **400 points** : Une platine de taille intermédiaire.
- **Dimensions approximatives** : 82 mm x 54 mm.
- **Distribution** : 300 points de connexion en zone centrale et 100 points pour les rails d'alimentation.
Windows Defender will warn you about an unverified program. You can still execute it by clicking "More information", then "Continue".

##### - Full Size Breadboard
- **830 points** : Une platine de taille standard couramment utilisée.
- **Dimensions approximatives** : 165 mm x 54 mm.
- **Distribution** : 630 points de connexion en zone centrale et 200 points pour les rails d'alimentation.
### Microcontroller

##### - Large Breadboard
- **1660 points** : Une grande platine pour des projets plus complexes.
- **Dimensions approximatives** : 200 mm x 160 mm.
- **Distribution** : 1260 points de connexion en zone centrale et 400 points pour les rails d'alimentation.
#### TODO instructions for microcontroller

Le code permet de créer toutes ces plaques ou d'autres plus exotiques.
Le code exemple qui suit va nous permettre de concevoir la mini plaque de 170 points.
## Instructions d'installation

Nous commençons par créer la plaque avec son fond:
Veuillez vous rendre sur la [page des versions](https://github.com/Team-Arduino-Logique/Arduino-Logique/releases) et télécharger la dernière version pour votre système d'exploitation.

```python
### Microcontrôleur

import tkinter as tk
import platineEssai as pe
from tkinter import font
#### TODO instructions pour microcontrôleur

fen = tk.Tk()
fen.title("Laboratoire virtuel de circuit logique - GIF-1002")
### Installation sur Windows

# Créer un canvas (surface sur laquelle on dessine)
canvas = tk.Canvas(fen, width=1500, height=900)
canvas.pack()

xPlaque, yPlaque = 50,10
pe.init(canvas)
plaqueMini170 = [(pe.planche,1,{"lgLigne":17, "lgColonne":10, "sepAlim":[], "sepDistribution":[(2,4.5)]})]
pe.circuit(canvas,xPlaque ,yPlaque, modele = plaqueMini170)

fen.mainloop()
```
![résultat du code 1:](Images/ResultatMini170-1.png)

Les lignes de code les plus essentielles sont:

```python
plaqueMini170 = [(pe.planche,1,{"lgLigne":17, "lgColonne":10, "sepAlim":[], "sepDistribution":[(2,4.5)]})]
pe.circuit(canvas,xPlaque ,yPlaque, modele = plaqueMini170)
```

On crée un modèle plaqueMini170 c'est une liste contenant un appel de fonction et ses paramètres :
[(appel d'une fonction ou une autre liste, nombre d'appel, paramètres)]

La fonction appelée est planche() avec ses paramètres ici 10 bandes(lgColonne) de 17 trous (lgLigne) et un séparateur situé en x= 2+1 trous et y = 4.5 +1 bande de trou.
Quand le modèle est défini, on peut l'utiliser comme paramètre dans la fonction circuit qui en fait crée et gère le circuit modèle.
c'est la fonction circuit qui est le point d'entré du programme, c'est une fonction récursive qui lit les listes et les interprète.

Ajoutons nos lignes de trous en modifiant le code :

```python
ligneDistribution = [ (pe.trou, 17)]
plaqueMini170 = [(pe.planche,1,{"lgLigne":18, "lgColonne":12, "sepAlim":[], "sepDistribution":[(3,5.5)]}), (ligneDistribution,5, {"sens":pe.VERTICAL})]
```
Nous créons une liste ligneDistribution qui dit à circuit d'appeler 17 fois la fonction trou, ce qui affiche une rangée de 17 trous.
Dans la liste plaqueMini170 on ajoute (ligneDistribution,5, {"sens":pe.VERTICAL}), on appelle donc 5 fois lignedistribution avec le paramètre sens=VERTICAL, ce qui indique qu'après une ligne on fait un saut vertical(une nouvelle ligne comme un retour chariot).
Voici le résultat :

![résultat du code 2:](Images/ResultatMini170-2.png)

Il reste à ajuster les lignes de distributions pour cela on va ajouter ceci :

```python
plaqueMini170 = [(pe.planche,1,{"lgLigne":18, "lgColonne":12, "sepAlim":[], "sepDistribution":[(3,5.5)]}), (pe.demiPlat,1,{"sens":pe.HORIZONTAL}),(pe.demiPlat,1,{"sens":pe.VERTICAL}),(ligneDistribution,5, {"sens":pe.VERTICAL})]

```
voici l'ajout isolé : (pe.demiPlat,1,{"sens":pe.HORIZONTAL}),(pe.demiPlat,1,{"sens":pe.VERTICAL}),

le demiPlat est une fonction qui permet d'ajouter un 1/2 espace à notre modèle. Un espace est la distance entre 2 trous.
Ici nous aurons un 1/2 espace sur l'horizontal et un autre sur la verticale.

le résultat :
![résultat du code 3:](Images/ResultatMini170-3.png)

Réécrivons le code pour le rendre plus lisible et voir comment fonctionne la modularité:

```python
bandeDistribution = [(pe.demiPlat,1,{"sens":pe.HORIZONTAL}),(pe.demiPlat,1,{"sens":pe.VERTICAL}),(ligneDistribution,5, {"sens":pe.VERTICAL})]
plaqueMini170 = [(pe.planche,1,{"lgLigne":18, "lgColonne":12, "sepAlim":[], "sepDistribution":[(3,5.5)]}), (bandeDistribution,1,{"sens":pe.VERTICAL})]

```
Nous ne faisons que créer une nouvelle liste contenant nos 5 lignes de distributions, puis cette liste est insérée dans le modèle de plaqueMini170.
Cela ne change rien au résultat mais simplifie la lecture du code mais va surtout nous permettre de réutiliser le code pour la suite.

La suite du modèle de plaqueMini170 est une deuxième bande de distribution placée plus bas.

Nous changeons le modèle de plaqueMini170 ainsi:

```python
plaqueMini170 = [(pe.planche,1,{"lgLigne":18, "lgColonne":12, "sepAlim":[], "sepDistribution":[(3,5.5)]}), (bandeDistribution,1,{"sens":pe.VERTICAL}), \
(bandeDistribution,1)]

```
Nous ajoutons juste une nouvelle bande de distribution et le résultat est le suivant :

![résultat du code 4:](Images/ResultatMini170-4.png)

Assez proche dur réel :
![résultat du code 4:](Images/ReelleMini170.png)

Voilà pour la miniPlaque170 qui n'existait pas encore et que l'on peut intégrer à la bibliothèque.

Il reste le modèle Half Size Breadboard que je laisse en exercice...;-)

Ah! le code au complet :

```python
import platineEssai as pe
from tkinter import font

fen = tk.Tk()
fen.title("Laboratoire virtuel de circuit logique - GIF-1002")

# Créer un canvas (surface sur laquelle on dessine)
canvas = tk.Canvas(fen, width=1500, height=900)
canvas.pack()

xPlaque, yPlaque = 50,10
pe.init(canvas)
ligneDistribution = [ (pe.trou, 17)]
bandeDistribution = [(pe.demiPlat,1,{"sens":pe.HORIZONTAL}),(pe.demiPlat,1,{"sens":pe.VERTICAL}),(ligneDistribution,5, {"sens":pe.VERTICAL})]
plaqueMini170 = [(pe.planche,1,{"lgLigne":18, "lgColonne":12, "sepAlim":[], "sepDistribution":[(3,5.5)]}), (bandeDistribution,1,{"sens":pe.VERTICAL}), \
(bandeDistribution,1)]
pe.circuit(canvas,xPlaque ,yPlaque, modele = plaqueMini170)

fen.mainloop()
```
Lors de l'installation sur Windows, un avertissement de sécurité peut apparaître. Pour continuer, cliquez sur "Informations complémentaires", puis sélectionnez "Exécuter quand même".

![Avertissement de sécurité Windows](docs/images/defender-warning-french.png)
3 changes: 2 additions & 1 deletion toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import os
from component_sketch import ComponentSketcher
from dataCDLT import INPUT, OUTPUT, FREE
from utils import resource_path


@dataclass
Expand Down Expand Up @@ -96,7 +97,7 @@ def load_images(self) -> dict[str, tk.PhotoImage | None]:
Loads PNG images from the 'icons' folder, scales them, and stores them in the images dictionary.
"""
icon_names = ["connection", "power", "input", "output", "delete"]
icons_folder = Path("assets/icons").resolve()
icons_folder = Path(resource_path("Assets/Icons")).resolve()
images: dict[str, tk.PhotoImage | None] = {}
for name in icon_names:
path = os.path.join(icons_folder, f"{name}.png")
Expand Down
7 changes: 7 additions & 0 deletions utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import os


def resource_path(relative_path: str) -> str:
new_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), relative_path)
print("new_path:", new_path)
return new_path
Loading