├── .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 | 80 |
81 | 82 |
83 | 84 |
85 | 86 |
87 | 88 |
89 | 90 |
91 | 92 |
93 | 94 |

95 | 96 |
97 | 98 | 99 |
100 |
101 | 102 |
103 | 104 |
105 | 106 |
107 | 108 |
109 | 110 |
111 | 112 |
113 | 114 |
115 | 116 |

117 | 118 |
119 | 120 | 121 |
122 |
123 | 124 |
125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 206 |
207 | 208 | 209 |
210 |
211 |
212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 |
DescriptionQuantityNodePositionDeleteLocateEdit
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 | ![Main Website](static/Main.png) 20 |
21 | 22 |
23 | Add Item Menu 24 | 25 | ![Add Item Menu](static/AddItem.png) 26 |
27 | 28 |
29 | Video 30 | 31 | [![Video](https://cloud-f5ibtbvt0-hack-club-bot.vercel.app/0video.mp4)](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 --------------------------------------------------------------------------------