├── .gitignore
├── .history
├── README_20241104171442.md
├── README_20241104171450.md
├── README_20241104171458.md
├── README_20241104171505.md
├── README_20241104171510.md
├── README_20241104171516.md
├── README_20241104171521.md
├── README_20241104171522.md
├── README_20241104171528.md
├── README_20241104171533.md
├── README_20241104171537.md
├── README_20241104171538.md
├── README_20241104171539.md
├── README_20241104171548.md
├── README_20241104171606.md
├── README_20241104171612.md
├── README_20241104171615.md
├── README_20241104171619.md
├── README_20241104171623.md
├── README_20241104171624.md
├── README_20241104171625.md
├── README_20241104171639.md
├── README_20241104171643.md
├── README_20241104171654.md
├── README_20241104171704.md
├── README_20241104171706.md
└── README_20241104171716.md
├── .wakatime-project
├── 3D
├── Box.step
├── Box.stl
├── Main.FCStd
├── SlotIndicatorBack.stl
├── SlotIndicatorCover.stl
├── SlotIndicatorPin.stl
├── Tray.step
└── Tray.stl
├── Code
├── App
│ ├── README.md
│ ├── main.py
│ ├── requirements.txt
│ ├── static
│ │ ├── Fonts
│ │ │ └── OpenSans-Regular.ttf
│ │ ├── script.js
│ │ └── style.css
│ └── templates
│ │ └── index.html
├── Node
│ ├── .gitignore
│ ├── README.md
│ ├── include
│ │ ├── .env.template
│ │ └── README
│ ├── platformio.ini
│ └── src
│ │ └── main.cpp
└── Server
│ ├── README.md
│ ├── main.py
│ └── requirements.txt
├── PCB
├── Indicators
│ ├── Indicators-backups
│ │ ├── Indicators-2024-11-02_003129.zip
│ │ ├── Indicators-2024-11-02_003805.zip
│ │ ├── Indicators-2024-11-02_004612.zip
│ │ ├── Indicators-2024-11-02_005528.zip
│ │ ├── Indicators-2024-11-02_010103.zip
│ │ ├── Indicators-2024-11-03_101610.zip
│ │ └── Indicators-2024-11-03_102349.zip
│ ├── Indicators.kicad_pcb
│ ├── Indicators.kicad_prl
│ ├── Indicators.kicad_pro
│ ├── Indicators.kicad_sch
│ ├── Indicators.step
│ ├── Indicators.wrl
│ ├── fabrication-toolkit-options.json
│ ├── fp-info-cache
│ ├── production
│ │ ├── Indicators.zip
│ │ ├── backups
│ │ │ └── Indicators_2024-11-02_00-55-45.zip
│ │ ├── bom.csv
│ │ ├── designators.csv
│ │ ├── netlist.ipc
│ │ └── positions.csv
│ └── schematic.pdf
└── NodePCB
│ ├── NodePCB.kicad_pcb
│ ├── NodePCB.kicad_prl
│ ├── NodePCB.kicad_pro
│ ├── NodePCB.kicad_sch
│ ├── fabrication-toolkit-options.json
│ ├── fp-info-cache
│ └── production
│ ├── Gerber.zip
│ ├── bom.csv
│ ├── designators.csv
│ ├── netlist.ipc
│ └── positions.csv
├── README.md
├── app.Dockerfile
├── compose.yml
├── database.db
├── server.Dockerfile
└── static
├── AddItem.png
├── Main.png
└── Video.mp4
/.gitignore:
--------------------------------------------------------------------------------
1 | .history
2 | Code/venv
3 | Code/Server/database.db
4 | .vscode
5 | .pio
6 | *backup*
7 | .env
8 | *.FCBak
9 | database.db
--------------------------------------------------------------------------------
/.history/README_20241104171442.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/.history/README_20241104171442.md
--------------------------------------------------------------------------------
/.history/README_20241104171450.md:
--------------------------------------------------------------------------------
1 | Interactive storage system
--------------------------------------------------------------------------------
/.history/README_20241104171458.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 |
--------------------------------------------------------------------------------
/.history/README_20241104171505.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 |
--------------------------------------------------------------------------------
/.history/README_20241104171510.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | *
5 | *
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171516.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gr
5 | *
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171521.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | *
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171522.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | *
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171528.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171533.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixles
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171537.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixees
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171538.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixeles
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171539.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixels
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171548.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixels
6 | *
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171606.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixels
6 | * Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171612.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | * Gridfinity compatible
5 | * Esp32 controlled neopixels
6 | * Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171615.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | Gridfinity compatible
5 | * Esp32 controlled neopixels
6 | * Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171619.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | * Esp32 controlled neopixels
6 | * Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171623.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [x] Esp32 controlled neopixels
6 | [x] Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171624.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [x] Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171625.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171639.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI for
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171643.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI
7 |
--------------------------------------------------------------------------------
/.history/README_20241104171654.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI to manage storage
7 |
8 |
--------------------------------------------------------------------------------
/.history/README_20241104171704.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI to manage storage
7 | [] API
8 |
--------------------------------------------------------------------------------
/.history/README_20241104171706.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI to manage storage
7 | [] API
8 |
--------------------------------------------------------------------------------
/.history/README_20241104171716.md:
--------------------------------------------------------------------------------
1 | # Interactive storage system
2 |
3 | Features:
4 | [x] Gridfinity compatible
5 | [] Esp32 controlled neopixels
6 | [] Web UI to manage storage
7 | [] API
8 |
--------------------------------------------------------------------------------
/.wakatime-project:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/.wakatime-project
--------------------------------------------------------------------------------
/3D/Box.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/3D/Box.stl
--------------------------------------------------------------------------------
/3D/Main.FCStd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/3D/Main.FCStd
--------------------------------------------------------------------------------
/3D/SlotIndicatorBack.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/3D/SlotIndicatorBack.stl
--------------------------------------------------------------------------------
/3D/SlotIndicatorCover.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/3D/SlotIndicatorCover.stl
--------------------------------------------------------------------------------
/3D/SlotIndicatorPin.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/3D/SlotIndicatorPin.stl
--------------------------------------------------------------------------------
/3D/Tray.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/3D/Tray.stl
--------------------------------------------------------------------------------
/Code/App/README.md:
--------------------------------------------------------------------------------
1 | Website
--------------------------------------------------------------------------------
/Code/App/main.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, render_template
2 | from flask_cors import CORS
3 |
4 | app = Flask(__name__)
5 | # CORS(app, resources={r"/*": {"origins": "*"}})
6 |
7 | # CORS(app)
8 |
9 | @app.route('/')
10 | def home():
11 | return render_template('index.html')
12 |
13 | if __name__ == '__main__':
14 | app.run(debug=True, host='0.0.0.0', port=5506)
--------------------------------------------------------------------------------
/Code/App/requirements.txt:
--------------------------------------------------------------------------------
1 | blinker==1.8.2
2 | certifi==2024.8.30
3 | charset-normalizer==3.4.0
4 | click==8.1.7
5 | Flask==3.0.3
6 | Flask-Cors==5.0.0
7 | idna==3.10
8 | itsdangerous==2.2.0
9 | Jinja2==3.1.4
10 | MarkupSafe==3.0.2
11 | requests==2.32.3
12 | urllib3==2.2.3
13 | Werkzeug==3.1.2
14 |
--------------------------------------------------------------------------------
/Code/App/static/Fonts/OpenSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/Code/App/static/Fonts/OpenSans-Regular.ttf
--------------------------------------------------------------------------------
/Code/App/static/script.js:
--------------------------------------------------------------------------------
1 | var server = "127.0.0.1"// Server IP address
2 |
3 | document.addEventListener('DOMContentLoaded', (event) => {
4 |
5 |
6 | const categoryInput = document.getElementById('categoryInput');
7 | const nameInput = document.getElementById('nameInput');
8 | const tableBody = document.getElementById('itemTable').getElementsByTagName('tbody')[0];
9 |
10 | const expression = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/gi;
11 | const regex = new RegExp(expression);
12 | // Function to update the table based on the category input
13 | function updateTable() {
14 | // Clear the existing table rows
15 | tableBody.innerHTML = '';
16 |
17 | console.log(data)
18 | // Filter and display the items
19 | data.forEach(item => {
20 | // console.log(item.length)
21 | if (!categoryInput || item[3].toLowerCase().includes(categoryInput.value.toLowerCase())) {
22 |
23 | if (!nameInput || item[1].toLowerCase().includes(nameInput.value.toLowerCase())) {
24 |
25 | const row = tableBody.insertRow();
26 | for (let i = 1; i < item.length - 1; i++) { // -1 to remove the slots info
27 |
28 | if (i === 4) {
29 | const cell = row.insertCell(i - 1);
30 | const input = document.createElement('input');
31 | input.type = 'number';
32 | input.value = item[i];
33 | input.classList.add('quantityInputNum');
34 | cell.appendChild(input);
35 | } else if (i === 7) {
36 | continue;
37 | } else {
38 |
39 | if (i === 1) {
40 | if (item[7] === "none" || item[7] === null || item[7] === "") {
41 | row.insertCell(i - 1).textContent = item[i];
42 | } else {
43 | const cell = row.insertCell(i - 1);
44 | const link = document.createElement('a');
45 | link.href = item[7];
46 | link.textContent = item[i];
47 | cell.appendChild(link);
48 | }
49 | } else {
50 | if (i === 3) {
51 | row.insertCell(i - 1).textContent = capitalizeFirstLetter(item[i]);
52 | } else{
53 | row.insertCell(i - 1).textContent = item[i];
54 | }
55 |
56 | }
57 | }
58 |
59 | }
60 |
61 | // const quantityCell = row.insertCell(item.length - 2);
62 | const quantityInput = row.querySelector('.quantityInputNum');
63 | quantityInput.addEventListener('change', () => {
64 | // Add functionality to handle quantity change here
65 | console.log('Quantity changed for item:', item[0], 'New quantity:', quantityInput.value);
66 | quantity_item(item[0], quantityInput.value);
67 | });
68 |
69 | // Add "Delete" button
70 | const deleteCell = row.insertCell(6);
71 | const deleteButton = document.createElement('button');
72 | deleteButton.textContent = 'Delete';
73 | deleteButton.addEventListener('click', () => {
74 | // Add delete functionality here
75 | // console.log('Delete button clicked for item:', item[0]);
76 | deleteItem(item[0]);
77 | window.location.reload();
78 |
79 | });
80 | deleteCell.appendChild(deleteButton);
81 |
82 | // Add "Locate" button
83 | const locateCell = row.insertCell(7);
84 | const locateButton = document.createElement('button');
85 | locateButton.textContent = 'Locate';
86 | locateButton.addEventListener('click', () => {
87 | // Add locate functionality here
88 | // console.log('Locate button clicked for item:', item[0]);
89 | locateItem(item[0]);
90 | });
91 | locateCell.appendChild(locateButton);
92 |
93 | // Add "Edit" button
94 | const editCell = row.insertCell(8);
95 | const editButton = document.createElement('button');
96 | editButton.textContent = 'Edit';
97 | editButton.addEventListener('click', () => {
98 | // Add edit functionality here
99 | // console.log('Edit button clicked for item:', item[0]);
100 | // editItem(item[0]);
101 | editItem(item[0]);
102 | });
103 | editCell.appendChild(editButton);
104 |
105 | }
106 | }
107 | });
108 |
109 | }
110 |
111 |
112 | fetch('http://'+ server+ ':5505/api/list')
113 | .then(response => response.json())
114 | .then(fetchedData => {
115 | // Sort the data by node > position > name
116 | fetchedData.sort((a, b) => {
117 | if (a[5] === b[5]) {
118 | if (a[6] === b[6]) {
119 | return a[1].localeCompare(b[1]);
120 | }
121 | return a[6] - b[6];
122 | }
123 | return a[5] - b[5];
124 | });
125 |
126 | data = fetchedData;
127 | updateTable();
128 | });
129 |
130 | // Add event listener to the category input
131 | if (categoryInput) {
132 | categoryInput.addEventListener('input', updateTable);
133 | }
134 |
135 | if (nameInput) {
136 | nameInput.addEventListener('input', updateTable);
137 | }
138 | // // Initial table update
139 | // updateTable();
140 | });
141 |
142 | document.addEventListener('DOMContentLoaded', (event) => {
143 | const addItemDialog = document.getElementById('addItemDialog');
144 | const addItemDialogButton = document.getElementById('addItemDialogButton');
145 | const closeDialogButton = document.getElementById('closeDialog');
146 | const addItemForm = document.getElementById('addItemForm');
147 |
148 | const slotDialog = document.getElementById('slotDialog');
149 | const slotDialogButton = document.getElementById('slotDialogButton');
150 | const slotForm = document.getElementById('slotForm');
151 | const closeslotDialog = document.getElementById('closeslotDialog');
152 |
153 |
154 | if (addItemDialogButton && addItemDialog && closeDialogButton && addItemForm && slotDialog && slotDialogButton && slotForm && closeslotDialog) {
155 | addItemDialogButton.addEventListener('click', () => {
156 | addItemDialog.showModal();
157 | });
158 |
159 | slotDialogButton.addEventListener('click', () => {
160 | slotDialog.showModal();
161 | });
162 |
163 | closeDialogButton.addEventListener('click', () => {
164 | addItemDialog.close();
165 | });
166 |
167 | closeslotDialog.addEventListener('click', () => {
168 | slotDialog.close();
169 | });
170 |
171 | slotForm.addEventListener('submit', (event) => {
172 | event.preventDefault(); // Prevent the default form submission
173 |
174 | const formData = new FormData(slotForm);
175 | listSlots = [];
176 |
177 | console.log('Form Data:', formData);
178 |
179 | for (let i of formData.keys()) {
180 |
181 | if (formData.get(i) === 'on') {
182 |
183 | slot = i.replace('checkbox', '');
184 | // remove the checkbox from the string
185 | console.log(slot + formData.get(i));
186 | listSlots.push(slot);
187 | }
188 | // console.log( i + formData.get(i));
189 | }
190 | console.log(listSlots);
191 | slotDialog.close();
192 | });
193 |
194 | addItemForm.addEventListener('submit', (event) => {
195 | event.preventDefault(); // Prevent the default form submission
196 |
197 | const formData = new FormData(addItemForm);
198 |
199 | const expression = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/gi;
200 | const regex = new RegExp(expression);
201 | const t = formData.get('link');
202 | let link;
203 | if (t.match(regex)) {
204 | link = formData.get('link');
205 | } else {
206 | link = 'none';
207 | }
208 |
209 | const itemData = {
210 | name: formData.get('name'),
211 | description: formData.get('description'),
212 | category: capitalizeFirstLetter(formData.get('category')),
213 | quantity: parseInt(formData.get('quantity')),
214 | node: parseInt(formData.get('node')),
215 | position: parseInt(formData.get('position')),
216 | slots: listSlots,
217 | url: link
218 | };
219 |
220 | console.log('Form Data:', itemData);
221 |
222 | // You can now send the itemData to your server or process it as needed
223 | const options = {
224 | method: 'POST',
225 | headers: {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'},
226 | body: JSON.stringify(itemData)
227 | };
228 |
229 | fetch('http://'+ server+ ':5505/api/additem', options)
230 | .then(response => response.json())
231 | .then(data => {
232 | console.log('Success:', data);
233 | addItemDialog.close(); // Close the dialog after successful submission
234 | window.location.reload();
235 | })
236 | .catch((error) => {
237 | console.error('Error:', error);
238 | });
239 | });
240 | } else {
241 | console.error('One or more elements are not found in the DOM.');
242 | }
243 |
244 | });
245 |
246 | document.addEventListener('DOMContentLoaded', (event) => {
247 | function editItem(id){
248 | let listSlots = [];
249 | const editItemDialog = document.getElementById('editItemDialog');
250 | const closeEditDialogButton = document.getElementById('closeEditDialog');
251 | const editItemForm = document.getElementById('editItemForm');
252 |
253 | const slotDialog = document.getElementById('slotDialog');
254 | const editslotDialogButton = document.getElementById('editslotDialogButton');
255 | const slotForm = document.getElementById('slotForm');
256 | const closeslotDialog = document.getElementById('closeslotDialog');
257 |
258 | if (editItemDialog && closeEditDialogButton && editItemForm && slotDialog && editslotDialogButton && slotForm && closeslotDialog) {
259 | editItemDialog.showModal();
260 |
261 | editslotDialogButton.addEventListener('click', () => {
262 | slotDialog.showModal();
263 | checkboxesValues.forEach(slot => {
264 | slotForm.elements['checkbox' + slot].checked = true;
265 | });
266 | });
267 |
268 | closeEditDialogButton.addEventListener('click', () => {
269 | editItemDialog.close();
270 | });
271 |
272 | closeslotDialog.addEventListener('click', () => {
273 | slotDialog.close();
274 | });
275 |
276 |
277 | // set placeholder text to current values
278 | fetch('http://'+ server+ ':5505/api/list?id=' + id)
279 | .then(response => response.json())
280 | .then(data => {
281 |
282 | editItemForm.elements['editName'].placeholder = data[0][1];
283 | editItemForm.elements['editDescription'].placeholder = data[0][2];
284 | editItemForm.elements['editCategory'].placeholder = data[0][3];
285 | editItemForm.elements['editQuantity'].placeholder = data[0][4];
286 | editItemForm.elements['editNode'].placeholder = data[0][5];
287 | editItemForm.elements['editPosition'].placeholder = data[0][6];
288 | editItemForm.elements['editLink'].placeholder = data[0][7];
289 | checkboxesValues = data[0][8];
290 | })
291 | .catch(error => console.error('Error fetching data:', error));
292 |
293 |
294 | slotForm.addEventListener('submit', (event) => {
295 | const formData = new FormData(slotForm);
296 | listSlots = [];
297 |
298 | for (let i of formData.keys()) {
299 | if (formData.get(i) === 'on') {
300 | slot = i.replace('checkbox', '');
301 | listSlots.push(slot);
302 | }
303 | }
304 | // console.log(listSlots);
305 | slotDialog.close();
306 | });
307 |
308 |
309 |
310 | editItemForm.addEventListener('submit', (event) => {
311 | // event.preventDefault(); // Prevent the default form submission
312 |
313 | const formData = new FormData(editItemForm);
314 |
315 | // const expression = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/gi;
316 | // const regex = new RegExp(expression);
317 | // const t = formData.get('editLink');
318 | // let link;
319 |
320 | // if (t.match(regex)) {
321 | // link = formData.get('editLink');
322 | // } else {
323 | // link = 'none';
324 | // }
325 | // print(formData);
326 |
327 | const itemData = {
328 | id: id,
329 | name: formData.get('editName') !== '' ? formData.get('editName') : editItemForm.elements['editName'].placeholder,
330 | description: formData.get('editDescription') !== '' ? formData.get('editDescription') : editItemForm.elements['editDescription'].placeholder,
331 | category: formData.get('editCategory') !== '' ? capitalizeFirstLetter(formData.get('editCategory')) : capitalizeFirstLetter(editItemForm.elements['editCategory'].placeholder),
332 | quantity: formData.get('editQuantity') !== '' ? parseInt(formData.get('editQuantity')) : parseInt(editItemForm.elements['editQuantity'].placeholder),
333 | node: formData.get('editNode') !== '' ? parseInt(formData.get('editNode')) : parseInt(editItemForm.elements['editNode'].placeholder),
334 | position: formData.get('editPosition') !== '' ? parseInt(formData.get('editPosition')) : parseInt(editItemForm.elements['editPosition'].placeholder),
335 | slots: listSlots.length > 0 ? listSlots : checkboxesValues,
336 | url: formData.get('editLink') !== '' ? formData.get('editLink') : editItemForm.elements['editLink'].placeholder
337 | };
338 | // print(formData);
339 | // console.log(formData);
340 | // console.log(itemData);
341 | // console.log(formData.get('editName'))
342 | // console.log(JSON.stringify(itemData));
343 | // console.log(data);
344 | // print(itemData);
345 | // print(JSON.stringify(itemData));
346 | // console.log(itemData);
347 | const options = {
348 | method: 'POST',
349 | headers: {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'},
350 | body: JSON.stringify(itemData)
351 | };
352 | // console.log(options);
353 |
354 | // print('Success:', data);
355 |
356 | fetch('http://'+ server+ ':5505/api/edit', options)
357 | .then(response => response.json())
358 | .then(response => console.log(response))
359 | .catch(err => console.error(err));
360 | // print('Success:', data);
361 | editItemDialog.close(); // Close the dialog after successful submission
362 | window.location.reload();
363 |
364 |
365 | });
366 | } else {
367 | console.error('One or more elements are not found in the DOM.');
368 | console.log('editItemDialog:', editItemDialog);
369 | console.log('closeEditDialogButton:', closeEditDialogButton);
370 | console.log('editItemForm:', editItemForm);
371 | }
372 | }
373 |
374 | window.editItem = editItem;
375 | });
376 |
377 | function quantity_item(id, quantity){
378 | const options = {
379 | method: 'POST',
380 | headers: {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'},
381 | body: '{"id":' + id + ',"quantity":' + quantity + '}'
382 | };
383 |
384 | fetch('http://'+ server+ ':5505/api/quantity', options)
385 | .then(response => response.json())
386 | .then(response => console.log(response))
387 | .catch(err => console.error(err));
388 |
389 | }
390 |
391 | function locateItem(id){
392 | const options = {
393 | method: 'POST',
394 | headers: {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'},
395 | body: '{"id":' + id + '}'
396 | };
397 |
398 | fetch('http://'+ server+ ':5505/api/locate', options)
399 | .then(response => response.json())
400 | .then(response => console.log(response))
401 | .catch(err => console.error(err));
402 |
403 | }
404 |
405 |
406 | function deleteItem(id){
407 | const options = {
408 | method: 'POST',
409 | headers: {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'},
410 | body: '{"id":' + id + '}'
411 | };
412 |
413 | fetch('http://'+ server+ ':5505/api/delete', options)
414 | .then(response => response.json())
415 | .then(response => console.log(response))
416 | .catch(err => console.error(err));
417 | }
418 |
419 | function capitalizeFirstLetter(string) {
420 | if (!string) return string;
421 | return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
422 | }
423 |
424 |
--------------------------------------------------------------------------------
/Code/App/static/style.css:
--------------------------------------------------------------------------------
1 | /*//////////////////////////////////////////////////////////////////
2 | [ FONT ]*/
3 |
4 |
5 | @font-face {
6 | font-family: OpenSans-Regular;
7 | src: url('../static/Fonts/OpenSans-Regular.ttf');
8 | }
9 |
10 |
11 |
12 | /*//////////////////////////////////////////////////////////////////
13 | [ RESTYLE TAG ]*/
14 | * {
15 | margin: 0px;
16 | padding: 0px;
17 | box-sizing: border-box;
18 | }
19 |
20 | body, html {
21 | height: 100%;
22 | font-family: sans-serif;
23 | }
24 |
25 | /* ------------------------------------ */
26 | a {
27 | margin: 0px;
28 | transition: all 0.4s;
29 | -webkit-transition: all 0.4s;
30 | -o-transition: all 0.4s;
31 | -moz-transition: all 0.4s;
32 | }
33 |
34 | a:focus {
35 | outline: none !important;
36 | }
37 |
38 | a:hover {
39 | text-decoration: none;
40 | }
41 |
42 | /* ------------------------------------ */
43 | h1,h2,h3,h4,h5,h6 {margin: 0px;}
44 |
45 | p {margin: 0px;}
46 |
47 | ul, li {
48 | margin: 0px;
49 | list-style-type: none;
50 | }
51 |
52 |
53 | /* ------------------------------------ */
54 | input {
55 | display: block;
56 | outline: none;
57 | border: none !important;
58 | background-color: #cccccc;
59 | }
60 |
61 | textarea {
62 | display: block;
63 | outline: none;
64 | }
65 |
66 | textarea:focus, input:focus {
67 | border-color: transparent !important;
68 | }
69 |
70 | /* ------------------------------------ */
71 | /* button {
72 | outline: none !important;
73 | border:gray;
74 | background: transparent;
75 |
76 | } */
77 |
78 | /* button:hover {
79 | cursor: pointer;
80 | } */
81 |
82 |
83 |
84 | .topRight{
85 | position: fixed;
86 | top: 10px; /* Adjust the top value as needed */
87 | right: 10px; /* Adjust the right value as needed */
88 | margin-left: 10px; /* Add margin to separate the buttons */
89 | }
90 | iframe {
91 | border: none !important;
92 | }
93 |
94 | /* #centerpoint {
95 | top: 50%;
96 | left: 50%;
97 | align-self: center;
98 | position: absolute;
99 | align-content: center;
100 | transform: translate(-50%, -50%);
101 | } */
102 |
103 | /* #dialog {
104 | width: 600px;
105 |
106 | height: 400px;
107 | } */
108 | dialog {
109 | width: 30%;
110 | top: 50%;
111 | left: 50%;
112 | -webkit-transform: translateX(-50%) translateY(-50%);
113 | -moz-transform: translateX(-50%) translateY(-50%);
114 | -ms-transform: translateX(-50%) translateY(-50%);
115 | transform: translateX(-50%) translateY(-50%);
116 | }
117 |
118 | /*//////////////////////////////////////////////////////////////////
119 | [ Utiliti ]*/
120 |
121 |
122 | .topTable{
123 | color: #e8e6e3;
124 | }
125 |
126 | .topTableInput{
127 | color: #e8e6e3;
128 | background-color: #36304a;
129 | font-size: medium;
130 | font-weight: bold;
131 | }
132 |
133 |
134 | /*//////////////////////////////////////////////////////////////////
135 | [ Table ]*/
136 |
137 | .limiter {
138 | width: 100%;
139 | margin: 0 auto;
140 | }
141 |
142 | .container-table100 {
143 | width: 100%;
144 | min-height: 100vh;
145 | background: #c850c0;
146 | background: -webkit-linear-gradient(45deg, #4158d0, #c850c0);
147 | background: -o-linear-gradient(45deg, #4158d0, #c850c0);
148 | background: -moz-linear-gradient(45deg, #4158d0, #c850c0);
149 | background: linear-gradient(45deg, #4158d0, #c850c0);
150 |
151 | display: -webkit-box;
152 | display: -webkit-flex;
153 | display: -moz-box;
154 | display: -ms-flexbox;
155 | display: flex;
156 | align-items: center;
157 | justify-content: center;
158 | flex-wrap: wrap;
159 | padding: 33px 30px;
160 | }
161 |
162 | .wrap-table100 {
163 | width: 1170px;
164 | }
165 |
166 | table {
167 | border-spacing: 1;
168 | border-collapse: collapse;
169 | background: white;
170 | border-radius: 10px;
171 | overflow: hidden;
172 | width: 100%;
173 | margin: 0 auto;
174 | position: relative;
175 | }
176 | table * {
177 | position: relative;
178 | }
179 | table td, table th {
180 | padding-left: 8px;
181 | }
182 | table thead tr {
183 | height: 60px;
184 | background: #36304a;
185 | }
186 | table tbody tr {
187 | height: 50px;
188 | }
189 | table tbody tr:last-child {
190 | border: 0;
191 | }
192 | table td, table th {
193 | text-align: left;
194 | }
195 | table td.l, table th.l {
196 | text-align: right;
197 | }
198 | table td.c, table th.c {
199 | text-align: center;
200 | }
201 | table td.r, table th.r {
202 | text-align: center;
203 | }
204 |
205 |
206 | .table100-head th{
207 | font-family: OpenSans-Regular;
208 | font-size: 18px;
209 | color: #fff;
210 | line-height: 1.2;
211 | font-weight: unset;
212 | }
213 |
214 | tbody tr:nth-child(even) {
215 | background-color: #f5f5f5;
216 | }
217 |
218 | tbody tr {
219 | font-family: OpenSans-Regular;
220 | font-size: 15px;
221 | color: #808080;
222 | line-height: 1.2;
223 | font-weight: unset;
224 | }
225 |
226 | tbody tr:hover {
227 | color: #555555;
228 | background-color: #eeeeee;
229 | cursor: pointer;
230 | }
231 |
232 | /* tbody tr:nth-child(even):hover {
233 | color: #555555;
234 | background-color: #fff;
235 | cursor: pointer;
236 | } */
237 |
238 | .column1 {
239 | width: 260px;
240 | padding-left: 40px;
241 | }
242 |
243 | .column2 {
244 | width: 160px;
245 | }
246 |
247 | .column3 {
248 | width: 245px;
249 | }
250 |
251 | .column4 {
252 | width: 110px;
253 | text-align: right;
254 | }
255 |
256 | .column5 {
257 | width: 170px;
258 | text-align: right;
259 | }
260 |
261 | .column6 {
262 | width: 222px;
263 | text-align: right;
264 | padding-right: 62px;
265 | }
266 |
267 |
268 | @media screen and (max-width: 992px) {
269 | table {
270 | display: block;
271 | }
272 | table > *, table tr, table td, table th {
273 | display: block;
274 | }
275 | table thead {
276 | display: none;
277 | }
278 | table tbody tr {
279 | height: auto;
280 | padding: 37px 0;
281 | }
282 | table tbody tr td {
283 | padding-left: 40% !important;
284 | margin-bottom: 24px;
285 | }
286 | table tbody tr td:last-child {
287 | margin-bottom: 0;
288 | }
289 | table tbody tr td:before {
290 | font-family: OpenSans-Regular;
291 | font-size: 14px;
292 | color: #999999;
293 | line-height: 1.2;
294 | font-weight: unset;
295 | position: absolute;
296 | width: 40%;
297 | left: 30px;
298 | top: 0;
299 | }
300 | table tbody tr td:nth-child(1):before {
301 | content: "Name";
302 | }
303 | table tbody tr td:nth-child(2):before {
304 | content: "Description";
305 | }
306 | table tbody tr td:nth-child(3):before {
307 | content: "Category";
308 | }
309 | table tbody tr td:nth-child(4):before {
310 | content: "Quantity";
311 | }
312 | table tbody tr td:nth-child(5):before {
313 | content: "Node";
314 | }
315 | table tbody tr td:nth-child(6):before {
316 | content: "Position";
317 | }
318 | table tbody tr td:nth-child(7):before {
319 | content: "Delete";
320 | }
321 | table tbody tr td:nth-child(8):before {
322 | content: "Locate";
323 | }
324 | table tbody tr td:nth-child(9):before {
325 | content: "Edit";
326 | }
327 | .column4,
328 | .column5,
329 | .column6 {
330 | text-align: left;
331 | }
332 |
333 | .column4,
334 | .column5,
335 | .column6,
336 | .column1,
337 | .column2,
338 | .column3 {
339 | width: 100%;
340 | }
341 |
342 | tbody tr {
343 | font-size: 14px;
344 | }
345 | }
346 |
347 | @media (max-width: 576px) {
348 | .container-table100 {
349 | padding-left: 15px;
350 | padding-right: 15px;
351 | }
352 | }
353 |
354 | .slotGroup{
355 | border: 3px solid black; /* Thick border */
356 | margin-bottom: 10px; /* Optional: space between groups */
357 | }
--------------------------------------------------------------------------------
/Code/App/templates/index.html:
--------------------------------------------------------------------------------
1 |
64 |
65 |
66 |
67 |
68 | Inventory
69 |
70 |
71 |
72 |
73 |
74 | Item List
75 |
76 |
77 |
78 |
79 |
101 |
123 |
211 |
212 |
229 |
230 |
231 |
232 |
--------------------------------------------------------------------------------
/Code/Node/.gitignore:
--------------------------------------------------------------------------------
1 | .pio
2 | .vscode/.browse.c_cpp.db*
3 | .vscode/c_cpp_properties.json
4 | .vscode/launch.json
5 | .vscode/ipch
6 |
--------------------------------------------------------------------------------
/Code/Node/README.md:
--------------------------------------------------------------------------------
1 | Code for the ESP32
2 | ## Important
3 |
4 | Make sure to configure the include/.env file correctly
--------------------------------------------------------------------------------
/Code/Node/include/.env.template:
--------------------------------------------------------------------------------
1 | const char* ssid = "";
2 | const char* password = "";
3 |
4 | const char* server_IP = "";
5 | const int server_port = 5505;
6 |
7 | const int node = 1;
8 | const int slots = 64;
--------------------------------------------------------------------------------
/Code/Node/include/README:
--------------------------------------------------------------------------------
1 | copy `.env.template` to `.env`
--------------------------------------------------------------------------------
/Code/Node/platformio.ini:
--------------------------------------------------------------------------------
1 | ; PlatformIO Project Configuration File
2 | ;
3 | ; Build options: build flags, source filter
4 | ; Upload options: custom upload port, speed and extra flags
5 | ; Library options: dependencies, extra library storages
6 | ; Advanced options: extra scripting
7 | ;
8 | ; Please visit documentation for the other options and examples
9 | ; https://docs.platformio.org/page/projectconf.html
10 |
11 | [env:NodeStorageSystem]
12 | platform = espressif32
13 | board = esp32doit-devkit-v1
14 | framework = arduino
15 | lib_deps =
16 | adafruit/Adafruit NeoPixel@^1.12.3
17 | bblanchon/ArduinoJson@^7.2.0
18 | upload_speed = 921600
19 | monitor_speed = 115200
20 |
--------------------------------------------------------------------------------
/Code/Node/src/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 |
8 | #include <.env>
9 |
10 | Adafruit_NeoPixel strip = Adafruit_NeoPixel(positions, 15, NEO_GRB + NEO_KHZ800);
11 | Adafruit_NeoPixel slotLed = Adafruit_NeoPixel(16, 4, NEO_GRB + NEO_KHZ800);
12 | WebServer server(4444);
13 |
14 | const size_t capacity = JSON_OBJECT_SIZE(10) + 200;
15 | StaticJsonDocument jsonDocument;
16 |
17 | char buffer[1024];
18 |
19 | void locate(int position, JsonArray slotArray)
20 | {
21 | position = position - 1;
22 |
23 | if (position < 0 || position >= positions)
24 | {
25 | Serial.println("Invalid position");
26 | server.send(400, "text/plain", "Invalid position");
27 | return;
28 | }
29 | else
30 | {
31 | server.send(200, "application/json", "{\"success\": true}");
32 |
33 | Serial.println("Locating position " + String(position));
34 | strip.clear();
35 | strip.setPixelColor(position, strip.Color(5, 5, 5));
36 | strip.show();
37 | String slotArrayStr;
38 | serializeJson(slotArray, slotArrayStr);
39 | Serial.println("Locating slots " + slotArrayStr);
40 | for (size_t i = 0; i < slotArray.size(); i++)
41 | {
42 | slotLed.setPixelColor(slotArray[i].as() - 1, slotLed.Color(5, 5, 5));
43 | }
44 | slotLed.show();
45 |
46 | delay(5505);
47 | strip.clear();
48 | strip.show();
49 | slotLed.clear();
50 | slotLed.show();
51 | }
52 | }
53 |
54 | void handlePost()
55 | {
56 | Serial.println("POST request received");
57 | if (server.hasArg("plain") == false)
58 | {
59 | server.send(400, "text/plain", "Payload not found");
60 | return;
61 | }
62 |
63 | Serial.println("Payload found");
64 | String payload = server.arg("plain");
65 | deserializeJson(jsonDocument, payload);
66 | Serial.println("Deserialized JSON");
67 | Serial.println(payload);
68 |
69 | int position = jsonDocument["position"];
70 | JsonArray slotJsonArray = jsonDocument["slot"].as();
71 | int slotArray[slotJsonArray.size()];
72 | for (size_t i = 0; i < slotJsonArray.size(); i++)
73 | {
74 | slotArray[i] = slotJsonArray[i];
75 | }
76 |
77 | Serial.println(jsonDocument["position"].as());
78 | for (size_t i = 0; i < slotJsonArray.size(); i++)
79 | {
80 | Serial.println(slotArray[i]);
81 | }
82 |
83 | locate(position, slotJsonArray);
84 | }
85 |
86 | void setupServer()
87 | {
88 | Serial.println("Setting up server");
89 | server.on("/locate", HTTP_POST, handlePost);
90 | server.begin();
91 | Serial.println("Server started");
92 | }
93 |
94 | void setup()
95 | {
96 | Serial.begin(115200);
97 | delay(1000);
98 | Serial.println("Hello World");
99 |
100 | strip.begin();
101 |
102 | WiFi.begin(ssid, password);
103 |
104 | while (WiFi.status() != WL_CONNECTED)
105 | {
106 | delay(1000);
107 | Serial.println("Connecting to WiFi...");
108 | }
109 |
110 | Serial.println("Connected to WiFi");
111 |
112 | Serial.println(WiFi.localIP());
113 | delay(1000);
114 |
115 | String nodeInfo = "{\"id\": " + String(node) + ", \"ip\": \"" + WiFi.localIP().toString() + "\", \"positions\": " + String(positions) + "}";
116 | if (WiFi.status() == WL_CONNECTED)
117 | {
118 | HTTPClient http;
119 | http.begin("http://" + String(server_IP) + ":" + String(server_port) + "/api/addnode");
120 | http.addHeader("Content-Type", "application/json");
121 | int httpCode = http.POST(nodeInfo);
122 | if (httpCode > 0)
123 | {
124 | String payload = http.getString();
125 | Serial.println(payload);
126 | http.end();
127 |
128 | JsonDocument doc;
129 | DeserializationError error = deserializeJson(doc, payload);
130 |
131 | if (!error)
132 | {
133 | bool success = doc["success"];
134 | if (success)
135 | {
136 | Serial.println("Node added successfully");
137 | }
138 | else
139 | {
140 | Serial.println("Check logs. Possible error in adding node");
141 | // while (true)
142 | // {
143 | // Serial.println(payload);
144 | // strip.fill(strip.Color(255, 0, 0), 0, positions);
145 | // strip.show();
146 | // delay(500);
147 | // strip.fill(strip.Color(0, 0, 0), 0, positions);
148 | // strip.show();
149 | // delay(500);
150 | // }
151 | }
152 | }
153 | else
154 | {
155 | Serial.println("Failed to parse JSON response");
156 | }
157 | }
158 | else
159 | {
160 | Serial.println("HTTP request failed");
161 | }
162 | }
163 | else
164 | {
165 | Serial.println("WiFi not connected");
166 | }
167 |
168 | setupServer();
169 | }
170 |
171 | void loop()
172 | {
173 | server.handleClient();
174 | }
175 |
--------------------------------------------------------------------------------
/Code/Server/README.md:
--------------------------------------------------------------------------------
1 | Api part of the storage manager
2 |
3 | [x] DB
4 | [x] List
5 | [x] Add
6 | [x] Rm
7 | [x] Edit
8 | [x] Locate
9 | [x] Quantity
10 | [x] Move
--------------------------------------------------------------------------------
/Code/Server/main.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request, json, Response, jsonify
2 | from flask_cors import CORS
3 |
4 | import requests
5 |
6 | import sqlite3
7 |
8 |
9 | api = Flask(__name__)
10 | CORS(api, resources={r"/*": {"origins": "*"}})
11 | # api_list = [
12 | # {
13 | # "name": "screw m3",
14 | # "description": "item1 description",
15 | # "category": "screw",
16 | # "quantity": 1,
17 | # "node": 1,
18 | # "position": 1,
19 | # "url": "url1"
20 | # },
21 | # {
22 | # "name": "screw m4",
23 | # "description": "item1 description",
24 | # "category": "screw",
25 | # "quantity": 1,
26 | # "node": 2,
27 | # "position": 2,
28 | # "url": "url1"
29 | # },
30 | # {
31 | # "name": "Tesa Tape",
32 | # "description": "item2 description",
33 | # "category": "tape",
34 | # "quantity": 5,
35 | # "node": 2,
36 | # "position": 3,
37 | # "url": "ima5555"
38 | # "slots": "1, 2, 3, 4"
39 | # }
40 | # ]
41 |
42 | # DB structure item, description, category, quantity, node, position, url (optional)
43 |
44 |
45 | ## Possible way: add to Storage table 16 slots and true if there, false if not. Messy but could work
46 |
47 | def init_db():
48 | conn = sqlite3.connect('database.db')
49 | c = conn.cursor()
50 | c.execute("""CREATE TABLE IF NOT EXISTS Storage(
51 | id INTEGER PRIMARY KEY AUTOINCREMENT,
52 | item TEXT,
53 | description TEXT,
54 | category TEXT,
55 | quantity INTEGER,
56 | node INTEGER,
57 | position INTEGER,
58 | url TEXT,
59 | slot TEXT)""")
60 |
61 | conn.commit()
62 |
63 | c.execute("""CREATE TABLE IF NOT EXISTS Nodes(
64 | id INTEGER PRIMARY KEY,
65 | ip TEXT,
66 | positions INTEGER)""")
67 | conn.commit()
68 |
69 | # c.execute("""CREATE TABLE IF NOT EXISTS listpositions(
70 | # 1 INTEGER,
71 | # 2 INTEGER,
72 | # 3 INTEGER,
73 | # 4 INTEGER,
74 | # 5 INTEGER,
75 | # 6 INTEGER,
76 | # 7 INTEGER,
77 | # 8 INTEGER,
78 | # 9 INTEGER,
79 | # 10 INTEGER,
80 | # 11 INTEGER,
81 | # 12 INTEGER,
82 | # 13 INTEGER,
83 | # 14 INTEGER,
84 | # 15 INTEGER,
85 | # 16 INTEGER""")
86 | # )
87 | conn.close()
88 |
89 | def listStorage():
90 | conn = sqlite3.connect('database.db')
91 | c = conn.cursor()
92 | c.execute("SELECT * FROM Storage")
93 | items = c.fetchall()
94 | conn.close()
95 | return items
96 |
97 | def listNodes():
98 | conn = sqlite3.connect('database.db')
99 | c = conn.cursor()
100 | c.execute("SELECT * FROM Nodes")
101 | items = c.fetchall()
102 | conn.close()
103 | return items
104 |
105 | @api.route('/api', methods=['GET'])
106 | def get_api():
107 | return "This is not an api call, to view the avaliable api calls, please visit https://github.com/Pegoku/StorageSystem/blob/master/README.md#api-endpoints"
108 |
109 |
110 | @api.route('/api/list', methods=['GET'])
111 | def get_list():
112 | storage = listStorage()
113 |
114 | category = request.args.get('category')
115 | node = request.args.get('node')
116 | position = request.args.get('position')
117 | id = request.args.get('id')
118 | if category:
119 | storage = [item for item in storage if item[3] == category]
120 | # categories = [cat.strip() for cat in category.split(',')]
121 | # storage = [item for item in storage if item[3] in categories]
122 | if node:
123 | try:
124 | node = int(node)
125 | storage = [item for item in storage if item[5] == node]
126 | except ValueError:
127 | return json.jsonify({"error": "Invalid node value"})
128 | if position:
129 | try:
130 | position = int(position)
131 | storage = [item for item in storage if item[6] == position]
132 | except ValueError:
133 | return json.jsonify({"error": "Invalid position value"})
134 | if id:
135 | try:
136 | id = int(id)
137 | storage = [item for item in storage if item[0] == id]
138 | except ValueError:
139 | return json.jsonify({"error": "Invalid id value"})
140 |
141 | # print(storage) # [(1, 'aaa', '22', 'screw', 50, 1, 5, 'https://pegoku.com', '1, 2, 9, 10'), (2, 'bbbb', '33', 'screw', 50, 1, 6, 'https://pegoku.com', '1, 2, 5, 6')]
142 | storageTemp = []
143 | # print(storage)
144 | for item in storage:
145 | item = list(item)
146 | # print(item)
147 | if item[8] != "":
148 | item[8] = list(map(int, item[8].split(', ')))
149 | item = tuple(item)
150 | storageTemp.append(item)
151 | storage = storageTemp
152 | # print (storage)
153 | return json.jsonify(storage)
154 |
155 | @api.route('/api/locateget', methods=['GET'])
156 | def locate_get_item():
157 | # id = request.args.get('id')
158 |
159 | try:
160 | id = int(request.args.get('id'))
161 | except (TypeError, ValueError):
162 | return jsonify({"error": "id must be an integer"})
163 |
164 |
165 | if not id:
166 | return json.jsonify({"error": "id is required"})
167 | else:
168 | storage = listStorage()
169 | if not any(i[0] == id for i in storage):
170 | return json.jsonify({"error": "Item with id not found"})
171 | conn = sqlite3.connect('database.db')
172 | c = conn.cursor()
173 | c.execute("SELECT node, position FROM Storage WHERE id = ?", (id,))
174 | location = c.fetchone()
175 | # conn.close()
176 | node = location[0]
177 | position = location[1]
178 |
179 | c.execute("SELECT ip FROM Nodes WHERE id = ?", (node,))
180 | ip = c.fetchone()[0]
181 | conn.close()
182 |
183 | url = "http://" + ip + ":4444/locate"
184 |
185 | payload = {"position": position}
186 | headers = {'Content-Type': 'application/json'}
187 |
188 | nodeResponse = requests.post(url, data=json.dumps(payload), headers=headers)
189 |
190 | if nodeResponse.status_code == 200:
191 | return json.jsonify({"success": True})
192 | else:
193 | return json.jsonify({"error": True})
194 |
195 | @api.route('/api/additem', methods=['POST'])
196 | def add_item():
197 | item = request.json
198 | conn = sqlite3.connect('database.db')
199 | c = conn.cursor()
200 |
201 | # Convert [a, b, c, d] to "a, b, c, d"
202 | slots = ', '.join([str(i) for i in item['slots']])
203 |
204 | if 'name' not in item:
205 | return json.jsonify({"error": "name is required"})
206 | if 'description' not in item:
207 | return json.jsonify({"error": "description is required"})
208 | if 'category' not in item:
209 | return json.jsonify({"error": "category is required"})
210 | if 'quantity' not in item:
211 | return json.jsonify({"error": "quantity is required"})
212 | if 'node' not in item:
213 | return json.jsonify({"error": "node is required"})
214 | if 'position' not in item:
215 | return json.jsonify({"error": "position is required"})
216 | if 'slots' not in item:
217 | return json.jsonify({"error": "slots is required"})
218 |
219 |
220 |
221 | if item['url'] == '' or item['url'] == 'null' or 'url' not in item:
222 | item['url'] = None
223 |
224 | c.execute("INSERT INTO Storage (item, description, category, quantity, node, position, url, slot) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
225 | (item['name'], item['description'], item['category'], item['quantity'], item['node'], item['position'], item['url'], slots))
226 | conn.commit()
227 | conn.close()
228 | return json.jsonify({"success": True})
229 |
230 | @api.route('/api/addnode', methods=['POST'])
231 | def add_node():
232 | item = request.json
233 | if 'id' not in item:
234 | return json.jsonify({"error": "id is required"})
235 | if 'ip' not in item:
236 | return json.jsonify({"error": "ip is required"})
237 | if 'positions' not in item:
238 | return json.jsonify({"error": "positions is required"})
239 | try:
240 | item['id'] = int(item['id'])
241 | item['positions'] = int(item['positions'])
242 | except ValueError:
243 | return json.jsonify({"error": "Invalid id or positions value"})
244 |
245 | nodes = listNodes()
246 |
247 | if any(i[0] == item['id'] for i in nodes):
248 | conn = sqlite3.connect('database.db')
249 | c = conn.cursor()
250 | c.execute("UPDATE Nodes set ip = ?, positions = ? WHERE id = ?",
251 | (item['ip'], item['positions'], item['id']))
252 | conn.commit()
253 | conn.close()
254 | return json.jsonify({"warning": "Item with id already exists, updated anyway"})
255 |
256 | conn = sqlite3.connect('database.db')
257 | c = conn.cursor()
258 | c.execute("INSERT INTO Nodes (id, ip, positions) VALUES (?, ?, ?)",
259 | (item['id'], item['ip'], item['positions']))
260 | conn.commit()
261 | conn.close()
262 | return json.jsonify({"success": True})
263 |
264 | @api.route('/api/delete', methods=['POST'])
265 | def delete_item():
266 | item = request.json
267 | if 'id' not in item:
268 | return json.jsonify({"error": "id is required"})
269 | else:
270 | storage = listStorage()
271 | if not any(i[0] == item['id'] for i in storage):
272 | return json.jsonify({"error": "Item with id not found"})
273 | conn = sqlite3.connect('database.db')
274 | c = conn.cursor()
275 | c.execute("DELETE FROM Storage WHERE id = ?", (item['id'],))
276 | conn.commit()
277 | conn.close()
278 | return json.jsonify({"success": True})
279 |
280 | @api.route('/api/edit', methods=['POST'])
281 | def edit_item():
282 | item = request.json
283 |
284 | slots = ', '.join([str(i) for i in item['slots']])
285 |
286 | if 'id' not in item:
287 | return json.jsonify({"error": "id is required"})
288 | else:
289 | storage = listStorage()
290 | if not any(i[0] == item['id'] for i in storage):
291 | return json.jsonify({"error": "Item with id not found"})
292 | conn = sqlite3.connect('database.db')
293 | c = conn.cursor()
294 | c.execute("UPDATE Storage SET item = ?, description = ?, category = ?, quantity = ?, node = ?, position = ?, url = ?, slot = ? WHERE id = ?",
295 | (item['name'], item['description'], item['category'], item['quantity'], item['node'], item['position'], item['url'], slots, item['id']))
296 | conn.commit()
297 | conn.close()
298 | return json.jsonify({"success": True})
299 |
300 | @api.route('/api/quantity', methods=['POST'])
301 | def quantity_item():
302 | item = request.json
303 | if 'id' not in item:
304 | return json.jsonify({"error": "id is required"})
305 | if 'quantity' not in item:
306 | return json.jsonify({"error": "quantity is required"})
307 | try:
308 | item['quantity'] = int(item['quantity'])
309 | except ValueError:
310 | return json.jsonify({"error": "Invalid quantity value"})
311 | else:
312 | storage = listStorage()
313 | if not any(i[0] == item['id'] for i in storage):
314 | return json.jsonify({"error": "Item with id not found"})
315 | conn = sqlite3.connect('database.db')
316 | c = conn.cursor()
317 | c.execute("UPDATE Storage SET quantity = ? WHERE id = ?", (item['quantity'], item['id']))
318 | conn.commit()
319 | conn.close()
320 | return json.jsonify({"success": True})
321 |
322 | @api.route('/api/move', methods=['POST'])
323 | def move_item():
324 | item = request
325 | if 'id' not in item:
326 | return json.jsonify({"error": "id is required"})
327 | if 'node' not in item:
328 | return json.jsonify({"error": "node is required"})
329 | if 'position' not in item:
330 | return json.jsonify({"error": "position is required"})
331 | try:
332 | item['node'] = int(item['node'])
333 | item['position'] = int(item['position'])
334 | except ValueError:
335 | return json.jsonify({"error": "Invalid node or position value"})
336 | else:
337 | storage = listStorage()
338 | if not any(i[0] == item['id'] for i in storage):
339 | return json.jsonify({"error": "Item with id not found"})
340 | conn = sqlite3.connect('database.db')
341 | c = conn.cursor()
342 | c.execute("UPDATE Storage SET node = ?, position = ? WHERE id = ?", (item['node'], item['position'], item['id']))
343 | conn.commit()
344 | conn.close()
345 | return json.jsonify({"success": True})
346 |
347 | @api.route('/api/nodes', methods=['GET'])
348 | def get_nodes():
349 | nodes = listNodes()
350 |
351 | if request.args.get('id'):
352 | try:
353 | id = int(request.args.get('id'))
354 | nodes = [node for node in nodes if node[0] == id]
355 | except ValueError:
356 | return json.jsonify({"error": "Invalid id value"})
357 | return json.jsonify(nodes)
358 |
359 | @api.route('/api/locate' , methods=['POST'])
360 | def locate_item():
361 | item = request.json
362 | if 'id' not in item:
363 | return json.jsonify({"error": "id is required"})
364 | else:
365 | storage = listStorage()
366 | if not any(i[0] == item['id'] for i in storage):
367 | return json.jsonify({"error": "Item with id not found"})
368 | conn = sqlite3.connect('database.db')
369 | c = conn.cursor()
370 | c.execute("SELECT node, position, slot FROM Storage WHERE id = ?", (item['id'],))
371 | location = c.fetchone()
372 | # conn.close()
373 | node = location[0]
374 | position = location[1]
375 | if location[2] != "":
376 | slot = list(map(int, location[2].split(', ')))
377 | else:
378 | slot = []
379 |
380 | c.execute("SELECT ip FROM Nodes WHERE id = ?", (node,))
381 | ip = c.fetchone()[0]
382 | conn.close()
383 |
384 | url = "http://" + ip + ":4444/locate"
385 |
386 | payload = {"position": position, "slot": slot}
387 | headers = {'Content-Type': 'application/json'}
388 |
389 | nodeResponse = requests.post(url, data=json.dumps(payload), headers=headers)
390 |
391 | if nodeResponse.status_code == 200:
392 | return json.jsonify({"success": True})
393 | else:
394 | return json.jsonify({"error": True})
395 | # return json.jsonify({"node": location[0], "position": location[1]})
396 |
397 | # @api.route('/api/displaySlots', methods=['POST'])
398 | # def display_slots():
399 | # item = requests.json
400 | # if 'id' not in item:
401 | # return json.jsonify({"error": "id is required"})
402 |
403 |
404 | if __name__ == '__main__':
405 | init_db()
406 | api.run(debug=True, host='0.0.0.0', port=5505)
--------------------------------------------------------------------------------
/Code/Server/requirements.txt:
--------------------------------------------------------------------------------
1 | blinker==1.8.2
2 | certifi==2024.8.30
3 | charset-normalizer==3.4.0
4 | click==8.1.7
5 | Flask==3.0.3
6 | Flask-Cors==5.0.0
7 | idna==3.10
8 | itsdangerous==2.2.0
9 | Jinja2==3.1.4
10 | MarkupSafe==3.0.2
11 | requests==2.32.3
12 | urllib3==2.2.3
13 | Werkzeug==3.1.2
14 |
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_003129.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_003129.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_003805.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_003805.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_004612.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_004612.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_005528.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_005528.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_010103.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-02_010103.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-03_101610.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-03_101610.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators-backups/Indicators-2024-11-03_102349.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/Indicators-backups/Indicators-2024-11-03_102349.zip
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators.kicad_prl:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "active_layer": 0,
4 | "active_layer_preset": "All Layers",
5 | "auto_track_width": true,
6 | "hidden_netclasses": [],
7 | "hidden_nets": [],
8 | "high_contrast_mode": 0,
9 | "net_color_mode": 1,
10 | "opacity": {
11 | "images": 0.6,
12 | "pads": 1.0,
13 | "shapes": 1.0,
14 | "tracks": 1.0,
15 | "vias": 1.0,
16 | "zones": 0.6
17 | },
18 | "selection_filter": {
19 | "dimensions": true,
20 | "footprints": true,
21 | "graphics": true,
22 | "keepouts": true,
23 | "lockedItems": false,
24 | "otherItems": true,
25 | "pads": true,
26 | "text": true,
27 | "tracks": true,
28 | "vias": true,
29 | "zones": true
30 | },
31 | "visible_items": [
32 | 0,
33 | 1,
34 | 2,
35 | 3,
36 | 4,
37 | 5,
38 | 8,
39 | 9,
40 | 10,
41 | 11,
42 | 12,
43 | 13,
44 | 15,
45 | 16,
46 | 17,
47 | 18,
48 | 19,
49 | 20,
50 | 21,
51 | 22,
52 | 23,
53 | 24,
54 | 25,
55 | 26,
56 | 27,
57 | 28,
58 | 29,
59 | 30,
60 | 32,
61 | 33,
62 | 34,
63 | 35,
64 | 36,
65 | 39,
66 | 40,
67 | 41
68 | ],
69 | "visible_layers": "0fffffff_ffffffff",
70 | "zone_display_mode": 0
71 | },
72 | "git": {
73 | "repo_password": "",
74 | "repo_type": "",
75 | "repo_username": "",
76 | "ssh_key": ""
77 | },
78 | "meta": {
79 | "filename": "Indicators.kicad_prl",
80 | "version": 4
81 | },
82 | "net_inspector_panel": {
83 | "col_hidden": [],
84 | "col_order": [],
85 | "col_widths": [],
86 | "custom_group_rules": [],
87 | "expanded_rows": [],
88 | "filter_by_net_name": true,
89 | "filter_by_netclass": true,
90 | "filter_text": "",
91 | "group_by_constraint": false,
92 | "group_by_netclass": false,
93 | "show_unconnected_nets": false,
94 | "show_zero_pad_nets": false,
95 | "sort_ascending": true,
96 | "sorting_column": -1
97 | },
98 | "project": {
99 | "files": []
100 | },
101 | "schematic": {
102 | "selection_filter": {
103 | "graphics": true,
104 | "images": true,
105 | "labels": true,
106 | "lockedItems": false,
107 | "otherItems": true,
108 | "pins": true,
109 | "symbols": true,
110 | "text": true,
111 | "wires": true
112 | }
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators.kicad_pro:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "3dviewports": [],
4 | "design_settings": {
5 | "defaults": {
6 | "apply_defaults_to_fp_fields": false,
7 | "apply_defaults_to_fp_shapes": false,
8 | "apply_defaults_to_fp_text": false,
9 | "board_outline_line_width": 0.05,
10 | "copper_line_width": 0.2,
11 | "copper_text_italic": false,
12 | "copper_text_size_h": 1.5,
13 | "copper_text_size_v": 1.5,
14 | "copper_text_thickness": 0.3,
15 | "copper_text_upright": false,
16 | "courtyard_line_width": 0.05,
17 | "dimension_precision": 4,
18 | "dimension_units": 3,
19 | "dimensions": {
20 | "arrow_length": 1270000,
21 | "extension_offset": 550500,
22 | "keep_text_aligned": true,
23 | "suppress_zeroes": false,
24 | "text_position": 0,
25 | "units_format": 1
26 | },
27 | "fab_line_width": 0.1,
28 | "fab_text_italic": false,
29 | "fab_text_size_h": 1.0,
30 | "fab_text_size_v": 1.0,
31 | "fab_text_thickness": 0.15,
32 | "fab_text_upright": false,
33 | "other_line_width": 0.1,
34 | "other_text_italic": false,
35 | "other_text_size_h": 1.0,
36 | "other_text_size_v": 1.0,
37 | "other_text_thickness": 0.15,
38 | "other_text_upright": false,
39 | "pads": {
40 | "drill": 0.762,
41 | "height": 1.524,
42 | "width": 1.524
43 | },
44 | "silk_line_width": 0.1,
45 | "silk_text_italic": false,
46 | "silk_text_size_h": 1.0,
47 | "silk_text_size_v": 1.0,
48 | "silk_text_thickness": 0.1,
49 | "silk_text_upright": false,
50 | "zones": {
51 | "min_clearance": 0.5
52 | }
53 | },
54 | "diff_pair_dimensions": [
55 | {
56 | "gap": 0.0,
57 | "via_gap": 0.0,
58 | "width": 0.0
59 | }
60 | ],
61 | "drc_exclusions": [],
62 | "meta": {
63 | "version": 2
64 | },
65 | "rule_severities": {
66 | "annular_width": "error",
67 | "clearance": "error",
68 | "connection_width": "warning",
69 | "copper_edge_clearance": "error",
70 | "copper_sliver": "warning",
71 | "courtyards_overlap": "error",
72 | "diff_pair_gap_out_of_range": "error",
73 | "diff_pair_uncoupled_length_too_long": "error",
74 | "drill_out_of_range": "error",
75 | "duplicate_footprints": "warning",
76 | "extra_footprint": "warning",
77 | "footprint": "error",
78 | "footprint_symbol_mismatch": "warning",
79 | "footprint_type_mismatch": "ignore",
80 | "hole_clearance": "error",
81 | "hole_near_hole": "error",
82 | "holes_co_located": "warning",
83 | "invalid_outline": "error",
84 | "isolated_copper": "warning",
85 | "item_on_disabled_layer": "error",
86 | "items_not_allowed": "error",
87 | "length_out_of_range": "error",
88 | "lib_footprint_issues": "warning",
89 | "lib_footprint_mismatch": "warning",
90 | "malformed_courtyard": "error",
91 | "microvia_drill_out_of_range": "error",
92 | "missing_courtyard": "ignore",
93 | "missing_footprint": "warning",
94 | "net_conflict": "warning",
95 | "npth_inside_courtyard": "ignore",
96 | "padstack": "warning",
97 | "pth_inside_courtyard": "ignore",
98 | "shorting_items": "error",
99 | "silk_edge_clearance": "warning",
100 | "silk_over_copper": "warning",
101 | "silk_overlap": "warning",
102 | "skew_out_of_range": "error",
103 | "solder_mask_bridge": "error",
104 | "starved_thermal": "error",
105 | "text_height": "warning",
106 | "text_thickness": "warning",
107 | "through_hole_pad_without_hole": "error",
108 | "too_many_vias": "error",
109 | "track_dangling": "warning",
110 | "track_width": "error",
111 | "tracks_crossing": "error",
112 | "unconnected_items": "error",
113 | "unresolved_variable": "error",
114 | "via_dangling": "warning",
115 | "zones_intersect": "error"
116 | },
117 | "rules": {
118 | "max_error": 0.005,
119 | "min_clearance": 0.0,
120 | "min_connection": 0.0,
121 | "min_copper_edge_clearance": 0.5,
122 | "min_hole_clearance": 0.25,
123 | "min_hole_to_hole": 0.25,
124 | "min_microvia_diameter": 0.2,
125 | "min_microvia_drill": 0.1,
126 | "min_resolved_spokes": 2,
127 | "min_silk_clearance": 0.0,
128 | "min_text_height": 0.8,
129 | "min_text_thickness": 0.08,
130 | "min_through_hole_diameter": 0.3,
131 | "min_track_width": 0.0,
132 | "min_via_annular_width": 0.1,
133 | "min_via_diameter": 0.5,
134 | "solder_mask_to_copper_clearance": 0.005,
135 | "use_height_for_length_calcs": true
136 | },
137 | "teardrop_options": [
138 | {
139 | "td_onpadsmd": true,
140 | "td_onroundshapesonly": false,
141 | "td_ontrackend": false,
142 | "td_onviapad": true
143 | }
144 | ],
145 | "teardrop_parameters": [
146 | {
147 | "td_allow_use_two_tracks": true,
148 | "td_curve_segcount": 0,
149 | "td_height_ratio": 1.0,
150 | "td_length_ratio": 0.5,
151 | "td_maxheight": 2.0,
152 | "td_maxlen": 1.0,
153 | "td_on_pad_in_zone": false,
154 | "td_target_name": "td_round_shape",
155 | "td_width_to_size_filter_ratio": 0.9
156 | },
157 | {
158 | "td_allow_use_two_tracks": true,
159 | "td_curve_segcount": 0,
160 | "td_height_ratio": 1.0,
161 | "td_length_ratio": 0.5,
162 | "td_maxheight": 2.0,
163 | "td_maxlen": 1.0,
164 | "td_on_pad_in_zone": false,
165 | "td_target_name": "td_rect_shape",
166 | "td_width_to_size_filter_ratio": 0.9
167 | },
168 | {
169 | "td_allow_use_two_tracks": true,
170 | "td_curve_segcount": 0,
171 | "td_height_ratio": 1.0,
172 | "td_length_ratio": 0.5,
173 | "td_maxheight": 2.0,
174 | "td_maxlen": 1.0,
175 | "td_on_pad_in_zone": false,
176 | "td_target_name": "td_track_end",
177 | "td_width_to_size_filter_ratio": 0.9
178 | }
179 | ],
180 | "track_widths": [
181 | 0.0,
182 | 1.5
183 | ],
184 | "tuning_pattern_settings": {
185 | "diff_pair_defaults": {
186 | "corner_radius_percentage": 80,
187 | "corner_style": 1,
188 | "max_amplitude": 1.0,
189 | "min_amplitude": 0.2,
190 | "single_sided": false,
191 | "spacing": 1.0
192 | },
193 | "diff_pair_skew_defaults": {
194 | "corner_radius_percentage": 80,
195 | "corner_style": 1,
196 | "max_amplitude": 1.0,
197 | "min_amplitude": 0.2,
198 | "single_sided": false,
199 | "spacing": 0.6
200 | },
201 | "single_track_defaults": {
202 | "corner_radius_percentage": 80,
203 | "corner_style": 1,
204 | "max_amplitude": 1.0,
205 | "min_amplitude": 0.2,
206 | "single_sided": false,
207 | "spacing": 0.6
208 | }
209 | },
210 | "via_dimensions": [
211 | {
212 | "diameter": 0.0,
213 | "drill": 0.0
214 | }
215 | ],
216 | "zones_allow_external_fillets": false
217 | },
218 | "ipc2581": {
219 | "dist": "",
220 | "distpn": "",
221 | "internal_id": "",
222 | "mfg": "",
223 | "mpn": ""
224 | },
225 | "layer_pairs": [],
226 | "layer_presets": [],
227 | "viewports": []
228 | },
229 | "boards": [],
230 | "cvpcb": {
231 | "equivalence_files": []
232 | },
233 | "erc": {
234 | "erc_exclusions": [],
235 | "meta": {
236 | "version": 0
237 | },
238 | "pin_map": [
239 | [
240 | 0,
241 | 0,
242 | 0,
243 | 0,
244 | 0,
245 | 0,
246 | 1,
247 | 0,
248 | 0,
249 | 0,
250 | 0,
251 | 2
252 | ],
253 | [
254 | 0,
255 | 2,
256 | 0,
257 | 1,
258 | 0,
259 | 0,
260 | 1,
261 | 0,
262 | 2,
263 | 2,
264 | 2,
265 | 2
266 | ],
267 | [
268 | 0,
269 | 0,
270 | 0,
271 | 0,
272 | 0,
273 | 0,
274 | 1,
275 | 0,
276 | 1,
277 | 0,
278 | 1,
279 | 2
280 | ],
281 | [
282 | 0,
283 | 1,
284 | 0,
285 | 0,
286 | 0,
287 | 0,
288 | 1,
289 | 1,
290 | 2,
291 | 1,
292 | 1,
293 | 2
294 | ],
295 | [
296 | 0,
297 | 0,
298 | 0,
299 | 0,
300 | 0,
301 | 0,
302 | 1,
303 | 0,
304 | 0,
305 | 0,
306 | 0,
307 | 2
308 | ],
309 | [
310 | 0,
311 | 0,
312 | 0,
313 | 0,
314 | 0,
315 | 0,
316 | 0,
317 | 0,
318 | 0,
319 | 0,
320 | 0,
321 | 2
322 | ],
323 | [
324 | 1,
325 | 1,
326 | 1,
327 | 1,
328 | 1,
329 | 0,
330 | 1,
331 | 1,
332 | 1,
333 | 1,
334 | 1,
335 | 2
336 | ],
337 | [
338 | 0,
339 | 0,
340 | 0,
341 | 1,
342 | 0,
343 | 0,
344 | 1,
345 | 0,
346 | 0,
347 | 0,
348 | 0,
349 | 2
350 | ],
351 | [
352 | 0,
353 | 2,
354 | 1,
355 | 2,
356 | 0,
357 | 0,
358 | 1,
359 | 0,
360 | 2,
361 | 2,
362 | 2,
363 | 2
364 | ],
365 | [
366 | 0,
367 | 2,
368 | 0,
369 | 1,
370 | 0,
371 | 0,
372 | 1,
373 | 0,
374 | 2,
375 | 0,
376 | 0,
377 | 2
378 | ],
379 | [
380 | 0,
381 | 2,
382 | 1,
383 | 1,
384 | 0,
385 | 0,
386 | 1,
387 | 0,
388 | 2,
389 | 0,
390 | 0,
391 | 2
392 | ],
393 | [
394 | 2,
395 | 2,
396 | 2,
397 | 2,
398 | 2,
399 | 2,
400 | 2,
401 | 2,
402 | 2,
403 | 2,
404 | 2,
405 | 2
406 | ]
407 | ],
408 | "rule_severities": {
409 | "bus_definition_conflict": "error",
410 | "bus_entry_needed": "error",
411 | "bus_to_bus_conflict": "error",
412 | "bus_to_net_conflict": "error",
413 | "conflicting_netclasses": "error",
414 | "different_unit_footprint": "error",
415 | "different_unit_net": "error",
416 | "duplicate_reference": "error",
417 | "duplicate_sheet_names": "error",
418 | "endpoint_off_grid": "warning",
419 | "extra_units": "error",
420 | "global_label_dangling": "warning",
421 | "hier_label_mismatch": "error",
422 | "label_dangling": "error",
423 | "lib_symbol_issues": "warning",
424 | "missing_bidi_pin": "warning",
425 | "missing_input_pin": "warning",
426 | "missing_power_pin": "error",
427 | "missing_unit": "warning",
428 | "multiple_net_names": "warning",
429 | "net_not_bus_member": "warning",
430 | "no_connect_connected": "warning",
431 | "no_connect_dangling": "warning",
432 | "pin_not_connected": "error",
433 | "pin_not_driven": "error",
434 | "pin_to_pin": "warning",
435 | "power_pin_not_driven": "error",
436 | "similar_labels": "warning",
437 | "simulation_model_issue": "ignore",
438 | "unannotated": "error",
439 | "unit_value_mismatch": "error",
440 | "unresolved_variable": "error",
441 | "wire_dangling": "error"
442 | }
443 | },
444 | "libraries": {
445 | "pinned_footprint_libs": [],
446 | "pinned_symbol_libs": []
447 | },
448 | "meta": {
449 | "filename": "Indicators.kicad_pro",
450 | "version": 2
451 | },
452 | "net_settings": {
453 | "classes": [
454 | {
455 | "bus_width": 12,
456 | "clearance": 0.2,
457 | "diff_pair_gap": 0.25,
458 | "diff_pair_via_gap": 0.25,
459 | "diff_pair_width": 0.2,
460 | "line_style": 0,
461 | "microvia_diameter": 0.3,
462 | "microvia_drill": 0.1,
463 | "name": "Default",
464 | "pcb_color": "rgba(0, 0, 0, 0.000)",
465 | "priority": 2147483647,
466 | "schematic_color": "rgba(0, 0, 0, 0.000)",
467 | "track_width": 0.2,
468 | "via_diameter": 0.6,
469 | "via_drill": 0.3,
470 | "wire_width": 6
471 | }
472 | ],
473 | "meta": {
474 | "version": 4
475 | },
476 | "net_colors": null,
477 | "netclass_assignments": null,
478 | "netclass_patterns": []
479 | },
480 | "pcbnew": {
481 | "last_paths": {
482 | "gencad": "",
483 | "idf": "",
484 | "netlist": "",
485 | "plot": "",
486 | "pos_files": "",
487 | "specctra_dsn": "",
488 | "step": "Indicators.step",
489 | "svg": "",
490 | "vrml": "Indicators.wrl"
491 | },
492 | "page_layout_descr_file": ""
493 | },
494 | "schematic": {
495 | "annotate_start_num": 0,
496 | "bom_export_filename": "",
497 | "bom_fmt_presets": [],
498 | "bom_fmt_settings": {
499 | "field_delimiter": ",",
500 | "keep_line_breaks": false,
501 | "keep_tabs": false,
502 | "name": "CSV",
503 | "ref_delimiter": ",",
504 | "ref_range_delimiter": "",
505 | "string_delimiter": "\""
506 | },
507 | "bom_presets": [],
508 | "bom_settings": {
509 | "exclude_dnp": false,
510 | "fields_ordered": [
511 | {
512 | "group_by": false,
513 | "label": "Reference",
514 | "name": "Reference",
515 | "show": true
516 | },
517 | {
518 | "group_by": true,
519 | "label": "Value",
520 | "name": "Value",
521 | "show": true
522 | },
523 | {
524 | "group_by": false,
525 | "label": "Datasheet",
526 | "name": "Datasheet",
527 | "show": true
528 | },
529 | {
530 | "group_by": false,
531 | "label": "Footprint",
532 | "name": "Footprint",
533 | "show": true
534 | },
535 | {
536 | "group_by": false,
537 | "label": "Qty",
538 | "name": "${QUANTITY}",
539 | "show": true
540 | },
541 | {
542 | "group_by": true,
543 | "label": "DNP",
544 | "name": "${DNP}",
545 | "show": true
546 | }
547 | ],
548 | "filter_string": "",
549 | "group_symbols": true,
550 | "name": "Grouped By Value",
551 | "sort_asc": true,
552 | "sort_field": "Reference"
553 | },
554 | "connection_grid_size": 50.0,
555 | "drawing": {
556 | "dashed_lines_dash_length_ratio": 12.0,
557 | "dashed_lines_gap_length_ratio": 3.0,
558 | "default_line_thickness": 6.0,
559 | "default_text_size": 50.0,
560 | "field_names": [],
561 | "intersheets_ref_own_page": false,
562 | "intersheets_ref_prefix": "",
563 | "intersheets_ref_short": false,
564 | "intersheets_ref_show": false,
565 | "intersheets_ref_suffix": "",
566 | "junction_size_choice": 3,
567 | "label_size_ratio": 0.375,
568 | "operating_point_overlay_i_precision": 3,
569 | "operating_point_overlay_i_range": "~A",
570 | "operating_point_overlay_v_precision": 3,
571 | "operating_point_overlay_v_range": "~V",
572 | "overbar_offset_ratio": 1.23,
573 | "pin_symbol_size": 25.0,
574 | "text_offset_ratio": 0.15
575 | },
576 | "legacy_lib_dir": "",
577 | "legacy_lib_list": [],
578 | "meta": {
579 | "version": 1
580 | },
581 | "net_format_name": "",
582 | "page_layout_descr_file": "",
583 | "plot_directory": "",
584 | "spice_current_sheet_as_root": false,
585 | "spice_external_command": "spice \"%I\"",
586 | "spice_model_current_sheet_as_root": true,
587 | "spice_save_all_currents": false,
588 | "spice_save_all_dissipations": false,
589 | "spice_save_all_voltages": false,
590 | "subpart_first_id": 65,
591 | "subpart_id_separator": 0
592 | },
593 | "sheets": [
594 | [
595 | "f3495615-4c27-43dd-ae5c-1f1403dbb3a8",
596 | "Root"
597 | ]
598 | ],
599 | "text_variables": {}
600 | }
601 |
--------------------------------------------------------------------------------
/PCB/Indicators/Indicators.kicad_sch:
--------------------------------------------------------------------------------
1 | (kicad_sch
2 | (version 20231120)
3 | (generator "eeschema")
4 | (generator_version "8.0")
5 | (uuid "f3495615-4c27-43dd-ae5c-1f1403dbb3a8")
6 | (paper "A4")
7 | (lib_symbols
8 | (symbol "Connector:TestPoint"
9 | (pin_numbers hide)
10 | (pin_names
11 | (offset 0.762) hide)
12 | (exclude_from_sim no)
13 | (in_bom yes)
14 | (on_board yes)
15 | (property "Reference" "TP"
16 | (at 0 6.858 0)
17 | (effects
18 | (font
19 | (size 1.27 1.27)
20 | )
21 | )
22 | )
23 | (property "Value" "TestPoint"
24 | (at 0 5.08 0)
25 | (effects
26 | (font
27 | (size 1.27 1.27)
28 | )
29 | )
30 | )
31 | (property "Footprint" ""
32 | (at 5.08 0 0)
33 | (effects
34 | (font
35 | (size 1.27 1.27)
36 | )
37 | (hide yes)
38 | )
39 | )
40 | (property "Datasheet" "~"
41 | (at 5.08 0 0)
42 | (effects
43 | (font
44 | (size 1.27 1.27)
45 | )
46 | (hide yes)
47 | )
48 | )
49 | (property "Description" "test point"
50 | (at 0 0 0)
51 | (effects
52 | (font
53 | (size 1.27 1.27)
54 | )
55 | (hide yes)
56 | )
57 | )
58 | (property "ki_keywords" "test point tp"
59 | (at 0 0 0)
60 | (effects
61 | (font
62 | (size 1.27 1.27)
63 | )
64 | (hide yes)
65 | )
66 | )
67 | (property "ki_fp_filters" "Pin* Test*"
68 | (at 0 0 0)
69 | (effects
70 | (font
71 | (size 1.27 1.27)
72 | )
73 | (hide yes)
74 | )
75 | )
76 | (symbol "TestPoint_0_1"
77 | (circle
78 | (center 0 3.302)
79 | (radius 0.762)
80 | (stroke
81 | (width 0)
82 | (type default)
83 | )
84 | (fill
85 | (type none)
86 | )
87 | )
88 | )
89 | (symbol "TestPoint_1_1"
90 | (pin passive line
91 | (at 0 0 90)
92 | (length 2.54)
93 | (name "1"
94 | (effects
95 | (font
96 | (size 1.27 1.27)
97 | )
98 | )
99 | )
100 | (number "1"
101 | (effects
102 | (font
103 | (size 1.27 1.27)
104 | )
105 | )
106 | )
107 | )
108 | )
109 | )
110 | (symbol "Connector_Generic:Conn_01x03"
111 | (pin_names
112 | (offset 1.016) hide)
113 | (exclude_from_sim no)
114 | (in_bom yes)
115 | (on_board yes)
116 | (property "Reference" "J"
117 | (at 0 5.08 0)
118 | (effects
119 | (font
120 | (size 1.27 1.27)
121 | )
122 | )
123 | )
124 | (property "Value" "Conn_01x03"
125 | (at 0 -5.08 0)
126 | (effects
127 | (font
128 | (size 1.27 1.27)
129 | )
130 | )
131 | )
132 | (property "Footprint" ""
133 | (at 0 0 0)
134 | (effects
135 | (font
136 | (size 1.27 1.27)
137 | )
138 | (hide yes)
139 | )
140 | )
141 | (property "Datasheet" "~"
142 | (at 0 0 0)
143 | (effects
144 | (font
145 | (size 1.27 1.27)
146 | )
147 | (hide yes)
148 | )
149 | )
150 | (property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)"
151 | (at 0 0 0)
152 | (effects
153 | (font
154 | (size 1.27 1.27)
155 | )
156 | (hide yes)
157 | )
158 | )
159 | (property "ki_keywords" "connector"
160 | (at 0 0 0)
161 | (effects
162 | (font
163 | (size 1.27 1.27)
164 | )
165 | (hide yes)
166 | )
167 | )
168 | (property "ki_fp_filters" "Connector*:*_1x??_*"
169 | (at 0 0 0)
170 | (effects
171 | (font
172 | (size 1.27 1.27)
173 | )
174 | (hide yes)
175 | )
176 | )
177 | (symbol "Conn_01x03_1_1"
178 | (rectangle
179 | (start -1.27 -2.413)
180 | (end 0 -2.667)
181 | (stroke
182 | (width 0.1524)
183 | (type default)
184 | )
185 | (fill
186 | (type none)
187 | )
188 | )
189 | (rectangle
190 | (start -1.27 0.127)
191 | (end 0 -0.127)
192 | (stroke
193 | (width 0.1524)
194 | (type default)
195 | )
196 | (fill
197 | (type none)
198 | )
199 | )
200 | (rectangle
201 | (start -1.27 2.667)
202 | (end 0 2.413)
203 | (stroke
204 | (width 0.1524)
205 | (type default)
206 | )
207 | (fill
208 | (type none)
209 | )
210 | )
211 | (rectangle
212 | (start -1.27 3.81)
213 | (end 1.27 -3.81)
214 | (stroke
215 | (width 0.254)
216 | (type default)
217 | )
218 | (fill
219 | (type background)
220 | )
221 | )
222 | (pin passive line
223 | (at -5.08 2.54 0)
224 | (length 3.81)
225 | (name "Pin_1"
226 | (effects
227 | (font
228 | (size 1.27 1.27)
229 | )
230 | )
231 | )
232 | (number "1"
233 | (effects
234 | (font
235 | (size 1.27 1.27)
236 | )
237 | )
238 | )
239 | )
240 | (pin passive line
241 | (at -5.08 0 0)
242 | (length 3.81)
243 | (name "Pin_2"
244 | (effects
245 | (font
246 | (size 1.27 1.27)
247 | )
248 | )
249 | )
250 | (number "2"
251 | (effects
252 | (font
253 | (size 1.27 1.27)
254 | )
255 | )
256 | )
257 | )
258 | (pin passive line
259 | (at -5.08 -2.54 0)
260 | (length 3.81)
261 | (name "Pin_3"
262 | (effects
263 | (font
264 | (size 1.27 1.27)
265 | )
266 | )
267 | )
268 | (number "3"
269 | (effects
270 | (font
271 | (size 1.27 1.27)
272 | )
273 | )
274 | )
275 | )
276 | )
277 | )
278 | (symbol "Device:C"
279 | (pin_numbers hide)
280 | (pin_names
281 | (offset 0.254)
282 | )
283 | (exclude_from_sim no)
284 | (in_bom yes)
285 | (on_board yes)
286 | (property "Reference" "C"
287 | (at 0.635 2.54 0)
288 | (effects
289 | (font
290 | (size 1.27 1.27)
291 | )
292 | (justify left)
293 | )
294 | )
295 | (property "Value" "C"
296 | (at 0.635 -2.54 0)
297 | (effects
298 | (font
299 | (size 1.27 1.27)
300 | )
301 | (justify left)
302 | )
303 | )
304 | (property "Footprint" ""
305 | (at 0.9652 -3.81 0)
306 | (effects
307 | (font
308 | (size 1.27 1.27)
309 | )
310 | (hide yes)
311 | )
312 | )
313 | (property "Datasheet" "~"
314 | (at 0 0 0)
315 | (effects
316 | (font
317 | (size 1.27 1.27)
318 | )
319 | (hide yes)
320 | )
321 | )
322 | (property "Description" "Unpolarized capacitor"
323 | (at 0 0 0)
324 | (effects
325 | (font
326 | (size 1.27 1.27)
327 | )
328 | (hide yes)
329 | )
330 | )
331 | (property "ki_keywords" "cap capacitor"
332 | (at 0 0 0)
333 | (effects
334 | (font
335 | (size 1.27 1.27)
336 | )
337 | (hide yes)
338 | )
339 | )
340 | (property "ki_fp_filters" "C_*"
341 | (at 0 0 0)
342 | (effects
343 | (font
344 | (size 1.27 1.27)
345 | )
346 | (hide yes)
347 | )
348 | )
349 | (symbol "C_0_1"
350 | (polyline
351 | (pts
352 | (xy -2.032 -0.762) (xy 2.032 -0.762)
353 | )
354 | (stroke
355 | (width 0.508)
356 | (type default)
357 | )
358 | (fill
359 | (type none)
360 | )
361 | )
362 | (polyline
363 | (pts
364 | (xy -2.032 0.762) (xy 2.032 0.762)
365 | )
366 | (stroke
367 | (width 0.508)
368 | (type default)
369 | )
370 | (fill
371 | (type none)
372 | )
373 | )
374 | )
375 | (symbol "C_1_1"
376 | (pin passive line
377 | (at 0 3.81 270)
378 | (length 2.794)
379 | (name "~"
380 | (effects
381 | (font
382 | (size 1.27 1.27)
383 | )
384 | )
385 | )
386 | (number "1"
387 | (effects
388 | (font
389 | (size 1.27 1.27)
390 | )
391 | )
392 | )
393 | )
394 | (pin passive line
395 | (at 0 -3.81 90)
396 | (length 2.794)
397 | (name "~"
398 | (effects
399 | (font
400 | (size 1.27 1.27)
401 | )
402 | )
403 | )
404 | (number "2"
405 | (effects
406 | (font
407 | (size 1.27 1.27)
408 | )
409 | )
410 | )
411 | )
412 | )
413 | )
414 | (symbol "easyeda2kicad:WS2812B-B"
415 | (exclude_from_sim no)
416 | (in_bom yes)
417 | (on_board yes)
418 | (property "Reference" "LED"
419 | (at 0 6.35 0)
420 | (effects
421 | (font
422 | (size 1.27 1.27)
423 | )
424 | )
425 | )
426 | (property "Value" "WS2812B-B"
427 | (at 0 -6.35 0)
428 | (effects
429 | (font
430 | (size 1.27 1.27)
431 | )
432 | )
433 | )
434 | (property "Footprint" "easyeda2kicad:LED-SMD_4P-L5.0-W5.0-BL_TC5050RGB"
435 | (at 0 -8.89 0)
436 | (effects
437 | (font
438 | (size 1.27 1.27)
439 | )
440 | (hide yes)
441 | )
442 | )
443 | (property "Datasheet" "https://lcsc.com/product-detail/Light-Emitting-Diodes-LED_5050-RGBIntegrated-Light-4Pin_C114586.html"
444 | (at 0 -11.43 0)
445 | (effects
446 | (font
447 | (size 1.27 1.27)
448 | )
449 | (hide yes)
450 | )
451 | )
452 | (property "Description" ""
453 | (at 0 0 0)
454 | (effects
455 | (font
456 | (size 1.27 1.27)
457 | )
458 | (hide yes)
459 | )
460 | )
461 | (property "LCSC Part" "C114586"
462 | (at 0 -13.97 0)
463 | (effects
464 | (font
465 | (size 1.27 1.27)
466 | )
467 | (hide yes)
468 | )
469 | )
470 | (symbol "WS2812B-B_0_1"
471 | (rectangle
472 | (start -10.16 3.81)
473 | (end 10.16 -3.81)
474 | (stroke
475 | (width 0)
476 | (type default)
477 | )
478 | (fill
479 | (type background)
480 | )
481 | )
482 | (circle
483 | (center -8.89 2.54)
484 | (radius 0.38)
485 | (stroke
486 | (width 0)
487 | (type default)
488 | )
489 | (fill
490 | (type none)
491 | )
492 | )
493 | (polyline
494 | (pts
495 | (xy 9.65 -1.78) (xy 9.65 -3.3) (xy 8.13 -3.3) (xy 9.65 -1.78)
496 | )
497 | (stroke
498 | (width 0)
499 | (type default)
500 | )
501 | (fill
502 | (type background)
503 | )
504 | )
505 | (pin unspecified line
506 | (at -12.7 1.27 0)
507 | (length 2.54)
508 | (name "VDD"
509 | (effects
510 | (font
511 | (size 1.27 1.27)
512 | )
513 | )
514 | )
515 | (number "1"
516 | (effects
517 | (font
518 | (size 1.27 1.27)
519 | )
520 | )
521 | )
522 | )
523 | (pin unspecified line
524 | (at -12.7 -1.27 0)
525 | (length 2.54)
526 | (name "DOUT"
527 | (effects
528 | (font
529 | (size 1.27 1.27)
530 | )
531 | )
532 | )
533 | (number "2"
534 | (effects
535 | (font
536 | (size 1.27 1.27)
537 | )
538 | )
539 | )
540 | )
541 | (pin unspecified line
542 | (at 12.7 -1.27 180)
543 | (length 2.54)
544 | (name "VSS"
545 | (effects
546 | (font
547 | (size 1.27 1.27)
548 | )
549 | )
550 | )
551 | (number "3"
552 | (effects
553 | (font
554 | (size 1.27 1.27)
555 | )
556 | )
557 | )
558 | )
559 | (pin unspecified line
560 | (at 12.7 1.27 180)
561 | (length 2.54)
562 | (name "DIN"
563 | (effects
564 | (font
565 | (size 1.27 1.27)
566 | )
567 | )
568 | )
569 | (number "4"
570 | (effects
571 | (font
572 | (size 1.27 1.27)
573 | )
574 | )
575 | )
576 | )
577 | )
578 | )
579 | (symbol "power:+5V"
580 | (power)
581 | (pin_numbers hide)
582 | (pin_names
583 | (offset 0) hide)
584 | (exclude_from_sim no)
585 | (in_bom yes)
586 | (on_board yes)
587 | (property "Reference" "#PWR"
588 | (at 0 -3.81 0)
589 | (effects
590 | (font
591 | (size 1.27 1.27)
592 | )
593 | (hide yes)
594 | )
595 | )
596 | (property "Value" "+5V"
597 | (at 0 3.556 0)
598 | (effects
599 | (font
600 | (size 1.27 1.27)
601 | )
602 | )
603 | )
604 | (property "Footprint" ""
605 | (at 0 0 0)
606 | (effects
607 | (font
608 | (size 1.27 1.27)
609 | )
610 | (hide yes)
611 | )
612 | )
613 | (property "Datasheet" ""
614 | (at 0 0 0)
615 | (effects
616 | (font
617 | (size 1.27 1.27)
618 | )
619 | (hide yes)
620 | )
621 | )
622 | (property "Description" "Power symbol creates a global label with name \"+5V\""
623 | (at 0 0 0)
624 | (effects
625 | (font
626 | (size 1.27 1.27)
627 | )
628 | (hide yes)
629 | )
630 | )
631 | (property "ki_keywords" "global power"
632 | (at 0 0 0)
633 | (effects
634 | (font
635 | (size 1.27 1.27)
636 | )
637 | (hide yes)
638 | )
639 | )
640 | (symbol "+5V_0_1"
641 | (polyline
642 | (pts
643 | (xy -0.762 1.27) (xy 0 2.54)
644 | )
645 | (stroke
646 | (width 0)
647 | (type default)
648 | )
649 | (fill
650 | (type none)
651 | )
652 | )
653 | (polyline
654 | (pts
655 | (xy 0 0) (xy 0 2.54)
656 | )
657 | (stroke
658 | (width 0)
659 | (type default)
660 | )
661 | (fill
662 | (type none)
663 | )
664 | )
665 | (polyline
666 | (pts
667 | (xy 0 2.54) (xy 0.762 1.27)
668 | )
669 | (stroke
670 | (width 0)
671 | (type default)
672 | )
673 | (fill
674 | (type none)
675 | )
676 | )
677 | )
678 | (symbol "+5V_1_1"
679 | (pin power_in line
680 | (at 0 0 90)
681 | (length 0)
682 | (name "~"
683 | (effects
684 | (font
685 | (size 1.27 1.27)
686 | )
687 | )
688 | )
689 | (number "1"
690 | (effects
691 | (font
692 | (size 1.27 1.27)
693 | )
694 | )
695 | )
696 | )
697 | )
698 | )
699 | (symbol "power:GND"
700 | (power)
701 | (pin_numbers hide)
702 | (pin_names
703 | (offset 0) hide)
704 | (exclude_from_sim no)
705 | (in_bom yes)
706 | (on_board yes)
707 | (property "Reference" "#PWR"
708 | (at 0 -6.35 0)
709 | (effects
710 | (font
711 | (size 1.27 1.27)
712 | )
713 | (hide yes)
714 | )
715 | )
716 | (property "Value" "GND"
717 | (at 0 -3.81 0)
718 | (effects
719 | (font
720 | (size 1.27 1.27)
721 | )
722 | )
723 | )
724 | (property "Footprint" ""
725 | (at 0 0 0)
726 | (effects
727 | (font
728 | (size 1.27 1.27)
729 | )
730 | (hide yes)
731 | )
732 | )
733 | (property "Datasheet" ""
734 | (at 0 0 0)
735 | (effects
736 | (font
737 | (size 1.27 1.27)
738 | )
739 | (hide yes)
740 | )
741 | )
742 | (property "Description" "Power symbol creates a global label with name \"GND\" , ground"
743 | (at 0 0 0)
744 | (effects
745 | (font
746 | (size 1.27 1.27)
747 | )
748 | (hide yes)
749 | )
750 | )
751 | (property "ki_keywords" "global power"
752 | (at 0 0 0)
753 | (effects
754 | (font
755 | (size 1.27 1.27)
756 | )
757 | (hide yes)
758 | )
759 | )
760 | (symbol "GND_0_1"
761 | (polyline
762 | (pts
763 | (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27)
764 | )
765 | (stroke
766 | (width 0)
767 | (type default)
768 | )
769 | (fill
770 | (type none)
771 | )
772 | )
773 | )
774 | (symbol "GND_1_1"
775 | (pin power_in line
776 | (at 0 0 270)
777 | (length 0)
778 | (name "~"
779 | (effects
780 | (font
781 | (size 1.27 1.27)
782 | )
783 | )
784 | )
785 | (number "1"
786 | (effects
787 | (font
788 | (size 1.27 1.27)
789 | )
790 | )
791 | )
792 | )
793 | )
794 | )
795 | )
796 | (junction
797 | (at 80.01 69.85)
798 | (diameter 0)
799 | (color 0 0 0 0)
800 | (uuid "1fca6337-bfd1-4371-a974-2b9bae6a0956")
801 | )
802 | (junction
803 | (at 80.01 72.39)
804 | (diameter 0)
805 | (color 0 0 0 0)
806 | (uuid "36b0de92-75dd-46c3-a271-95f97bc61b80")
807 | )
808 | (junction
809 | (at 80.01 74.93)
810 | (diameter 0)
811 | (color 0 0 0 0)
812 | (uuid "407d89d4-989a-44b0-bcb4-e00d513ac924")
813 | )
814 | (junction
815 | (at 129.54 74.93)
816 | (diameter 0)
817 | (color 0 0 0 0)
818 | (uuid "4835c886-6ff3-45f1-beab-5fd8ffaca2ca")
819 | )
820 | (junction
821 | (at 129.54 72.39)
822 | (diameter 0)
823 | (color 0 0 0 0)
824 | (uuid "b7e0b3f2-936b-45c5-aa57-2aacb6f127e6")
825 | )
826 | (junction
827 | (at 129.54 77.47)
828 | (diameter 0)
829 | (color 0 0 0 0)
830 | (uuid "cf343cdf-dbdf-4275-aa55-a4ce0b4795bb")
831 | )
832 | (wire
833 | (pts
834 | (xy 80.01 72.39) (xy 95.25 72.39)
835 | )
836 | (stroke
837 | (width 0)
838 | (type default)
839 | )
840 | (uuid "2a983dfc-413b-4c70-bb11-83c439e94324")
841 | )
842 | (wire
843 | (pts
844 | (xy 68.58 72.39) (xy 80.01 72.39)
845 | )
846 | (stroke
847 | (width 0)
848 | (type default)
849 | )
850 | (uuid "3cd62162-95ed-44c0-8ceb-b1d1056b8298")
851 | )
852 | (wire
853 | (pts
854 | (xy 68.58 74.93) (xy 80.01 74.93)
855 | )
856 | (stroke
857 | (width 0)
858 | (type default)
859 | )
860 | (uuid "463be60a-5a0f-4eb3-9ca5-b1187059730e")
861 | )
862 | (wire
863 | (pts
864 | (xy 68.58 69.85) (xy 80.01 69.85)
865 | )
866 | (stroke
867 | (width 0)
868 | (type default)
869 | )
870 | (uuid "521ac987-44f5-48d9-9169-6b23af89620a")
871 | )
872 | (wire
873 | (pts
874 | (xy 137.16 77.47) (xy 129.54 77.47)
875 | )
876 | (stroke
877 | (width 0)
878 | (type default)
879 | )
880 | (uuid "62061053-0c61-4fe7-9fa1-8dd72d02325b")
881 | )
882 | (wire
883 | (pts
884 | (xy 120.65 74.93) (xy 129.54 74.93)
885 | )
886 | (stroke
887 | (width 0)
888 | (type default)
889 | )
890 | (uuid "98b72d5c-e494-40c6-b0d3-d482cf490bba")
891 | )
892 | (wire
893 | (pts
894 | (xy 137.16 74.93) (xy 129.54 74.93)
895 | )
896 | (stroke
897 | (width 0)
898 | (type default)
899 | )
900 | (uuid "c07ce1ce-d782-45f3-9bc6-26bf4ffcf7d7")
901 | )
902 | (wire
903 | (pts
904 | (xy 137.16 72.39) (xy 129.54 72.39)
905 | )
906 | (stroke
907 | (width 0)
908 | (type default)
909 | )
910 | (uuid "df0ba6ad-bac8-4ffe-a71c-12f2dfebca05")
911 | )
912 | (symbol
913 | (lib_id "Connector_Generic:Conn_01x03")
914 | (at 63.5 72.39 0)
915 | (mirror y)
916 | (unit 1)
917 | (exclude_from_sim no)
918 | (in_bom yes)
919 | (on_board yes)
920 | (dnp no)
921 | (uuid "0f8b0d45-b261-46b5-b636-c898d4cd685b")
922 | (property "Reference" "J4"
923 | (at 63.5 63.5 0)
924 | (effects
925 | (font
926 | (size 1.27 1.27)
927 | )
928 | )
929 | )
930 | (property "Value" "Conn_01x03"
931 | (at 63.5 66.04 0)
932 | (effects
933 | (font
934 | (size 1.27 1.27)
935 | )
936 | )
937 | )
938 | (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Horizontal"
939 | (at 63.5 72.39 0)
940 | (effects
941 | (font
942 | (size 1.27 1.27)
943 | )
944 | (hide yes)
945 | )
946 | )
947 | (property "Datasheet" "~"
948 | (at 63.5 72.39 0)
949 | (effects
950 | (font
951 | (size 1.27 1.27)
952 | )
953 | (hide yes)
954 | )
955 | )
956 | (property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)"
957 | (at 63.5 72.39 0)
958 | (effects
959 | (font
960 | (size 1.27 1.27)
961 | )
962 | (hide yes)
963 | )
964 | )
965 | (pin "1"
966 | (uuid "e0057609-3657-4e80-9c57-6a468c2eafaf")
967 | )
968 | (pin "2"
969 | (uuid "b5df18cc-ab8e-49f7-b0a8-9e568e5dfb47")
970 | )
971 | (pin "3"
972 | (uuid "e657b02c-d8b2-4f83-90fb-94305d256230")
973 | )
974 | (instances
975 | (project "Indicators"
976 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
977 | (reference "J4")
978 | (unit 1)
979 | )
980 | )
981 | )
982 | )
983 | (symbol
984 | (lib_id "Connector_Generic:Conn_01x03")
985 | (at 134.62 74.93 0)
986 | (unit 1)
987 | (exclude_from_sim no)
988 | (in_bom yes)
989 | (on_board yes)
990 | (dnp no)
991 | (uuid "20079a05-1b4b-41ca-9e0b-9b1b0b2d7d7a")
992 | (property "Reference" "J2"
993 | (at 134.62 83.82 0)
994 | (effects
995 | (font
996 | (size 1.27 1.27)
997 | )
998 | )
999 | )
1000 | (property "Value" "Conn_01x03"
1001 | (at 134.62 81.28 0)
1002 | (effects
1003 | (font
1004 | (size 1.27 1.27)
1005 | )
1006 | )
1007 | )
1008 | (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Horizontal"
1009 | (at 134.62 74.93 0)
1010 | (effects
1011 | (font
1012 | (size 1.27 1.27)
1013 | )
1014 | (hide yes)
1015 | )
1016 | )
1017 | (property "Datasheet" "~"
1018 | (at 134.62 74.93 0)
1019 | (effects
1020 | (font
1021 | (size 1.27 1.27)
1022 | )
1023 | (hide yes)
1024 | )
1025 | )
1026 | (property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)"
1027 | (at 134.62 74.93 0)
1028 | (effects
1029 | (font
1030 | (size 1.27 1.27)
1031 | )
1032 | (hide yes)
1033 | )
1034 | )
1035 | (pin "1"
1036 | (uuid "11085554-ed45-4e68-b2ea-7c345b9d4e6c")
1037 | )
1038 | (pin "2"
1039 | (uuid "3309fb64-c1c4-4015-95a9-d7ffe1f87439")
1040 | )
1041 | (pin "3"
1042 | (uuid "ee2707cd-0e16-4722-b4bd-99b28a00ed43")
1043 | )
1044 | (instances
1045 | (project "Indicators"
1046 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1047 | (reference "J2")
1048 | (unit 1)
1049 | )
1050 | )
1051 | )
1052 | )
1053 | (symbol
1054 | (lib_id "power:+5V")
1055 | (at 129.54 72.39 0)
1056 | (unit 1)
1057 | (exclude_from_sim no)
1058 | (in_bom yes)
1059 | (on_board yes)
1060 | (dnp no)
1061 | (fields_autoplaced yes)
1062 | (uuid "24f5d9dc-3cdb-48be-bbd4-f012bcdae21f")
1063 | (property "Reference" "#PWR05"
1064 | (at 129.54 76.2 0)
1065 | (effects
1066 | (font
1067 | (size 1.27 1.27)
1068 | )
1069 | (hide yes)
1070 | )
1071 | )
1072 | (property "Value" "+5V"
1073 | (at 129.54 67.31 0)
1074 | (effects
1075 | (font
1076 | (size 1.27 1.27)
1077 | )
1078 | )
1079 | )
1080 | (property "Footprint" ""
1081 | (at 129.54 72.39 0)
1082 | (effects
1083 | (font
1084 | (size 1.27 1.27)
1085 | )
1086 | (hide yes)
1087 | )
1088 | )
1089 | (property "Datasheet" ""
1090 | (at 129.54 72.39 0)
1091 | (effects
1092 | (font
1093 | (size 1.27 1.27)
1094 | )
1095 | (hide yes)
1096 | )
1097 | )
1098 | (property "Description" "Power symbol creates a global label with name \"+5V\""
1099 | (at 129.54 72.39 0)
1100 | (effects
1101 | (font
1102 | (size 1.27 1.27)
1103 | )
1104 | (hide yes)
1105 | )
1106 | )
1107 | (pin "1"
1108 | (uuid "9a6b4e5a-4570-4796-b04f-57b852ecab72")
1109 | )
1110 | (instances
1111 | (project "Indicators"
1112 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1113 | (reference "#PWR05")
1114 | (unit 1)
1115 | )
1116 | )
1117 | )
1118 | )
1119 | (symbol
1120 | (lib_id "power:GND")
1121 | (at 102.87 86.36 270)
1122 | (mirror x)
1123 | (unit 1)
1124 | (exclude_from_sim no)
1125 | (in_bom yes)
1126 | (on_board yes)
1127 | (dnp no)
1128 | (fields_autoplaced yes)
1129 | (uuid "3eac4f13-3da4-4898-ae60-4e7afdd810c8")
1130 | (property "Reference" "#PWR07"
1131 | (at 96.52 86.36 0)
1132 | (effects
1133 | (font
1134 | (size 1.27 1.27)
1135 | )
1136 | (hide yes)
1137 | )
1138 | )
1139 | (property "Value" "GND"
1140 | (at 99.06 86.3599 90)
1141 | (effects
1142 | (font
1143 | (size 1.27 1.27)
1144 | )
1145 | (justify right)
1146 | )
1147 | )
1148 | (property "Footprint" ""
1149 | (at 102.87 86.36 0)
1150 | (effects
1151 | (font
1152 | (size 1.27 1.27)
1153 | )
1154 | (hide yes)
1155 | )
1156 | )
1157 | (property "Datasheet" ""
1158 | (at 102.87 86.36 0)
1159 | (effects
1160 | (font
1161 | (size 1.27 1.27)
1162 | )
1163 | (hide yes)
1164 | )
1165 | )
1166 | (property "Description" "Power symbol creates a global label with name \"GND\" , ground"
1167 | (at 102.87 86.36 0)
1168 | (effects
1169 | (font
1170 | (size 1.27 1.27)
1171 | )
1172 | (hide yes)
1173 | )
1174 | )
1175 | (pin "1"
1176 | (uuid "f2c8735f-d8ce-4b20-ba55-eb7f4cb09385")
1177 | )
1178 | (instances
1179 | (project "Indicators"
1180 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1181 | (reference "#PWR07")
1182 | (unit 1)
1183 | )
1184 | )
1185 | )
1186 | )
1187 | (symbol
1188 | (lib_id "Connector:TestPoint")
1189 | (at 80.01 69.85 270)
1190 | (unit 1)
1191 | (exclude_from_sim no)
1192 | (in_bom yes)
1193 | (on_board yes)
1194 | (dnp no)
1195 | (fields_autoplaced yes)
1196 | (uuid "57a9b504-f9bb-47a8-9ae9-5011c22ade19")
1197 | (property "Reference" "TP1"
1198 | (at 85.09 68.5799 90)
1199 | (effects
1200 | (font
1201 | (size 1.27 1.27)
1202 | )
1203 | (justify left)
1204 | )
1205 | )
1206 | (property "Value" "TestPoint"
1207 | (at 85.09 71.1199 90)
1208 | (effects
1209 | (font
1210 | (size 1.27 1.27)
1211 | )
1212 | (justify left)
1213 | )
1214 | )
1215 | (property "Footprint" "TestPoint:TestPoint_Pad_D1.5mm"
1216 | (at 80.01 74.93 0)
1217 | (effects
1218 | (font
1219 | (size 1.27 1.27)
1220 | )
1221 | (hide yes)
1222 | )
1223 | )
1224 | (property "Datasheet" "~"
1225 | (at 80.01 74.93 0)
1226 | (effects
1227 | (font
1228 | (size 1.27 1.27)
1229 | )
1230 | (hide yes)
1231 | )
1232 | )
1233 | (property "Description" "test point"
1234 | (at 80.01 69.85 0)
1235 | (effects
1236 | (font
1237 | (size 1.27 1.27)
1238 | )
1239 | (hide yes)
1240 | )
1241 | )
1242 | (pin "1"
1243 | (uuid "b0693acc-5612-4e8b-97ca-91d4eadb67e0")
1244 | )
1245 | (instances
1246 | (project ""
1247 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1248 | (reference "TP1")
1249 | (unit 1)
1250 | )
1251 | )
1252 | )
1253 | )
1254 | (symbol
1255 | (lib_id "power:+5V")
1256 | (at 120.65 72.39 0)
1257 | (mirror y)
1258 | (unit 1)
1259 | (exclude_from_sim no)
1260 | (in_bom yes)
1261 | (on_board yes)
1262 | (dnp no)
1263 | (fields_autoplaced yes)
1264 | (uuid "58339d8b-4ca2-45ab-ad75-087bd245be3d")
1265 | (property "Reference" "#PWR01"
1266 | (at 120.65 76.2 0)
1267 | (effects
1268 | (font
1269 | (size 1.27 1.27)
1270 | )
1271 | (hide yes)
1272 | )
1273 | )
1274 | (property "Value" "+5V"
1275 | (at 120.65 67.31 0)
1276 | (effects
1277 | (font
1278 | (size 1.27 1.27)
1279 | )
1280 | )
1281 | )
1282 | (property "Footprint" ""
1283 | (at 120.65 72.39 0)
1284 | (effects
1285 | (font
1286 | (size 1.27 1.27)
1287 | )
1288 | (hide yes)
1289 | )
1290 | )
1291 | (property "Datasheet" ""
1292 | (at 120.65 72.39 0)
1293 | (effects
1294 | (font
1295 | (size 1.27 1.27)
1296 | )
1297 | (hide yes)
1298 | )
1299 | )
1300 | (property "Description" "Power symbol creates a global label with name \"+5V\""
1301 | (at 120.65 72.39 0)
1302 | (effects
1303 | (font
1304 | (size 1.27 1.27)
1305 | )
1306 | (hide yes)
1307 | )
1308 | )
1309 | (pin "1"
1310 | (uuid "677c841d-869d-4e85-81c0-2615b9e3d1f3")
1311 | )
1312 | (instances
1313 | (project ""
1314 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1315 | (reference "#PWR01")
1316 | (unit 1)
1317 | )
1318 | )
1319 | )
1320 | )
1321 | (symbol
1322 | (lib_id "Connector:TestPoint")
1323 | (at 129.54 72.39 90)
1324 | (unit 1)
1325 | (exclude_from_sim no)
1326 | (in_bom yes)
1327 | (on_board yes)
1328 | (dnp no)
1329 | (fields_autoplaced yes)
1330 | (uuid "66a59657-32f7-42d9-9290-df322e662758")
1331 | (property "Reference" "TP6"
1332 | (at 124.46 73.6601 90)
1333 | (effects
1334 | (font
1335 | (size 1.27 1.27)
1336 | )
1337 | (justify left)
1338 | )
1339 | )
1340 | (property "Value" "TestPoint"
1341 | (at 124.46 71.1201 90)
1342 | (effects
1343 | (font
1344 | (size 1.27 1.27)
1345 | )
1346 | (justify left)
1347 | )
1348 | )
1349 | (property "Footprint" "TestPoint:TestPoint_Pad_D1.5mm"
1350 | (at 129.54 67.31 0)
1351 | (effects
1352 | (font
1353 | (size 1.27 1.27)
1354 | )
1355 | (hide yes)
1356 | )
1357 | )
1358 | (property "Datasheet" "~"
1359 | (at 129.54 67.31 0)
1360 | (effects
1361 | (font
1362 | (size 1.27 1.27)
1363 | )
1364 | (hide yes)
1365 | )
1366 | )
1367 | (property "Description" "test point"
1368 | (at 129.54 72.39 0)
1369 | (effects
1370 | (font
1371 | (size 1.27 1.27)
1372 | )
1373 | (hide yes)
1374 | )
1375 | )
1376 | (pin "1"
1377 | (uuid "71d2eeb5-4b93-4fd4-9b0c-d592519a3eb1")
1378 | )
1379 | (instances
1380 | (project "Indicators"
1381 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1382 | (reference "TP6")
1383 | (unit 1)
1384 | )
1385 | )
1386 | )
1387 | )
1388 | (symbol
1389 | (lib_id "power:GND")
1390 | (at 129.54 77.47 0)
1391 | (unit 1)
1392 | (exclude_from_sim no)
1393 | (in_bom yes)
1394 | (on_board yes)
1395 | (dnp no)
1396 | (fields_autoplaced yes)
1397 | (uuid "6713caa4-6f0d-4454-994c-215d5395e881")
1398 | (property "Reference" "#PWR06"
1399 | (at 129.54 83.82 0)
1400 | (effects
1401 | (font
1402 | (size 1.27 1.27)
1403 | )
1404 | (hide yes)
1405 | )
1406 | )
1407 | (property "Value" "GND"
1408 | (at 129.54 82.55 0)
1409 | (effects
1410 | (font
1411 | (size 1.27 1.27)
1412 | )
1413 | )
1414 | )
1415 | (property "Footprint" ""
1416 | (at 129.54 77.47 0)
1417 | (effects
1418 | (font
1419 | (size 1.27 1.27)
1420 | )
1421 | (hide yes)
1422 | )
1423 | )
1424 | (property "Datasheet" ""
1425 | (at 129.54 77.47 0)
1426 | (effects
1427 | (font
1428 | (size 1.27 1.27)
1429 | )
1430 | (hide yes)
1431 | )
1432 | )
1433 | (property "Description" "Power symbol creates a global label with name \"GND\" , ground"
1434 | (at 129.54 77.47 0)
1435 | (effects
1436 | (font
1437 | (size 1.27 1.27)
1438 | )
1439 | (hide yes)
1440 | )
1441 | )
1442 | (pin "1"
1443 | (uuid "91cd88bf-9168-4910-a8b3-29648e164c17")
1444 | )
1445 | (instances
1446 | (project "Indicators"
1447 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1448 | (reference "#PWR06")
1449 | (unit 1)
1450 | )
1451 | )
1452 | )
1453 | )
1454 | (symbol
1455 | (lib_id "power:GND")
1456 | (at 95.25 74.93 0)
1457 | (mirror y)
1458 | (unit 1)
1459 | (exclude_from_sim no)
1460 | (in_bom yes)
1461 | (on_board yes)
1462 | (dnp no)
1463 | (fields_autoplaced yes)
1464 | (uuid "722d6936-166f-4220-9f55-e74d16ff5bc3")
1465 | (property "Reference" "#PWR02"
1466 | (at 95.25 81.28 0)
1467 | (effects
1468 | (font
1469 | (size 1.27 1.27)
1470 | )
1471 | (hide yes)
1472 | )
1473 | )
1474 | (property "Value" "GND"
1475 | (at 95.25 80.01 0)
1476 | (effects
1477 | (font
1478 | (size 1.27 1.27)
1479 | )
1480 | )
1481 | )
1482 | (property "Footprint" ""
1483 | (at 95.25 74.93 0)
1484 | (effects
1485 | (font
1486 | (size 1.27 1.27)
1487 | )
1488 | (hide yes)
1489 | )
1490 | )
1491 | (property "Datasheet" ""
1492 | (at 95.25 74.93 0)
1493 | (effects
1494 | (font
1495 | (size 1.27 1.27)
1496 | )
1497 | (hide yes)
1498 | )
1499 | )
1500 | (property "Description" "Power symbol creates a global label with name \"GND\" , ground"
1501 | (at 95.25 74.93 0)
1502 | (effects
1503 | (font
1504 | (size 1.27 1.27)
1505 | )
1506 | (hide yes)
1507 | )
1508 | )
1509 | (pin "1"
1510 | (uuid "31511a48-c646-4079-8f25-4c728aac3c9b")
1511 | )
1512 | (instances
1513 | (project ""
1514 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1515 | (reference "#PWR02")
1516 | (unit 1)
1517 | )
1518 | )
1519 | )
1520 | )
1521 | (symbol
1522 | (lib_id "Device:C")
1523 | (at 106.68 86.36 90)
1524 | (unit 1)
1525 | (exclude_from_sim no)
1526 | (in_bom yes)
1527 | (on_board yes)
1528 | (dnp no)
1529 | (fields_autoplaced yes)
1530 | (uuid "76f711de-7a95-4237-9b9c-aa571ef94943")
1531 | (property "Reference" "C1"
1532 | (at 106.68 78.74 90)
1533 | (effects
1534 | (font
1535 | (size 1.27 1.27)
1536 | )
1537 | )
1538 | )
1539 | (property "Value" "C"
1540 | (at 106.68 81.28 90)
1541 | (effects
1542 | (font
1543 | (size 1.27 1.27)
1544 | )
1545 | )
1546 | )
1547 | (property "Footprint" "Capacitor_SMD:C_0603_1608Metric"
1548 | (at 110.49 85.3948 0)
1549 | (effects
1550 | (font
1551 | (size 1.27 1.27)
1552 | )
1553 | (hide yes)
1554 | )
1555 | )
1556 | (property "Datasheet" "~"
1557 | (at 106.68 86.36 0)
1558 | (effects
1559 | (font
1560 | (size 1.27 1.27)
1561 | )
1562 | (hide yes)
1563 | )
1564 | )
1565 | (property "Description" "Unpolarized capacitor"
1566 | (at 106.68 86.36 0)
1567 | (effects
1568 | (font
1569 | (size 1.27 1.27)
1570 | )
1571 | (hide yes)
1572 | )
1573 | )
1574 | (property "LCSC" "C2844328"
1575 | (at 106.68 86.36 90)
1576 | (effects
1577 | (font
1578 | (size 1.27 1.27)
1579 | )
1580 | (hide yes)
1581 | )
1582 | )
1583 | (pin "2"
1584 | (uuid "3c0ab6a1-1502-4e66-802a-48f50eff1ceb")
1585 | )
1586 | (pin "1"
1587 | (uuid "35ba193f-46c5-43b3-98d8-f71f5c31319b")
1588 | )
1589 | (instances
1590 | (project ""
1591 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1592 | (reference "C1")
1593 | (unit 1)
1594 | )
1595 | )
1596 | )
1597 | )
1598 | (symbol
1599 | (lib_id "easyeda2kicad:WS2812B-B")
1600 | (at 107.95 73.66 0)
1601 | (mirror y)
1602 | (unit 1)
1603 | (exclude_from_sim no)
1604 | (in_bom yes)
1605 | (on_board yes)
1606 | (dnp no)
1607 | (fields_autoplaced yes)
1608 | (uuid "8399da51-62e9-4dbf-995c-640803288381")
1609 | (property "Reference" "LED1"
1610 | (at 107.95 64.77 0)
1611 | (effects
1612 | (font
1613 | (size 1.27 1.27)
1614 | )
1615 | )
1616 | )
1617 | (property "Value" "WS2812B-B"
1618 | (at 107.95 67.31 0)
1619 | (effects
1620 | (font
1621 | (size 1.27 1.27)
1622 | )
1623 | )
1624 | )
1625 | (property "Footprint" "easyeda2kicad:LED-SMD_4P-L5.0-W5.0-BL_TC5050RGB"
1626 | (at 107.95 82.55 0)
1627 | (effects
1628 | (font
1629 | (size 1.27 1.27)
1630 | )
1631 | (hide yes)
1632 | )
1633 | )
1634 | (property "Datasheet" "https://lcsc.com/product-detail/Light-Emitting-Diodes-LED_5050-RGBIntegrated-Light-4Pin_C114586.html"
1635 | (at 107.95 85.09 0)
1636 | (effects
1637 | (font
1638 | (size 1.27 1.27)
1639 | )
1640 | (hide yes)
1641 | )
1642 | )
1643 | (property "Description" ""
1644 | (at 107.95 73.66 0)
1645 | (effects
1646 | (font
1647 | (size 1.27 1.27)
1648 | )
1649 | (hide yes)
1650 | )
1651 | )
1652 | (property "LCSC Part" "C114586"
1653 | (at 107.95 87.63 0)
1654 | (effects
1655 | (font
1656 | (size 1.27 1.27)
1657 | )
1658 | (hide yes)
1659 | )
1660 | )
1661 | (pin "2"
1662 | (uuid "cd7f285b-de25-4e69-8bfa-20dbab72b70d")
1663 | )
1664 | (pin "3"
1665 | (uuid "1ede7793-65ef-449d-95d7-e3ea4e962ad8")
1666 | )
1667 | (pin "1"
1668 | (uuid "93b17b91-c198-461a-8740-2fc4de542aef")
1669 | )
1670 | (pin "4"
1671 | (uuid "8ebae516-bd08-4744-8a4f-860f89c6f50f")
1672 | )
1673 | (instances
1674 | (project ""
1675 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1676 | (reference "LED1")
1677 | (unit 1)
1678 | )
1679 | )
1680 | )
1681 | )
1682 | (symbol
1683 | (lib_id "Connector_Generic:Conn_01x03")
1684 | (at 74.93 72.39 0)
1685 | (mirror y)
1686 | (unit 1)
1687 | (exclude_from_sim no)
1688 | (in_bom yes)
1689 | (on_board yes)
1690 | (dnp no)
1691 | (uuid "847237d4-a44d-4bdd-ba98-df85c38e150c")
1692 | (property "Reference" "J1"
1693 | (at 74.93 81.28 0)
1694 | (effects
1695 | (font
1696 | (size 1.27 1.27)
1697 | )
1698 | )
1699 | )
1700 | (property "Value" "Conn_01x03"
1701 | (at 74.93 78.74 0)
1702 | (effects
1703 | (font
1704 | (size 1.27 1.27)
1705 | )
1706 | )
1707 | )
1708 | (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Horizontal"
1709 | (at 74.93 72.39 0)
1710 | (effects
1711 | (font
1712 | (size 1.27 1.27)
1713 | )
1714 | (hide yes)
1715 | )
1716 | )
1717 | (property "Datasheet" "~"
1718 | (at 74.93 72.39 0)
1719 | (effects
1720 | (font
1721 | (size 1.27 1.27)
1722 | )
1723 | (hide yes)
1724 | )
1725 | )
1726 | (property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)"
1727 | (at 74.93 72.39 0)
1728 | (effects
1729 | (font
1730 | (size 1.27 1.27)
1731 | )
1732 | (hide yes)
1733 | )
1734 | )
1735 | (pin "1"
1736 | (uuid "24f9cd00-9473-462c-b727-df0e7b6686b6")
1737 | )
1738 | (pin "2"
1739 | (uuid "6ca5b0a3-7ec8-47bf-a122-29f755240fd9")
1740 | )
1741 | (pin "3"
1742 | (uuid "967b86e4-437d-4870-8e69-579e8b0ee4a3")
1743 | )
1744 | (instances
1745 | (project ""
1746 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1747 | (reference "J1")
1748 | (unit 1)
1749 | )
1750 | )
1751 | )
1752 | )
1753 | (symbol
1754 | (lib_id "Connector:TestPoint")
1755 | (at 80.01 74.93 270)
1756 | (unit 1)
1757 | (exclude_from_sim no)
1758 | (in_bom yes)
1759 | (on_board yes)
1760 | (dnp no)
1761 | (fields_autoplaced yes)
1762 | (uuid "8a59d917-3b8b-4d6a-b94b-baa4b0739223")
1763 | (property "Reference" "TP2"
1764 | (at 85.09 73.6599 90)
1765 | (effects
1766 | (font
1767 | (size 1.27 1.27)
1768 | )
1769 | (justify left)
1770 | )
1771 | )
1772 | (property "Value" "TestPoint"
1773 | (at 85.09 76.1999 90)
1774 | (effects
1775 | (font
1776 | (size 1.27 1.27)
1777 | )
1778 | (justify left)
1779 | )
1780 | )
1781 | (property "Footprint" "TestPoint:TestPoint_Pad_D1.5mm"
1782 | (at 80.01 80.01 0)
1783 | (effects
1784 | (font
1785 | (size 1.27 1.27)
1786 | )
1787 | (hide yes)
1788 | )
1789 | )
1790 | (property "Datasheet" "~"
1791 | (at 80.01 80.01 0)
1792 | (effects
1793 | (font
1794 | (size 1.27 1.27)
1795 | )
1796 | (hide yes)
1797 | )
1798 | )
1799 | (property "Description" "test point"
1800 | (at 80.01 74.93 0)
1801 | (effects
1802 | (font
1803 | (size 1.27 1.27)
1804 | )
1805 | (hide yes)
1806 | )
1807 | )
1808 | (pin "1"
1809 | (uuid "cc5c8bd5-3bb7-4386-8e6f-a63fc39edae1")
1810 | )
1811 | (instances
1812 | (project "Indicators"
1813 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1814 | (reference "TP2")
1815 | (unit 1)
1816 | )
1817 | )
1818 | )
1819 | )
1820 | (symbol
1821 | (lib_id "power:+5V")
1822 | (at 110.49 86.36 270)
1823 | (mirror x)
1824 | (unit 1)
1825 | (exclude_from_sim no)
1826 | (in_bom yes)
1827 | (on_board yes)
1828 | (dnp no)
1829 | (fields_autoplaced yes)
1830 | (uuid "8cf1afca-2e84-40bd-bfa5-ed49fe588742")
1831 | (property "Reference" "#PWR08"
1832 | (at 106.68 86.36 0)
1833 | (effects
1834 | (font
1835 | (size 1.27 1.27)
1836 | )
1837 | (hide yes)
1838 | )
1839 | )
1840 | (property "Value" "+5V"
1841 | (at 114.3 86.3599 90)
1842 | (effects
1843 | (font
1844 | (size 1.27 1.27)
1845 | )
1846 | (justify left)
1847 | )
1848 | )
1849 | (property "Footprint" ""
1850 | (at 110.49 86.36 0)
1851 | (effects
1852 | (font
1853 | (size 1.27 1.27)
1854 | )
1855 | (hide yes)
1856 | )
1857 | )
1858 | (property "Datasheet" ""
1859 | (at 110.49 86.36 0)
1860 | (effects
1861 | (font
1862 | (size 1.27 1.27)
1863 | )
1864 | (hide yes)
1865 | )
1866 | )
1867 | (property "Description" "Power symbol creates a global label with name \"+5V\""
1868 | (at 110.49 86.36 0)
1869 | (effects
1870 | (font
1871 | (size 1.27 1.27)
1872 | )
1873 | (hide yes)
1874 | )
1875 | )
1876 | (pin "1"
1877 | (uuid "9cfd1a0e-879a-4030-a522-b46a8769131a")
1878 | )
1879 | (instances
1880 | (project "Indicators"
1881 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1882 | (reference "#PWR08")
1883 | (unit 1)
1884 | )
1885 | )
1886 | )
1887 | )
1888 | (symbol
1889 | (lib_id "Connector:TestPoint")
1890 | (at 129.54 77.47 90)
1891 | (unit 1)
1892 | (exclude_from_sim no)
1893 | (in_bom yes)
1894 | (on_board yes)
1895 | (dnp no)
1896 | (fields_autoplaced yes)
1897 | (uuid "97264b3a-5a95-4b79-bbc8-4c7e8973237d")
1898 | (property "Reference" "TP4"
1899 | (at 124.46 78.7401 90)
1900 | (effects
1901 | (font
1902 | (size 1.27 1.27)
1903 | )
1904 | (justify left)
1905 | )
1906 | )
1907 | (property "Value" "TestPoint"
1908 | (at 124.46 76.2001 90)
1909 | (effects
1910 | (font
1911 | (size 1.27 1.27)
1912 | )
1913 | (justify left)
1914 | )
1915 | )
1916 | (property "Footprint" "TestPoint:TestPoint_Pad_D1.5mm"
1917 | (at 129.54 72.39 0)
1918 | (effects
1919 | (font
1920 | (size 1.27 1.27)
1921 | )
1922 | (hide yes)
1923 | )
1924 | )
1925 | (property "Datasheet" "~"
1926 | (at 129.54 72.39 0)
1927 | (effects
1928 | (font
1929 | (size 1.27 1.27)
1930 | )
1931 | (hide yes)
1932 | )
1933 | )
1934 | (property "Description" "test point"
1935 | (at 129.54 77.47 0)
1936 | (effects
1937 | (font
1938 | (size 1.27 1.27)
1939 | )
1940 | (hide yes)
1941 | )
1942 | )
1943 | (pin "1"
1944 | (uuid "4b2521b3-3bf5-4627-b0bd-11e9b88dedc1")
1945 | )
1946 | (instances
1947 | (project "Indicators"
1948 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
1949 | (reference "TP4")
1950 | (unit 1)
1951 | )
1952 | )
1953 | )
1954 | )
1955 | (symbol
1956 | (lib_id "power:+5V")
1957 | (at 80.01 69.85 0)
1958 | (mirror y)
1959 | (unit 1)
1960 | (exclude_from_sim no)
1961 | (in_bom yes)
1962 | (on_board yes)
1963 | (dnp no)
1964 | (fields_autoplaced yes)
1965 | (uuid "9f191ffc-6807-4c25-89cf-53ba47d665af")
1966 | (property "Reference" "#PWR04"
1967 | (at 80.01 73.66 0)
1968 | (effects
1969 | (font
1970 | (size 1.27 1.27)
1971 | )
1972 | (hide yes)
1973 | )
1974 | )
1975 | (property "Value" "+5V"
1976 | (at 80.01 64.77 0)
1977 | (effects
1978 | (font
1979 | (size 1.27 1.27)
1980 | )
1981 | )
1982 | )
1983 | (property "Footprint" ""
1984 | (at 80.01 69.85 0)
1985 | (effects
1986 | (font
1987 | (size 1.27 1.27)
1988 | )
1989 | (hide yes)
1990 | )
1991 | )
1992 | (property "Datasheet" ""
1993 | (at 80.01 69.85 0)
1994 | (effects
1995 | (font
1996 | (size 1.27 1.27)
1997 | )
1998 | (hide yes)
1999 | )
2000 | )
2001 | (property "Description" "Power symbol creates a global label with name \"+5V\""
2002 | (at 80.01 69.85 0)
2003 | (effects
2004 | (font
2005 | (size 1.27 1.27)
2006 | )
2007 | (hide yes)
2008 | )
2009 | )
2010 | (pin "1"
2011 | (uuid "1e1cc946-f0e4-4752-ae22-49461d282a54")
2012 | )
2013 | (instances
2014 | (project "Indicators"
2015 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
2016 | (reference "#PWR04")
2017 | (unit 1)
2018 | )
2019 | )
2020 | )
2021 | )
2022 | (symbol
2023 | (lib_id "Connector_Generic:Conn_01x03")
2024 | (at 142.24 74.93 0)
2025 | (unit 1)
2026 | (exclude_from_sim no)
2027 | (in_bom yes)
2028 | (on_board yes)
2029 | (dnp no)
2030 | (fields_autoplaced yes)
2031 | (uuid "a474cc0d-0413-4a03-bf72-0c2dea8f4afe")
2032 | (property "Reference" "J3"
2033 | (at 142.24 66.04 0)
2034 | (effects
2035 | (font
2036 | (size 1.27 1.27)
2037 | )
2038 | )
2039 | )
2040 | (property "Value" "Conn_01x03"
2041 | (at 142.24 68.58 0)
2042 | (effects
2043 | (font
2044 | (size 1.27 1.27)
2045 | )
2046 | )
2047 | )
2048 | (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Horizontal"
2049 | (at 142.24 74.93 0)
2050 | (effects
2051 | (font
2052 | (size 1.27 1.27)
2053 | )
2054 | (hide yes)
2055 | )
2056 | )
2057 | (property "Datasheet" "~"
2058 | (at 142.24 74.93 0)
2059 | (effects
2060 | (font
2061 | (size 1.27 1.27)
2062 | )
2063 | (hide yes)
2064 | )
2065 | )
2066 | (property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)"
2067 | (at 142.24 74.93 0)
2068 | (effects
2069 | (font
2070 | (size 1.27 1.27)
2071 | )
2072 | (hide yes)
2073 | )
2074 | )
2075 | (pin "1"
2076 | (uuid "8bf1f935-db1d-43c5-8f6c-46a235be536a")
2077 | )
2078 | (pin "2"
2079 | (uuid "dcccf453-15bf-4897-a96e-da94d3096c11")
2080 | )
2081 | (pin "3"
2082 | (uuid "7ab0e4b1-b2c0-4685-b1ba-86b8189002e7")
2083 | )
2084 | (instances
2085 | (project ""
2086 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
2087 | (reference "J3")
2088 | (unit 1)
2089 | )
2090 | )
2091 | )
2092 | )
2093 | (symbol
2094 | (lib_id "Connector:TestPoint")
2095 | (at 129.54 74.93 90)
2096 | (unit 1)
2097 | (exclude_from_sim no)
2098 | (in_bom yes)
2099 | (on_board yes)
2100 | (dnp no)
2101 | (fields_autoplaced yes)
2102 | (uuid "b77d304c-f626-4227-8521-13e959c99a23")
2103 | (property "Reference" "TP5"
2104 | (at 124.46 76.2001 90)
2105 | (effects
2106 | (font
2107 | (size 1.27 1.27)
2108 | )
2109 | (justify left)
2110 | )
2111 | )
2112 | (property "Value" "TestPoint"
2113 | (at 124.46 73.6601 90)
2114 | (effects
2115 | (font
2116 | (size 1.27 1.27)
2117 | )
2118 | (justify left)
2119 | )
2120 | )
2121 | (property "Footprint" "TestPoint:TestPoint_Pad_D1.5mm"
2122 | (at 129.54 69.85 0)
2123 | (effects
2124 | (font
2125 | (size 1.27 1.27)
2126 | )
2127 | (hide yes)
2128 | )
2129 | )
2130 | (property "Datasheet" "~"
2131 | (at 129.54 69.85 0)
2132 | (effects
2133 | (font
2134 | (size 1.27 1.27)
2135 | )
2136 | (hide yes)
2137 | )
2138 | )
2139 | (property "Description" "test point"
2140 | (at 129.54 74.93 0)
2141 | (effects
2142 | (font
2143 | (size 1.27 1.27)
2144 | )
2145 | (hide yes)
2146 | )
2147 | )
2148 | (pin "1"
2149 | (uuid "9e636f8c-dc5b-4f84-a584-a037db5e0df7")
2150 | )
2151 | (instances
2152 | (project "Indicators"
2153 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
2154 | (reference "TP5")
2155 | (unit 1)
2156 | )
2157 | )
2158 | )
2159 | )
2160 | (symbol
2161 | (lib_id "Connector:TestPoint")
2162 | (at 80.01 72.39 270)
2163 | (unit 1)
2164 | (exclude_from_sim no)
2165 | (in_bom yes)
2166 | (on_board yes)
2167 | (dnp no)
2168 | (fields_autoplaced yes)
2169 | (uuid "e1b5d30b-7a2f-4bea-8b54-cc39fb49f630")
2170 | (property "Reference" "TP3"
2171 | (at 85.09 71.1199 90)
2172 | (effects
2173 | (font
2174 | (size 1.27 1.27)
2175 | )
2176 | (justify left)
2177 | )
2178 | )
2179 | (property "Value" "TestPoint"
2180 | (at 85.09 73.6599 90)
2181 | (effects
2182 | (font
2183 | (size 1.27 1.27)
2184 | )
2185 | (justify left)
2186 | )
2187 | )
2188 | (property "Footprint" "TestPoint:TestPoint_Pad_D1.5mm"
2189 | (at 80.01 77.47 0)
2190 | (effects
2191 | (font
2192 | (size 1.27 1.27)
2193 | )
2194 | (hide yes)
2195 | )
2196 | )
2197 | (property "Datasheet" "~"
2198 | (at 80.01 77.47 0)
2199 | (effects
2200 | (font
2201 | (size 1.27 1.27)
2202 | )
2203 | (hide yes)
2204 | )
2205 | )
2206 | (property "Description" "test point"
2207 | (at 80.01 72.39 0)
2208 | (effects
2209 | (font
2210 | (size 1.27 1.27)
2211 | )
2212 | (hide yes)
2213 | )
2214 | )
2215 | (pin "1"
2216 | (uuid "a4bab2e7-b7fc-4a5c-82e7-e695e33ef076")
2217 | )
2218 | (instances
2219 | (project "Indicators"
2220 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
2221 | (reference "TP3")
2222 | (unit 1)
2223 | )
2224 | )
2225 | )
2226 | )
2227 | (symbol
2228 | (lib_id "power:GND")
2229 | (at 80.01 74.93 0)
2230 | (mirror y)
2231 | (unit 1)
2232 | (exclude_from_sim no)
2233 | (in_bom yes)
2234 | (on_board yes)
2235 | (dnp no)
2236 | (fields_autoplaced yes)
2237 | (uuid "ebcf222f-05c4-4257-90cb-306cfb4ddb5d")
2238 | (property "Reference" "#PWR03"
2239 | (at 80.01 81.28 0)
2240 | (effects
2241 | (font
2242 | (size 1.27 1.27)
2243 | )
2244 | (hide yes)
2245 | )
2246 | )
2247 | (property "Value" "GND"
2248 | (at 80.01 80.01 0)
2249 | (effects
2250 | (font
2251 | (size 1.27 1.27)
2252 | )
2253 | )
2254 | )
2255 | (property "Footprint" ""
2256 | (at 80.01 74.93 0)
2257 | (effects
2258 | (font
2259 | (size 1.27 1.27)
2260 | )
2261 | (hide yes)
2262 | )
2263 | )
2264 | (property "Datasheet" ""
2265 | (at 80.01 74.93 0)
2266 | (effects
2267 | (font
2268 | (size 1.27 1.27)
2269 | )
2270 | (hide yes)
2271 | )
2272 | )
2273 | (property "Description" "Power symbol creates a global label with name \"GND\" , ground"
2274 | (at 80.01 74.93 0)
2275 | (effects
2276 | (font
2277 | (size 1.27 1.27)
2278 | )
2279 | (hide yes)
2280 | )
2281 | )
2282 | (pin "1"
2283 | (uuid "fd6584b4-580a-44f2-8a73-c627002482bf")
2284 | )
2285 | (instances
2286 | (project "Indicators"
2287 | (path "/f3495615-4c27-43dd-ae5c-1f1403dbb3a8"
2288 | (reference "#PWR03")
2289 | (unit 1)
2290 | )
2291 | )
2292 | )
2293 | )
2294 | (sheet_instances
2295 | (path "/"
2296 | (page "1")
2297 | )
2298 | )
2299 | )
2300 |
--------------------------------------------------------------------------------
/PCB/Indicators/fabrication-toolkit-options.json:
--------------------------------------------------------------------------------
1 | {"EXTRA_LAYERS": "", "EXTEND_EDGE_CUT": false, "ALTERNATIVE_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": false}
--------------------------------------------------------------------------------
/PCB/Indicators/production/Indicators.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/production/Indicators.zip
--------------------------------------------------------------------------------
/PCB/Indicators/production/backups/Indicators_2024-11-02_00-55-45.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/production/backups/Indicators_2024-11-02_00-55-45.zip
--------------------------------------------------------------------------------
/PCB/Indicators/production/bom.csv:
--------------------------------------------------------------------------------
1 | Designator,Footprint,Quantity,Value,LCSC Part #
2 | C1,0603,1,C,C2844328
3 | "J1, J2",PinHeader_1x03_P2.54mm_Horizontal,2,Conn_01x03,
4 | "J3, J4",PinSocket_1x03_P2.54mm_Horizontal,2,Conn_01x03,
5 | LED1,LED-SMD_4P-L5.0-W5.0-BL_TC5050RGB,1,WS2812B-B,C114586
6 | "TP1, TP2, TP3, TP4, TP5, TP6",TestPoint_Pad_D1.5mm,6,TestPoint,
7 |
--------------------------------------------------------------------------------
/PCB/Indicators/production/designators.csv:
--------------------------------------------------------------------------------
1 | C1:1
2 | J1:1
3 | J2:1
4 | J3:1
5 | J4:1
6 | LED1:1
7 | TP1:1
8 | TP2:1
9 | TP3:1
10 | TP4:1
11 | TP5:1
12 | TP6:1
13 |
--------------------------------------------------------------------------------
/PCB/Indicators/production/netlist.ipc:
--------------------------------------------------------------------------------
1 | P CODE 00
2 | P UNITS CUST 0
3 | P arrayDim N
4 | 327GND C1 -1 A01X+040738Y-033760X0354Y0374R000S2
5 | 327+5V C1 -2 A01X+041348Y-033760X0354Y0374R000S2
6 | 327GND TP4 -1 A01X+032972Y-033169X0591Y0000R270S2
7 | 317+5V J4 -1 D0394PA00X+036476Y-031087X0669Y0669R180S0
8 | 317NET-(J1-PIN_2) J4 -2 D0394PA00X+036476Y-032087X0669Y0669R180S0
9 | 317GND J4 -3 D0394PA00X+036476Y-033087X0669Y0669R180S0
10 | 327+5V TP6 -1 A01X+049114Y-031004X0591Y0000R270S2
11 | 327+5V TP1 -1 A01X+032972Y-031004X0591Y0000R270S2
12 | 327NET-(J2-PIN_2) TP5 -1 A01X+049114Y-032087X0591Y0000R270S2
13 | 327NET-(J1-PIN_2) TP3 -1 A01X+032972Y-032087X0591Y0000R270S2
14 | 327GND TP2 -1 A01X+049114Y-033169X0591Y0000R270S2
15 | 317+5V J2 -1 D0394PA00X+047933Y-031093X0669Y0669R000S0
16 | 317NET-(J2-PIN_2) J2 -2 D0394PA00X+047933Y-032093X0669Y0669R000S0
17 | 317GND J2 -3 D0394PA00X+047933Y-033093X0669Y0669R000S0
18 | 317+5V J3 -1 D0394PA00X+045571Y-031087X0669Y0669R180S0
19 | 317NET-(J2-PIN_2) J3 -2 D0394PA00X+045571Y-032087X0669Y0669R180S0
20 | 317GND J3 -3 D0394PA00X+045571Y-033087X0669Y0669R180S0
21 | 317+5V J1 -1 D0394PA00X+034154Y-031087X0669Y0669R180S0
22 | 317NET-(J1-PIN_2) J1 -2 D0394PA00X+034154Y-032087X0669Y0669R180S0
23 | 317GND J1 -3 D0394PA00X+034154Y-033087X0669Y0669R180S0
24 | 327+5V LED1 -1 A01X+042028Y-032736X0591Y0394R180S2
25 | 327NET-(J2-PIN_2) LED1 -2 A01X+042028Y-031437X0591Y0394R180S2
26 | 327GND LED1 -3 A01X+040059Y-031437X0591Y0394R180S2
27 | 327NET-(J1-PIN_2) LED1 -4 A01X+040059Y-032736X0591Y0394R180S2
28 | 999
29 |
--------------------------------------------------------------------------------
/PCB/Indicators/production/positions.csv:
--------------------------------------------------------------------------------
1 | Designator,Mid X,Mid Y,Rotation,Layer
2 | C1,104.25,-85.75,0.0,top
3 | J1,82.375,-81.485,0.0,bottom
4 | J2,126.125,-81.5,0.0,top
5 | J3,120.15,-81.485,0.0,bottom
6 | J4,97.05,-81.485,0.0,bottom
7 | LED1,104.25,-81.5,180.0,top
8 |
--------------------------------------------------------------------------------
/PCB/Indicators/schematic.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/Indicators/schematic.pdf
--------------------------------------------------------------------------------
/PCB/NodePCB/NodePCB.kicad_prl:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "active_layer": 44,
4 | "active_layer_preset": "All Layers",
5 | "auto_track_width": true,
6 | "hidden_netclasses": [],
7 | "hidden_nets": [],
8 | "high_contrast_mode": 0,
9 | "net_color_mode": 1,
10 | "opacity": {
11 | "images": 0.6,
12 | "pads": 1.0,
13 | "tracks": 1.0,
14 | "vias": 1.0,
15 | "zones": 0.6
16 | },
17 | "selection_filter": {
18 | "dimensions": true,
19 | "footprints": true,
20 | "graphics": true,
21 | "keepouts": true,
22 | "lockedItems": false,
23 | "otherItems": true,
24 | "pads": true,
25 | "text": true,
26 | "tracks": true,
27 | "vias": true,
28 | "zones": true
29 | },
30 | "visible_items": [
31 | 0,
32 | 1,
33 | 2,
34 | 3,
35 | 4,
36 | 5,
37 | 8,
38 | 9,
39 | 10,
40 | 11,
41 | 12,
42 | 13,
43 | 15,
44 | 16,
45 | 17,
46 | 18,
47 | 19,
48 | 20,
49 | 21,
50 | 22,
51 | 23,
52 | 24,
53 | 25,
54 | 26,
55 | 27,
56 | 28,
57 | 29,
58 | 30,
59 | 32,
60 | 33,
61 | 34,
62 | 35,
63 | 36,
64 | 39,
65 | 40
66 | ],
67 | "visible_layers": "fffffff_ffffffff",
68 | "zone_display_mode": 0
69 | },
70 | "git": {
71 | "repo_password": "",
72 | "repo_type": "",
73 | "repo_username": "",
74 | "ssh_key": ""
75 | },
76 | "meta": {
77 | "filename": "NodePCB.kicad_prl",
78 | "version": 3
79 | },
80 | "project": {
81 | "files": []
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/PCB/NodePCB/NodePCB.kicad_pro:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "3dviewports": [],
4 | "design_settings": {
5 | "defaults": {
6 | "apply_defaults_to_fp_fields": false,
7 | "apply_defaults_to_fp_shapes": false,
8 | "apply_defaults_to_fp_text": false,
9 | "board_outline_line_width": 0.05,
10 | "copper_line_width": 0.2,
11 | "copper_text_italic": false,
12 | "copper_text_size_h": 1.5,
13 | "copper_text_size_v": 1.5,
14 | "copper_text_thickness": 0.3,
15 | "copper_text_upright": false,
16 | "courtyard_line_width": 0.05,
17 | "dimension_precision": 4,
18 | "dimension_units": 3,
19 | "dimensions": {
20 | "arrow_length": 1270000,
21 | "extension_offset": 500000,
22 | "keep_text_aligned": true,
23 | "suppress_zeroes": false,
24 | "text_position": 0,
25 | "units_format": 1
26 | },
27 | "fab_line_width": 0.1,
28 | "fab_text_italic": false,
29 | "fab_text_size_h": 1.0,
30 | "fab_text_size_v": 1.0,
31 | "fab_text_thickness": 0.15,
32 | "fab_text_upright": false,
33 | "other_line_width": 0.1,
34 | "other_text_italic": false,
35 | "other_text_size_h": 1.0,
36 | "other_text_size_v": 1.0,
37 | "other_text_thickness": 0.15,
38 | "other_text_upright": false,
39 | "pads": {
40 | "drill": 0.762,
41 | "height": 1.524,
42 | "width": 1.524
43 | },
44 | "silk_line_width": 0.1,
45 | "silk_text_italic": false,
46 | "silk_text_size_h": 1.0,
47 | "silk_text_size_v": 1.0,
48 | "silk_text_thickness": 0.1,
49 | "silk_text_upright": false,
50 | "zones": {
51 | "min_clearance": 0.5
52 | }
53 | },
54 | "diff_pair_dimensions": [],
55 | "drc_exclusions": [],
56 | "meta": {
57 | "version": 2
58 | },
59 | "rule_severities": {
60 | "annular_width": "error",
61 | "clearance": "error",
62 | "connection_width": "warning",
63 | "copper_edge_clearance": "error",
64 | "copper_sliver": "warning",
65 | "courtyards_overlap": "error",
66 | "diff_pair_gap_out_of_range": "error",
67 | "diff_pair_uncoupled_length_too_long": "error",
68 | "drill_out_of_range": "error",
69 | "duplicate_footprints": "warning",
70 | "extra_footprint": "warning",
71 | "footprint": "error",
72 | "footprint_symbol_mismatch": "warning",
73 | "footprint_type_mismatch": "ignore",
74 | "hole_clearance": "error",
75 | "hole_near_hole": "error",
76 | "holes_co_located": "warning",
77 | "invalid_outline": "error",
78 | "isolated_copper": "warning",
79 | "item_on_disabled_layer": "error",
80 | "items_not_allowed": "error",
81 | "length_out_of_range": "error",
82 | "lib_footprint_issues": "warning",
83 | "lib_footprint_mismatch": "warning",
84 | "malformed_courtyard": "error",
85 | "microvia_drill_out_of_range": "error",
86 | "missing_courtyard": "ignore",
87 | "missing_footprint": "warning",
88 | "net_conflict": "warning",
89 | "npth_inside_courtyard": "ignore",
90 | "padstack": "warning",
91 | "pth_inside_courtyard": "ignore",
92 | "shorting_items": "error",
93 | "silk_edge_clearance": "warning",
94 | "silk_over_copper": "warning",
95 | "silk_overlap": "warning",
96 | "skew_out_of_range": "error",
97 | "solder_mask_bridge": "error",
98 | "starved_thermal": "error",
99 | "text_height": "warning",
100 | "text_thickness": "warning",
101 | "through_hole_pad_without_hole": "error",
102 | "too_many_vias": "error",
103 | "track_dangling": "warning",
104 | "track_width": "error",
105 | "tracks_crossing": "error",
106 | "unconnected_items": "error",
107 | "unresolved_variable": "error",
108 | "via_dangling": "warning",
109 | "zones_intersect": "error"
110 | },
111 | "rules": {
112 | "max_error": 0.005,
113 | "min_clearance": 0.0,
114 | "min_connection": 0.0,
115 | "min_copper_edge_clearance": 0.5,
116 | "min_hole_clearance": 0.25,
117 | "min_hole_to_hole": 0.25,
118 | "min_microvia_diameter": 0.2,
119 | "min_microvia_drill": 0.1,
120 | "min_resolved_spokes": 2,
121 | "min_silk_clearance": 0.0,
122 | "min_text_height": 0.8,
123 | "min_text_thickness": 0.08,
124 | "min_through_hole_diameter": 0.3,
125 | "min_track_width": 0.0,
126 | "min_via_annular_width": 0.1,
127 | "min_via_diameter": 0.5,
128 | "solder_mask_to_copper_clearance": 0.005,
129 | "use_height_for_length_calcs": true
130 | },
131 | "teardrop_options": [
132 | {
133 | "td_onpadsmd": true,
134 | "td_onroundshapesonly": false,
135 | "td_ontrackend": false,
136 | "td_onviapad": true
137 | }
138 | ],
139 | "teardrop_parameters": [
140 | {
141 | "td_allow_use_two_tracks": true,
142 | "td_curve_segcount": 0,
143 | "td_height_ratio": 1.0,
144 | "td_length_ratio": 0.5,
145 | "td_maxheight": 2.0,
146 | "td_maxlen": 1.0,
147 | "td_on_pad_in_zone": false,
148 | "td_target_name": "td_round_shape",
149 | "td_width_to_size_filter_ratio": 0.9
150 | },
151 | {
152 | "td_allow_use_two_tracks": true,
153 | "td_curve_segcount": 0,
154 | "td_height_ratio": 1.0,
155 | "td_length_ratio": 0.5,
156 | "td_maxheight": 2.0,
157 | "td_maxlen": 1.0,
158 | "td_on_pad_in_zone": false,
159 | "td_target_name": "td_rect_shape",
160 | "td_width_to_size_filter_ratio": 0.9
161 | },
162 | {
163 | "td_allow_use_two_tracks": true,
164 | "td_curve_segcount": 0,
165 | "td_height_ratio": 1.0,
166 | "td_length_ratio": 0.5,
167 | "td_maxheight": 2.0,
168 | "td_maxlen": 1.0,
169 | "td_on_pad_in_zone": false,
170 | "td_target_name": "td_track_end",
171 | "td_width_to_size_filter_ratio": 0.9
172 | }
173 | ],
174 | "track_widths": [],
175 | "tuning_pattern_settings": {
176 | "diff_pair_defaults": {
177 | "corner_radius_percentage": 80,
178 | "corner_style": 1,
179 | "max_amplitude": 1.0,
180 | "min_amplitude": 0.2,
181 | "single_sided": false,
182 | "spacing": 1.0
183 | },
184 | "diff_pair_skew_defaults": {
185 | "corner_radius_percentage": 80,
186 | "corner_style": 1,
187 | "max_amplitude": 1.0,
188 | "min_amplitude": 0.2,
189 | "single_sided": false,
190 | "spacing": 0.6
191 | },
192 | "single_track_defaults": {
193 | "corner_radius_percentage": 80,
194 | "corner_style": 1,
195 | "max_amplitude": 1.0,
196 | "min_amplitude": 0.2,
197 | "single_sided": false,
198 | "spacing": 0.6
199 | }
200 | },
201 | "via_dimensions": [],
202 | "zones_allow_external_fillets": false
203 | },
204 | "ipc2581": {
205 | "dist": "",
206 | "distpn": "",
207 | "internal_id": "",
208 | "mfg": "",
209 | "mpn": ""
210 | },
211 | "layer_presets": [],
212 | "viewports": []
213 | },
214 | "boards": [],
215 | "cvpcb": {
216 | "equivalence_files": []
217 | },
218 | "erc": {
219 | "erc_exclusions": [],
220 | "meta": {
221 | "version": 0
222 | },
223 | "pin_map": [
224 | [
225 | 0,
226 | 0,
227 | 0,
228 | 0,
229 | 0,
230 | 0,
231 | 1,
232 | 0,
233 | 0,
234 | 0,
235 | 0,
236 | 2
237 | ],
238 | [
239 | 0,
240 | 2,
241 | 0,
242 | 1,
243 | 0,
244 | 0,
245 | 1,
246 | 0,
247 | 2,
248 | 2,
249 | 2,
250 | 2
251 | ],
252 | [
253 | 0,
254 | 0,
255 | 0,
256 | 0,
257 | 0,
258 | 0,
259 | 1,
260 | 0,
261 | 1,
262 | 0,
263 | 1,
264 | 2
265 | ],
266 | [
267 | 0,
268 | 1,
269 | 0,
270 | 0,
271 | 0,
272 | 0,
273 | 1,
274 | 1,
275 | 2,
276 | 1,
277 | 1,
278 | 2
279 | ],
280 | [
281 | 0,
282 | 0,
283 | 0,
284 | 0,
285 | 0,
286 | 0,
287 | 1,
288 | 0,
289 | 0,
290 | 0,
291 | 0,
292 | 2
293 | ],
294 | [
295 | 0,
296 | 0,
297 | 0,
298 | 0,
299 | 0,
300 | 0,
301 | 0,
302 | 0,
303 | 0,
304 | 0,
305 | 0,
306 | 2
307 | ],
308 | [
309 | 1,
310 | 1,
311 | 1,
312 | 1,
313 | 1,
314 | 0,
315 | 1,
316 | 1,
317 | 1,
318 | 1,
319 | 1,
320 | 2
321 | ],
322 | [
323 | 0,
324 | 0,
325 | 0,
326 | 1,
327 | 0,
328 | 0,
329 | 1,
330 | 0,
331 | 0,
332 | 0,
333 | 0,
334 | 2
335 | ],
336 | [
337 | 0,
338 | 2,
339 | 1,
340 | 2,
341 | 0,
342 | 0,
343 | 1,
344 | 0,
345 | 2,
346 | 2,
347 | 2,
348 | 2
349 | ],
350 | [
351 | 0,
352 | 2,
353 | 0,
354 | 1,
355 | 0,
356 | 0,
357 | 1,
358 | 0,
359 | 2,
360 | 0,
361 | 0,
362 | 2
363 | ],
364 | [
365 | 0,
366 | 2,
367 | 1,
368 | 1,
369 | 0,
370 | 0,
371 | 1,
372 | 0,
373 | 2,
374 | 0,
375 | 0,
376 | 2
377 | ],
378 | [
379 | 2,
380 | 2,
381 | 2,
382 | 2,
383 | 2,
384 | 2,
385 | 2,
386 | 2,
387 | 2,
388 | 2,
389 | 2,
390 | 2
391 | ]
392 | ],
393 | "rule_severities": {
394 | "bus_definition_conflict": "error",
395 | "bus_entry_needed": "error",
396 | "bus_to_bus_conflict": "error",
397 | "bus_to_net_conflict": "error",
398 | "conflicting_netclasses": "error",
399 | "different_unit_footprint": "error",
400 | "different_unit_net": "error",
401 | "duplicate_reference": "error",
402 | "duplicate_sheet_names": "error",
403 | "endpoint_off_grid": "warning",
404 | "extra_units": "error",
405 | "global_label_dangling": "warning",
406 | "hier_label_mismatch": "error",
407 | "label_dangling": "error",
408 | "lib_symbol_issues": "warning",
409 | "missing_bidi_pin": "warning",
410 | "missing_input_pin": "warning",
411 | "missing_power_pin": "error",
412 | "missing_unit": "warning",
413 | "multiple_net_names": "warning",
414 | "net_not_bus_member": "warning",
415 | "no_connect_connected": "warning",
416 | "no_connect_dangling": "warning",
417 | "pin_not_connected": "error",
418 | "pin_not_driven": "error",
419 | "pin_to_pin": "warning",
420 | "power_pin_not_driven": "error",
421 | "similar_labels": "warning",
422 | "simulation_model_issue": "ignore",
423 | "unannotated": "error",
424 | "unit_value_mismatch": "error",
425 | "unresolved_variable": "error",
426 | "wire_dangling": "error"
427 | }
428 | },
429 | "libraries": {
430 | "pinned_footprint_libs": [],
431 | "pinned_symbol_libs": []
432 | },
433 | "meta": {
434 | "filename": "NodePCB.kicad_pro",
435 | "version": 1
436 | },
437 | "net_settings": {
438 | "classes": [
439 | {
440 | "bus_width": 12,
441 | "clearance": 0.2,
442 | "diff_pair_gap": 0.25,
443 | "diff_pair_via_gap": 0.25,
444 | "diff_pair_width": 0.2,
445 | "line_style": 0,
446 | "microvia_diameter": 0.3,
447 | "microvia_drill": 0.1,
448 | "name": "Default",
449 | "pcb_color": "rgba(0, 0, 0, 0.000)",
450 | "schematic_color": "rgba(0, 0, 0, 0.000)",
451 | "track_width": 0.2,
452 | "via_diameter": 0.6,
453 | "via_drill": 0.3,
454 | "wire_width": 6
455 | }
456 | ],
457 | "meta": {
458 | "version": 3
459 | },
460 | "net_colors": null,
461 | "netclass_assignments": null,
462 | "netclass_patterns": []
463 | },
464 | "pcbnew": {
465 | "last_paths": {
466 | "gencad": "",
467 | "idf": "",
468 | "netlist": "",
469 | "plot": "",
470 | "pos_files": "",
471 | "specctra_dsn": "",
472 | "step": "",
473 | "svg": "",
474 | "vrml": ""
475 | },
476 | "page_layout_descr_file": ""
477 | },
478 | "schematic": {
479 | "annotate_start_num": 0,
480 | "bom_export_filename": "",
481 | "bom_fmt_presets": [],
482 | "bom_fmt_settings": {
483 | "field_delimiter": ",",
484 | "keep_line_breaks": false,
485 | "keep_tabs": false,
486 | "name": "CSV",
487 | "ref_delimiter": ",",
488 | "ref_range_delimiter": "",
489 | "string_delimiter": "\""
490 | },
491 | "bom_presets": [],
492 | "bom_settings": {
493 | "exclude_dnp": false,
494 | "fields_ordered": [
495 | {
496 | "group_by": false,
497 | "label": "Reference",
498 | "name": "Reference",
499 | "show": true
500 | },
501 | {
502 | "group_by": true,
503 | "label": "Value",
504 | "name": "Value",
505 | "show": true
506 | },
507 | {
508 | "group_by": false,
509 | "label": "Datasheet",
510 | "name": "Datasheet",
511 | "show": true
512 | },
513 | {
514 | "group_by": false,
515 | "label": "Footprint",
516 | "name": "Footprint",
517 | "show": true
518 | },
519 | {
520 | "group_by": false,
521 | "label": "Qty",
522 | "name": "${QUANTITY}",
523 | "show": true
524 | },
525 | {
526 | "group_by": true,
527 | "label": "DNP",
528 | "name": "${DNP}",
529 | "show": true
530 | }
531 | ],
532 | "filter_string": "",
533 | "group_symbols": true,
534 | "name": "Grouped By Value",
535 | "sort_asc": true,
536 | "sort_field": "Reference"
537 | },
538 | "connection_grid_size": 50.0,
539 | "drawing": {
540 | "dashed_lines_dash_length_ratio": 12.0,
541 | "dashed_lines_gap_length_ratio": 3.0,
542 | "default_line_thickness": 6.0,
543 | "default_text_size": 50.0,
544 | "field_names": [],
545 | "intersheets_ref_own_page": false,
546 | "intersheets_ref_prefix": "",
547 | "intersheets_ref_short": false,
548 | "intersheets_ref_show": false,
549 | "intersheets_ref_suffix": "",
550 | "junction_size_choice": 3,
551 | "label_size_ratio": 0.375,
552 | "operating_point_overlay_i_precision": 3,
553 | "operating_point_overlay_i_range": "~A",
554 | "operating_point_overlay_v_precision": 3,
555 | "operating_point_overlay_v_range": "~V",
556 | "overbar_offset_ratio": 1.23,
557 | "pin_symbol_size": 25.0,
558 | "text_offset_ratio": 0.15
559 | },
560 | "legacy_lib_dir": "",
561 | "legacy_lib_list": [],
562 | "meta": {
563 | "version": 1
564 | },
565 | "net_format_name": "",
566 | "page_layout_descr_file": "",
567 | "plot_directory": "",
568 | "spice_current_sheet_as_root": false,
569 | "spice_external_command": "spice \"%I\"",
570 | "spice_model_current_sheet_as_root": true,
571 | "spice_save_all_currents": false,
572 | "spice_save_all_dissipations": false,
573 | "spice_save_all_voltages": false,
574 | "subpart_first_id": 65,
575 | "subpart_id_separator": 0
576 | },
577 | "sheets": [
578 | [
579 | "f2b94d5e-9969-49cb-97d3-78769c15427e",
580 | "Root"
581 | ]
582 | ],
583 | "text_variables": {}
584 | }
585 |
--------------------------------------------------------------------------------
/PCB/NodePCB/fabrication-toolkit-options.json:
--------------------------------------------------------------------------------
1 | {"EXTRA_LAYERS": "", "ALL_ACTIVE_LAYERS": false, "EXTEND_EDGE_CUT": false, "ALTERNATIVE_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": false}
--------------------------------------------------------------------------------
/PCB/NodePCB/fp-info-cache:
--------------------------------------------------------------------------------
1 | 0
2 |
--------------------------------------------------------------------------------
/PCB/NodePCB/production/Gerber.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/PCB/NodePCB/production/Gerber.zip
--------------------------------------------------------------------------------
/PCB/NodePCB/production/bom.csv:
--------------------------------------------------------------------------------
1 | Designator,Footprint,Quantity,Value,LCSC Part #
2 | D1,SOD-323_L1.8-W1.3-LS2.5-RD,1,NSR0320MW2T1G,C48192
3 | J1,PinHeader_1x04_P2.54mm_Horizontal,1,Conn_01x04,
4 | "J2, J3",PinHeader_1x03_P2.54mm_Horizontal,2,Conn_01x03_Pin,
5 | "J4, J5",PinHeader_1x10_P2.54mm_Vertical,2,Conn_01x10,
6 | LED1,LED0805-R-RD,1,FC-2012HRK-620D,C84256
7 | R1,0603,1,1k,
8 | "R2, R3",0603,2,5.1k,
9 | R4,0603,1,68,
10 | "SW1, SW2",SW-SMD_L3.9-W3.0-P4.45,2,TS-1088-AR02016,C720477
11 | U1,COMM-SMD_ESP-WROOM-32D,1,ESP-WROOM-32E,C19949066
12 | U2,SOT-223-3_L6.5-W3.4-P2.30-LS7.0-BR,1,LM2940S-3.3,C596335
13 | USB1,TYPE-C-SMD_TYPE-C-6P_5,1,TYPE-C 6P(073),C668623
14 |
--------------------------------------------------------------------------------
/PCB/NodePCB/production/designators.csv:
--------------------------------------------------------------------------------
1 | D1:1
2 | J1:1
3 | J2:1
4 | J3:1
5 | J4:1
6 | J5:1
7 | LED1:1
8 | R1:1
9 | R2:1
10 | R3:1
11 | R4:1
12 | SW1:1
13 | SW2:1
14 | U1:1
15 | U2:1
16 | USB1:1
17 |
--------------------------------------------------------------------------------
/PCB/NodePCB/production/netlist.ipc:
--------------------------------------------------------------------------------
1 | P CODE 00
2 | P UNITS CUST 0
3 | P arrayDim N
4 | 317NET-(J4-PIN_1) VIA MD0118PA00X+030118Y-029331X0236Y0000R000S3
5 | 317NET-(J4-PIN_1) VIA MD0118PA00X+032087Y-028543X0236Y0000R000S3
6 | 317+3.3V VIA MD0118PA00X+029528Y-022510X0236Y0000R000S3
7 | 317SLOT VIA MD0118PA00X+038189Y-028150X0236Y0000R000S3
8 | 317TX VIA MD0118PA00X+032264Y-030880X0236Y0000R000S3
9 | 317TX VIA MD0118PA00X+029127Y-031500X0236Y0000R000S3
10 | 317RX VIA MD0118PA00X+029914Y-032156X0236Y0000R000S3
11 | 317RX VIA MD0118PA00X+037992Y-024016X0236Y0000R000S3
12 | 317TX VIA MD0118PA00X+038064Y-023598X0236Y0000R000S3
13 | 317+5V VIA MD0118PA00X+032893Y-034861X0236Y0000R000S3
14 | 317+5V VIA MD0118PA00X+032874Y-032087X0236Y0000R000S3
15 | 317IO0 VIA MD0118PA00X+038048Y-028592X0236Y0000R000S3
16 | 317IO0 VIA MD0118PA00X+029752Y-038583X0236Y0000R000S3
17 | 317EN VIA MD0118PA00X+029711Y-036615X0236Y0000R000S3
18 | 317EN VIA MD0118PA00X+029528Y-023159X0236Y0000R000S3
19 | 327GND USB1 -B12 A01X+032669Y-037772X0315Y0472R000S2
20 | 327VIN USB1 -B9 A01X+033142Y-037772X0276Y0472R000S2
21 | 327NET-(USB1-CC1) USB1 -A5 A01X+033535Y-037772X0276Y0472R000S2
22 | 327NET-(USB1-CC2) USB1 -B5 A01X+033929Y-037772X0276Y0472R000S2
23 | 327VIN USB1 -A9 A01X+034323Y-037772X0276Y0472R000S2
24 | 327GND USB1 -A12 A01X+034795Y-037772X0315Y0472R000S2
25 | 317GND USB1 -7 D0276PA00X+035433Y-039370X0433Y0669R000S0
26 | 317GND USB1 -7 D0276PA00X+032031Y-039370X0433Y0669R000S0
27 | 317GND USB1 -7 D0276PA00X+035433Y-037870X0433Y0669R000S0
28 | 317GND USB1 -7 D0276PA00X+032031Y-037870X0433Y0669R000S0
29 | 327+5V U2 -1 A01X+032402Y-031902X0984Y0433R270S2
30 | 327GND U2 -2 A01X+031496Y-031902X0984Y0433R270S2
31 | 327+3.3V U2 -3 A01X+030591Y-031902X0984Y0433R270S2
32 | 327GND U2 -4 A01X+031496Y-034240X0921Y1417R270S2
33 | 327GND U1 -38 A01X+037461Y-022127X0787Y0394R000S2
34 | 327NET-(J5-PIN_1) U1 -37 A01X+037461Y-022627X0787Y0394R000S2
35 | 327NET-(J5-PIN_2) U1 -36 A01X+037461Y-023127X0787Y0394R000S2
36 | 327TX U1 -35 A01X+037461Y-023627X0787Y0394R000S2
37 | 327RX U1 -34 A01X+037461Y-024127X0787Y0394R000S2
38 | 327NET-(J5-PIN_3) U1 -33 A01X+037461Y-024627X0787Y0394R000S2
39 | 327-(U1-NC-PAD32) U1 -32 A01X+037461Y-025127X0787Y0394R000S2
40 | 327SH}SD0*-PAD21) U1 -21 A01X+034618Y-029300X0787Y0394R270S2
41 | 327SH}SD1*-PAD22) U1 -22 A01X+035118Y-029300X0787Y0394R270S2
42 | 327POSITION U1 -23 A01X+035618Y-029300X0787Y0394R270S2
43 | 327SH}CLK*-PAD20) U1 -20 A01X+034118Y-029300X0787Y0394R270S2
44 | 327SH}CMD*-PAD19) U1 -19 A01X+033618Y-029300X0787Y0394R270S2
45 | 327SH}SD3*-PAD18) U1 -18 A01X+033118Y-029300X0787Y0394R270S2
46 | 327GND U1 -1 A01X+030256Y-022127X0787Y0394R000S2
47 | 327+3.3V U1 -2 A01X+030256Y-022627X0787Y0394R000S2
48 | 327EN U1 -3 A01X+030256Y-023127X0787Y0394R000S2
49 | 327NET-(J4-PIN_1) U1 -16 A01X+032118Y-029300X0787Y0394R270S2
50 | 327GND U1 -15 A01X+031618Y-029300X0787Y0394R270S2
51 | 327NET-(J4-PIN_2) U1 -14 A01X+030256Y-028627X0787Y0394R000S2
52 | 327NET-(J4-PIN_3) U1 -13 A01X+030256Y-028127X0787Y0394R000S2
53 | 327NET-(J4-PIN_4) U1 -12 A01X+030256Y-027627X0787Y0394R000S2
54 | 327SH}SD2*-PAD17) U1 -17 A01X+032618Y-029300X0787Y0394R270S2
55 | 327NET-(J5-PIN_5) U1 -31 A01X+037461Y-025627X0787Y0394R000S2
56 | 327NET-(J5-PIN_6) U1 -30 A01X+037461Y-026127X0787Y0394R000S2
57 | 327NET-(J5-PIN_7) U1 -29 A01X+037461Y-026627X0787Y0394R000S2
58 | 327NET-(J5-PIN_8) U1 -28 A01X+037461Y-027127X0787Y0394R000S2
59 | 327NET-(J5-PIN_9) U1 -27 A01X+037461Y-027627X0787Y0394R000S2
60 | 327SLOT U1 -26 A01X+037461Y-028127X0787Y0394R000S2
61 | 327IO0 U1 -25 A01X+037461Y-028627X0787Y0394R000S2
62 | 327ET-(J5-PIN_10) U1 -24 A01X+036118Y-029300X0787Y0394R270S2
63 | 327NET-(J4-PIN_5) U1 -11 A01X+030256Y-027127X0787Y0394R000S2
64 | 327NET-(J4-PIN_6) U1 -10 A01X+030256Y-026627X0787Y0394R000S2
65 | 327NET-(J4-PIN_7) U1 -9 A01X+030256Y-026127X0787Y0394R000S2
66 | 327NET-(J4-PIN_8) U1 -8 A01X+030256Y-025627X0787Y0394R000S2
67 | 327NET-(J4-PIN_9) U1 -7 A01X+030256Y-025127X0787Y0394R000S2
68 | 327ET-(J4-PIN_10) U1 -6 A01X+030256Y-024627X0787Y0394R000S2
69 | 327ENSOR_VN-PAD5) U1 -5 A01X+030256Y-024127X0787Y0394R000S2
70 | 327ENSOR_VP-PAD4) U1 -4 A01X+030256Y-023627X0787Y0394R000S2
71 | 327GND U1 -39 A01X+033272Y-025162X1378Y1378R000S2
72 | 327GND SW2 -1 A01X+027559Y-038583X0484Y0535R000S2
73 | 327IO0 SW2 -2 A01X+029276Y-038583X0484Y0535R000S2
74 | 327GND SW1 -1 A01X+027559Y-036614X0484Y0535R000S2
75 | 327EN SW1 -2 A01X+029276Y-036614X0484Y0535R000S2
76 | 327NET-(LED1-+) R4 -1 A01X+034252Y-033071X0315Y0374R180S2
77 | 327+3.3V R4 -2 A01X+033602Y-033071X0315Y0374R180S2
78 | 327GND R3 -1 A01X+034646Y-037008X0315Y0374R180S2
79 | 327NET-(USB1-CC2) R3 -2 A01X+033996Y-037008X0315Y0374R180S2
80 | 327GND R2 -1 A01X+032677Y-037008X0315Y0374R000S2
81 | 327NET-(USB1-CC1) R2 -2 A01X+033327Y-037008X0315Y0374R000S2
82 | 327+3.3V R1 -1 A01X+029065Y-022510X0315Y0374R090S2
83 | 327EN R1 -2 A01X+029065Y-023159X0315Y0374R090S2
84 | 327GND LED1 -2 A01X+033465Y-034252X0394Y0551R180S2
85 | 327NET-(LED1-+) LED1 -1 A01X+034291Y-034252X0394Y0551R180S2
86 | 317NET-(J5-PIN_1) J5 -1 D0394PA00X+040157Y-020591X0669Y0669R000S0
87 | 317NET-(J5-PIN_2) J5 -2 D0394PA00X+040157Y-021591X0669Y0669R000S0
88 | 317NET-(J5-PIN_3) J5 -3 D0394PA00X+040157Y-022591X0669Y0669R000S0
89 | 317J5-PIN_4-PAD4) J5 -4 D0394PA00X+040157Y-023591X0669Y0669R000S0
90 | 317NET-(J5-PIN_5) J5 -5 D0394PA00X+040157Y-024591X0669Y0669R000S0
91 | 317NET-(J5-PIN_6) J5 -6 D0394PA00X+040157Y-025591X0669Y0669R000S0
92 | 317NET-(J5-PIN_7) J5 -7 D0394PA00X+040157Y-026591X0669Y0669R000S0
93 | 317NET-(J5-PIN_8) J5 -8 D0394PA00X+040157Y-027591X0669Y0669R000S0
94 | 317NET-(J5-PIN_9) J5 -9 D0394PA00X+040157Y-028591X0669Y0669R000S0
95 | 317ET-(J5-PIN_10) J5 -10 D0394PA00X+040157Y-029591X0669Y0669R000S0
96 | 317NET-(J4-PIN_1) J4 -1 D0394PA00X+027559Y-029591X0669Y0669R180S0
97 | 317NET-(J4-PIN_2) J4 -2 D0394PA00X+027559Y-028591X0669Y0669R180S0
98 | 317NET-(J4-PIN_3) J4 -3 D0394PA00X+027559Y-027591X0669Y0669R180S0
99 | 317NET-(J4-PIN_4) J4 -4 D0394PA00X+027559Y-026591X0669Y0669R180S0
100 | 317NET-(J4-PIN_5) J4 -5 D0394PA00X+027559Y-025591X0669Y0669R180S0
101 | 317NET-(J4-PIN_6) J4 -6 D0394PA00X+027559Y-024591X0669Y0669R180S0
102 | 317NET-(J4-PIN_7) J4 -7 D0394PA00X+027559Y-023591X0669Y0669R180S0
103 | 317NET-(J4-PIN_8) J4 -8 D0394PA00X+027559Y-022591X0669Y0669R180S0
104 | 317NET-(J4-PIN_9) J4 -9 D0394PA00X+027559Y-021591X0669Y0669R180S0
105 | 317ET-(J4-PIN_10) J4 -10 D0394PA00X+027559Y-020591X0669Y0669R180S0
106 | 317+5V J3 -1 D0394PA00X+039222Y-031289X0669Y0669R000S0
107 | 317POSITION J3 -2 D0394PA00X+039222Y-032289X0669Y0669R000S0
108 | 317GND J3 -3 D0394PA00X+039222Y-033289X0669Y0669R000S0
109 | 317+5V J2 -1 D0394PA00X+039222Y-035008X0669Y0669R000S0
110 | 317SLOT J2 -2 D0394PA00X+039222Y-036008X0669Y0669R000S0
111 | 317GND J2 -3 D0394PA00X+039222Y-037008X0669Y0669R000S0
112 | 317GND J1 -1 D0394PA00X+028346Y-034858X0669Y0669R180S0
113 | 317RX J1 -2 D0394PA00X+028346Y-033858X0669Y0669R180S0
114 | 317TX J1 -3 D0394PA00X+028346Y-032858X0669Y0669R180S0
115 | 317+3.3V J1 -4 D0394PA00X+028346Y-031858X0669Y0669R180S0
116 | 327VIN D1 -2 A01X+033071Y-036220X0394Y0295R090S2
117 | 327+5V D1 -1 A01X+033071Y-035299X0394Y0295R090S2
118 | 999
119 |
--------------------------------------------------------------------------------
/PCB/NodePCB/production/positions.csv:
--------------------------------------------------------------------------------
1 | Designator,Mid X,Mid Y,Rotation,Layer
2 | D1,84.0,-90.83,270.0,top
3 | J1,72.0,-84.73,180.0,top
4 | J2,99.625,-91.46,0.0,top
5 | J3,99.625,-82.015,0.0,top
6 | J4,70.0,-63.73,180.0,top
7 | J5,102.0,-63.73,0.0,top
8 | LED1,86.05,-87.0,0.0,top
9 | R1,73.825,-58.0,270.0,top
10 | R2,83.825,-94.0,0.0,top
11 | R3,87.175,-94.0,180.0,top
12 | R4,86.175,-84.0,180.0,top
13 | SW1,72.18,-93.0,0.0,top
14 | SW2,72.18,-98.0,0.0,top
15 | U1,86.0,-65.3125,0.0,top
16 | U2,80.0,-84.0,270.0,top
17 | USB1,85.68,-97.97,0.0,top
18 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Smart Storage System
2 |
3 | ## Overview
4 | This is a versatile and customizable Storage System. It has the ability to combine multiple Storage Systems via the use of ESP32 (a cheap microcontroller) as controllers for the neopixels (indicators). It has a simple but useful WebUI and an API. The storage bins are compatible with Gridfinity 1x4 bins.
5 |
6 | ## Features
7 | - [x] **Gridfinity Compatible**: Easily integrates with the Gridfinity storage system for modular storage.
8 | - [x] **Parametric Design**: Easily customizable bins.
9 | - [x] **ESP32 Controlled**: Scalable system using ESP32 as wireless controllers.
10 | - [x] **Neopixels**: Dynamic lighting indicators.
11 | - [x] **Web UI to Manage Storage**: User-friendly web interface for managing the items.
12 | - [x] **API**: Simple to use API.
13 | - [x] **Node PCB**: Simple ESP32-Wroom based PCB with the necessary connectors.
14 |
15 | ## Media
16 |
17 | Main Website
18 |
19 | 
20 |
21 |
22 |
23 | Add Item Menu
24 |
25 | 
26 |
27 |
28 |
29 | Video
30 |
31 | [](https://cloud-f5ibtbvt0-hack-club-bot.vercel.app/0video.mp4)
32 |
33 |
34 |
35 | ## API Endpoints
36 |
37 | ### List Storage Items
38 | - **Endpoint**: `/api/list`
39 | - **Method**: `GET`
40 | - **Description**: Retrieves a list of all storage items. Supports optional query parameters for filtering by category, node, and position.
41 | - **Query Parameters**:
42 | - `category` (optional): Filter items by category.
43 | - `node` (optional): Filter items by node.
44 | - `position` (optional): Filter items by position.
45 | - `id` (optional): Filter items by ID:
46 | ### Locate Item by ID (GET)
47 | - **Endpoint**: `/api/locateget`
48 | - **Method**: `GET`
49 | - **Description**: Locates an item by its ID and sends a request to the corresponding node to locate the item.
50 | - **Query Parameters**:
51 | - `id` (required): The ID of the item to locate.
52 |
53 | ### List Nodes
54 | - **Endpoint**: `/api/nodes`
55 | - **Method**: `GET`
56 | - **Description**: Retrieves a list of all nodes. Supports optional query parameter for filtering by ID.
57 | - **Query Parameters**:
58 | - `id` (optional): Filter nodes by ID.
59 |
60 | ### Add Storage Item
61 | - **Endpoint**: `/api/additem`
62 | - **Method**: `POST`
63 | - **Description**: Adds a new storage item to the database.
64 | - **Request Body** (JSON):
65 | ```json
66 | {
67 | "name": "string",
68 | "description": "string",
69 | "category": "string",
70 | "quantity": "integer",
71 | "node": "integer",
72 | "position": "integer",
73 | "url": "string",
74 | "slots": "array"
75 |
76 | }
77 | ```
78 |
79 | ### Add Node
80 | - **Endpoint**: `/api/addnode`
81 | - **Method**: `POST`
82 | - **Description**: Adds a new node to the database or updates an existing node if the ID already exists.
83 | - **Request Body** (JSON):
84 | ```json
85 | {
86 | "id": "integer",
87 | "ip": "string",
88 | "positions": "integer"
89 | }
90 | ```
91 |
92 | ### Delete Storage Item
93 | - **Endpoint**: `/api/delete`
94 | - **Method**: `POST`
95 | - **Description**: Deletes a storage item by its ID.
96 | - **Request Body** (JSON):
97 | ```json
98 | {
99 | "id": "integer"
100 | }
101 | ```
102 |
103 | ### Edit Storage Item
104 | - **Endpoint**: `/api/edit`
105 | - **Method**: `POST`
106 | - **Description**: Edits an existing storage item by its ID.
107 | - **Request Body** (JSON):
108 | ```json
109 | {
110 | "id": "integer",
111 | "name": "string",
112 | "description": "string",
113 | "category": "string",
114 | "quantity": "integer",
115 | "node": "integer",
116 | "position": "integer",
117 | "url": "string",
118 | "slots": "array"
119 | }
120 | ```
121 |
122 | ### Move Storage Item
123 | - **Endpoint**: `/api/move`
124 | - **Method**: `POST`
125 | - **Description**: Moves a storage item to a different node and position.
126 | - **Request Body** (JSON):
127 | ```json
128 | {
129 | "id": "integer",
130 | "node": "integer",
131 | "position": "integer"
132 | }
133 | ```
134 |
135 | ### Locate Item by ID (POST)
136 | - **Endpoint**: `/api/locate`
137 | - **Method**: `POST`
138 | - **Description**: Locates an item by its ID and sends a request to the corresponding node to locate the item.
139 | - **Request Body** (JSON):
140 | ```json
141 | {
142 | "id": "integer"
143 | }
144 | ```
145 |
146 |
147 | ## Getting Started
148 |
149 | ### Prerequisites
150 | - [PlatformIO](https://platformio.org) installed on your development environment.
151 | - ESP32 DevBoard or [Node PCB](https://github.com/Pegoku/StorageSystem/tree/master/PCB/NodePCB) .
152 | - Neopixels (WS2812B) or [Indicator PCB](https://github.com/Pegoku/StorageSystem/tree/master/PCB/Indicators).
153 | - Some wire.
154 | - Edit Code/App/static/script.js `server` variable
155 | - Edit Code/Node/include/.env with the correct settings
156 |
157 | ### Docker (API + Website)
158 | 1. Clone the repository:
159 | ```sh
160 | git clone https://github.com/Pegoku/StorageSystem.git
161 | cd StorageSystem
162 | ```
163 | 2. Build and run the Docker containers:
164 | ```sh
165 | docker compose up -d --build
166 | ```
167 |
168 | ### API
169 | 1. Clone the repository:
170 | ```sh
171 | git clone https://github.com/Pegoku/StorageSystem.git
172 | cd StorageSystem/Code/Server
173 | ```
174 | 2. Create a Python virtual environment and install the requirements:
175 | ```sh
176 | python3 -m venv .venv
177 | source .venv/bin/activate
178 | pip install -r requirements.txt
179 | ```
180 | 3. Run the main Python file:
181 | ```sh
182 | python3 main.py
183 | ```
184 |
185 | ### API (Docker)
186 | 1. Clone the repository:
187 | ```sh
188 | git clone https://github.com/Pegoku/StorageSystem.git
189 | cd StorageSystem
190 | ```
191 | 2. Build and run the Docker container:
192 | ```sh
193 | docker buildx build -t storagesystem:server -f server.Dockerfile .
194 | docker run -p 5505:5505 -v ./database.db:/app/database.db storagesystem:server
195 | ```
196 | 3. The API should now be running and accessible at `http://localhost:5505`.
197 |
198 |
199 | ### ESP32
200 | 1. Clone the repository:
201 | ```sh
202 | git clone https://github.com/Pegoku/StorageSystem.git
203 | cd StorageSystem
204 | ```
205 | 2. Install the required libraries and dependencies:
206 | ```sh
207 | platformio run
208 | ```
209 | 3. Connect your ESP32 to your computer.
210 | 4. Edit the `include/.env.template` file and rename it to `include/.env`.
211 | 5. Upload the firmware to the ESP32:
212 | ```sh
213 | platformio run --target upload
214 | ```
215 | 6. Open the serial monitor to check if the installation was successful:
216 | ```sh
217 | platformio device monitor
218 | ```
219 |
220 | ### Website
221 | 1. Clone the repository:
222 | ```sh
223 | git clone https://github.com/Pegoku/StorageSystem.git
224 | cd StorageSystem/Code/App
225 | ```
226 | 2. Create a Python virtual environment and install the requirements:
227 | ```sh
228 | python3 -m venv .venv
229 | source .venv/bin/activate
230 | pip install -r requirements.txt
231 | ```
232 | 3. Run the main Python file:
233 | ```sh
234 | python3 main.py
235 | ```
236 |
237 | ### Website (Docker)
238 | 1. Clone the repository:
239 | ```sh
240 | git clone https://github.com/Pegoku/StorageSystem.git
241 | cd StorageSystem
242 | ```
243 | 2. Build and run the Docker container:
244 | ```sh
245 | docker buildx build -t storagesystem:app -f app.Dockerfile .
246 | docker run -p 5506:5506 storagesystem:app
247 | ```
248 | 3. The website should now be running and accessible at `http://localhost:5506`.
249 |
250 | ## Contributing
251 | Contributions are welcome! Please fork the repository and submit a pull request with your changes.
--------------------------------------------------------------------------------
/app.Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:24.04
2 | EXPOSE 5506
3 |
4 | RUN apt-get update
5 | RUN apt-get install -y python3
6 | RUN apt-get install -y python3-pip
7 | COPY ./Code/App /app
8 | WORKDIR /app
9 | RUN pip3 install --break-system-packages -r requirements.txt
10 | CMD ["python3", "main.py"]
--------------------------------------------------------------------------------
/compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | server:
3 | build:
4 | context: .
5 | dockerfile: server.Dockerfile
6 | image: storagesystem:server
7 | ports:
8 | - "5505:5505"
9 | volumes:
10 | - ./database.db:/app/database.db
11 | restart: unless-stopped
12 |
13 | app:
14 | build:
15 | context: .
16 | dockerfile: app.Dockerfile
17 | image: storagesystem:app
18 | ports:
19 | - "5506:5506"
20 | restart: unless-stopped
21 |
--------------------------------------------------------------------------------
/database.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/database.db
--------------------------------------------------------------------------------
/server.Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:24.04
2 | EXPOSE 5505
3 |
4 | RUN apt-get update
5 | RUN apt-get install -y python3
6 | RUN apt-get install -y python3-pip
7 | COPY ./Code/Server /app
8 | RUN rm /app/database.py || true
9 | WORKDIR /app
10 | RUN pip3 install --break-system-packages -r requirements.txt
11 | CMD ["python3", "main.py"]
--------------------------------------------------------------------------------
/static/AddItem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/static/AddItem.png
--------------------------------------------------------------------------------
/static/Main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/static/Main.png
--------------------------------------------------------------------------------
/static/Video.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pegoku/StorageSystem/fbeb4d7970129fcb5ef569fba21f95a1e853a01d/static/Video.mp4
--------------------------------------------------------------------------------