firestarter 1.3.2__tar.gz → 1.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. {firestarter-1.3.2 → firestarter-1.3.3}/PKG-INFO +1 -1
  2. firestarter-1.3.3/firestarter/__init__.py +1 -0
  3. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/eprom_operations.py +86 -68
  4. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/firmware.py +3 -2
  5. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/hardware.py +22 -9
  6. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/serial_comm.py +56 -38
  7. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter.egg-info/PKG-INFO +1 -1
  8. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter_test.sh +4 -4
  9. {firestarter-1.3.2 → firestarter-1.3.3}/write_test.sh +1 -1
  10. firestarter-1.3.2/firestarter/__init__.py +0 -1
  11. {firestarter-1.3.2 → firestarter-1.3.3}/.github/scripts/update_version.py +0 -0
  12. {firestarter-1.3.2 → firestarter-1.3.3}/.github/workflows/publish.yml +0 -0
  13. {firestarter-1.3.2 → firestarter-1.3.3}/.github/workflows/release.yml +0 -0
  14. {firestarter-1.3.2 → firestarter-1.3.3}/.gitignore +0 -0
  15. {firestarter-1.3.2 → firestarter-1.3.3}/.vscode/launch.json +0 -0
  16. {firestarter-1.3.2 → firestarter-1.3.3}/LICENSE +0 -0
  17. {firestarter-1.3.2 → firestarter-1.3.3}/MANIFEST.in +0 -0
  18. {firestarter-1.3.2 → firestarter-1.3.3}/README.md +0 -0
  19. {firestarter-1.3.2 → firestarter-1.3.3}/doc/package-details.md +0 -0
  20. {firestarter-1.3.2 → firestarter-1.3.3}/doc/protocol-id.md +0 -0
  21. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/avr_tool.py +0 -0
  22. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/config.py +0 -0
  23. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/data/avrdude.conf +0 -0
  24. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/data/database.json +0 -0
  25. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/data/pin-maps.json +0 -0
  26. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/database.py +0 -0
  27. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/eprom_info.py +0 -0
  28. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/ic_layout.py +0 -0
  29. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/main.py +0 -0
  30. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter/utils.py +0 -0
  31. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter.egg-info/SOURCES.txt +0 -0
  32. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter.egg-info/dependency_links.txt +0 -0
  33. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter.egg-info/entry_points.txt +0 -0
  34. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter.egg-info/requires.txt +0 -0
  35. {firestarter-1.3.2 → firestarter-1.3.3}/firestarter.egg-info/top_level.txt +0 -0
  36. {firestarter-1.3.2 → firestarter-1.3.3}/pyproject.toml +0 -0
  37. {firestarter-1.3.2 → firestarter-1.3.3}/requirements.txt +0 -0
  38. {firestarter-1.3.2 → firestarter-1.3.3}/setup.cfg +0 -0
  39. {firestarter-1.3.2 → firestarter-1.3.3}/test.py +0 -0
  40. {firestarter-1.3.2 → firestarter-1.3.3}/things.md +0 -0
  41. {firestarter-1.3.2 → firestarter-1.3.3}/tools/infoic.xml +0 -0
  42. {firestarter-1.3.2 → firestarter-1.3.3}/tools/parse_db.py +0 -0
  43. {firestarter-1.3.2 → firestarter-1.3.3}/tools/pin-layouts.odt +0 -0
  44. {firestarter-1.3.2 → firestarter-1.3.3}/tools/verified.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: firestarter
3
- Version: 1.3.2
3
+ Version: 1.3.3
4
4
  Summary: EPROM burner software for the Relatively Universal ROM Programmer
5
5
  Author-email: Henrik Olsson <henols@gmail.com>
6
6
  Description-Content-Type: text/markdown
@@ -0,0 +1 @@
1
+ __version__ = "1.3.3"
@@ -11,13 +11,13 @@ import os
11
11
  import time
12
12
 
13
13
  try:
14
- from .serial_comm import find_programmer, wait_for_response
15
- from .database import get_eprom
16
- from .utils import extract_hex_to_decimal, print_progress, print_progress_bar
14
+ from .serial_comm import find_programmer, wait_for_response, consume_response
15
+ from .database import get_eprom, search_chip_id
16
+ from .utils import extract_hex_to_decimal, print_progress_bar
17
17
  except ImportError:
18
- from serial_comm import find_programmer, wait_for_response
19
- from database import get_eprom
20
- from utils import extract_hex_to_decimal, print_progress, print_progress_bar
18
+ from serial_comm import find_programmer, wait_for_response, consume_response
19
+ from database import get_eprom, search_chip_id
20
+ from utils import extract_hex_to_decimal, print_progress_bar
21
21
 
22
22
  # Constants
23
23
  BUFFER_SIZE = 512
@@ -48,7 +48,7 @@ def read(eprom_name, output_file=None, force=False):
48
48
  eprom["force"] = True
49
49
 
50
50
  if not output_file:
51
- output_file = f"{eprom_name}.bin"
51
+ output_file = f"{eprom_name.upper()}.bin"
52
52
  print(f"Reading EPROM {eprom_name}, saving to {output_file}")
53
53
 
54
54
  ser = find_programmer(eprom)
@@ -78,24 +78,26 @@ def read(eprom_name, output_file=None, force=False):
78
78
  prefix=f"Address: 0x{from_address:X} - 0x{to_address:X}",
79
79
  suffix=f"- {time.time() - start_time:.2f}s",
80
80
  )
81
+
81
82
  ser.write("OK".encode("ascii"))
82
83
  ser.flush()
83
84
  elif resp == "OK":
84
85
  break
85
86
  elif resp == "ERROR":
86
- print(f"\nError: {info}")
87
- return 1
88
- else:
89
- print(f"\nUnexpected response: {info}")
87
+ # print(f"\nError: {info}")
90
88
  return 1
89
+ # else:
90
+ # print(f"\nUnexpected response: {info}")
91
+ # return 1
91
92
 
92
93
  print(f"\nRead complete in: {time.time() - start_time:.2f} seconds")
93
94
  print(f"Data saved to {output_file}")
94
95
  except Exception as e:
95
96
  print(f"Error while reading: {e}")
96
97
  finally:
98
+ consume_response(ser)
97
99
  ser.close()
98
-
100
+ return 0
99
101
 
100
102
  def write(eprom_name, input_file, address=None, ignore_blank_check=False, force=False):
101
103
  """
@@ -146,46 +148,42 @@ def write(eprom_name, input_file, address=None, ignore_blank_check=False, force=
146
148
  while True:
147
149
  data = file.read(BUFFER_SIZE)
148
150
  if not data:
151
+ print("\nEnd of file reached")
149
152
  ser.write(int(0).to_bytes(2, byteorder="big"))
150
153
  ser.flush()
151
154
  resp, info = wait_for_response(ser)
152
- print("\nEnd of file reached")
153
- print(info)
155
+ while resp != "OK":
156
+ if resp == "ERROR":
157
+ return 1
158
+ resp, info = wait_for_response(ser)
154
159
  break
155
160
 
156
161
  ser.write(len(data).to_bytes(2, byteorder="big"))
157
162
  ser.flush()
158
163
  resp, info = wait_for_response(ser)
159
- if resp == "ERROR":
160
- print(f"\nError writing: {info}")
161
- return 1
164
+ while resp != "OK":
165
+ if resp == "ERROR":
166
+ return 1
167
+ resp, info = wait_for_response(ser)
168
+
162
169
  nr_bytes = ser.write(data)
163
170
  bytes_written += nr_bytes
164
171
  ser.flush()
165
-
166
- while True:
167
- resp, info = wait_for_response(ser)
168
- if resp == "OK":
169
- # percent = int(bytes_written / file_size * 100)
170
- # print_progress(
171
- # percent,
172
- # bytes_written - nr_bytes + write_address,
173
- # bytes_written + write_address,
174
- # )
175
- from_address = bytes_written - nr_bytes + write_address
176
- to_address = bytes_written + write_address
177
- print_progress_bar(
178
- bytes_written / BUFFER_SIZE,
179
- total_iterations,
180
- prefix=f"Address: 0x{from_address:X} - 0x{to_address:X}",
181
- suffix=f"- {time.time() - start_time:.2f}s",
182
- )
183
- break
184
- elif resp == "ERROR":
185
- print(f"\nError: {info}")
172
+ # print(f"Bytes written: {bytes_written}")
173
+ resp, info = wait_for_response(ser)
174
+ while resp != "OK":
175
+ if resp == "ERROR":
186
176
  return 1
187
- else:
188
- print(f"Warning: {info}")
177
+ resp, info = wait_for_response(ser)
178
+
179
+ from_address = bytes_written - nr_bytes + write_address
180
+ to_address = bytes_written + write_address
181
+ print_progress_bar(
182
+ bytes_written / BUFFER_SIZE,
183
+ total_iterations,
184
+ prefix=f"Address: 0x{from_address:X} - 0x{to_address:X}",
185
+ suffix=f"- {time.time() - start_time:.2f}s",
186
+ )
189
187
  if bytes_written == mem_size:
190
188
  break
191
189
 
@@ -194,6 +192,7 @@ def write(eprom_name, input_file, address=None, ignore_blank_check=False, force=
194
192
  print(f"Error while writing: {e}")
195
193
  return 1
196
194
  finally:
195
+ consume_response(ser)
197
196
  ser.close()
198
197
  return 0
199
198
 
@@ -211,15 +210,21 @@ def erase(eprom_name):
211
210
  return 1
212
211
 
213
212
  eprom["state"] = STATE_ERASE
214
- ser = find_programmer(eprom)
215
- if not ser:
216
- return 1
217
-
218
- resp, info = wait_for_response(ser)
219
- if resp == "OK":
220
- print(f"EPROM {eprom_name} erased successfully.")
221
- elif resp == "ERROR":
222
- print(f"Error erasing EPROM {eprom_name}: {info}")
213
+ try:
214
+ ser = find_programmer(eprom)
215
+ if not ser:
216
+ return 1
217
+
218
+ resp, info = wait_for_response(ser)
219
+ if resp == "OK":
220
+ print(f"EPROM {eprom_name} erased successfully.")
221
+ return 0
222
+ elif resp == "ERROR":
223
+ print(f"Error erasing EPROM {eprom_name}")
224
+ return 1
225
+ finally:
226
+ consume_response(ser)
227
+ ser.close()
223
228
 
224
229
 
225
230
  def check_chip_id(eprom_name):
@@ -238,17 +243,26 @@ def check_chip_id(eprom_name):
238
243
  ser = find_programmer(eprom)
239
244
  if not ser:
240
245
  return 1
241
-
242
- resp, info = wait_for_response(ser)
243
- if resp == "OK":
244
- print(f"Chip ID check passed for {eprom_name}: {info}")
245
- elif resp == "ERROR":
246
- print(f"Chip ID check failed for {eprom_name}: {info}")
246
+ try:
247
+ resp, info = wait_for_response(ser)
248
+ if resp == "OK":
249
+ print(f"Chip ID check passed for {eprom_name}: {info}")
250
+ return 0
247
251
  chip_id = extract_hex_to_decimal(info)
248
- print(
249
- f"Extracted chip ID: {chip_id}" if chip_id else "Failed to extract chip ID."
250
- )
251
-
252
+ if not chip_id:
253
+ print(f"Failed to extract chip ID.")
254
+ else:
255
+ eproms = search_chip_id(chip_id)
256
+ if not eproms:
257
+ print(f"Chip ID 0x{chip_id:x} not found in the database.")
258
+ else:
259
+ print(f"Chip ID 0x{chip_id:x} found in the database:")
260
+ for eprom in eproms:
261
+ print(eprom)
262
+ return 1
263
+ finally:
264
+ consume_response(ser)
265
+ ser.close()
252
266
 
253
267
  def blank_check(eprom_name):
254
268
  """
@@ -263,12 +277,16 @@ def blank_check(eprom_name):
263
277
  return 1
264
278
 
265
279
  eprom["state"] = STATE_CHECK_BLANK
266
- ser = find_programmer(eprom)
267
- if not ser:
268
- return 1
269
-
270
- resp, info = wait_for_response(ser)
271
- if resp == "OK":
272
- print(f"EPROM {eprom_name} is blank.")
273
- elif resp == "ERROR":
274
- print(f"Blank check failed for {eprom_name}: {info}")
280
+ try:
281
+ ser = find_programmer(eprom)
282
+ if not ser:
283
+ return 1
284
+
285
+ resp, info = wait_for_response(ser)
286
+ if resp == "OK":
287
+ print(f"EPROM {eprom_name} is blank.")
288
+ elif resp == "ERROR":
289
+ print(f"Blank check failed for {eprom_name}")
290
+ finally:
291
+ consume_response(ser)
292
+ ser.close()
@@ -11,12 +11,12 @@ import os
11
11
  import requests
12
12
 
13
13
  try:
14
- from .serial_comm import find_programmer, wait_for_response, find_comports
14
+ from .serial_comm import find_programmer, wait_for_response, find_comports, consume_response
15
15
  from .config import get_config_value, set_config_value
16
16
  from .avr_tool import Avrdude
17
17
  from .utils import verbose
18
18
  except ImportError:
19
- from serial_comm import find_programmer, wait_for_response, find_comports
19
+ from serial_comm import find_programmer, wait_for_response, find_comports, consume_response
20
20
  from config import get_config_value, set_config_value
21
21
  from avr_tool import Avrdude
22
22
  from utils import verbose
@@ -103,6 +103,7 @@ def firmware_check(port=None):
103
103
  )
104
104
  return False, ser.portstr, url
105
105
  finally:
106
+ consume_response(ser)
106
107
  ser.close()
107
108
 
108
109
 
@@ -1,8 +1,9 @@
1
1
  import time
2
+
2
3
  try:
3
- from .serial_comm import find_programmer, wait_for_response
4
+ from .serial_comm import find_programmer, wait_for_response, consume_response
4
5
  except ImportError:
5
- from serial_comm import find_programmer, wait_for_response
6
+ from serial_comm import find_programmer, wait_for_response, consume_response
6
7
 
7
8
  STATE_READ_VPP = 11
8
9
  STATE_READ_VPE = 12
@@ -32,6 +33,7 @@ def hardware():
32
33
  print(f"Failed to read hardware revision. {resp}: {version}")
33
34
  return 1
34
35
  finally:
36
+ consume_response(ser)
35
37
  ser.close()
36
38
  return 0
37
39
 
@@ -53,15 +55,20 @@ def config(rev=None, r1=None, r2=None):
53
55
  ser = find_programmer(data)
54
56
  if not ser:
55
57
  return 1
56
- ser.write("OK".encode("ascii"))
57
- r, version = wait_for_response(ser)
58
- if r == "OK":
59
- print(f"Config: {version}")
60
- else:
61
- print(r)
62
- return 1
58
+ try:
59
+ # ser.write("OK".encode("ascii"))
60
+ r, version = wait_for_response(ser)
61
+ if r == "OK":
62
+ print(f"Config: {version}")
63
+ else:
64
+ # print(r)
65
+ return 1
66
+ finally:
67
+ consume_response(ser)
68
+ ser.close()
63
69
  return 0
64
70
 
71
+
65
72
  def read_vpp(timeout=None):
66
73
  """
67
74
  Reads the VPP voltage from the programmer.
@@ -94,6 +101,7 @@ def read_voltage(state, timeout=None):
94
101
  print(f"Error reading {type} voltage: {info}")
95
102
  return 1
96
103
  ser.write("OK".encode("ascii"))
104
+ ser.flush()
97
105
 
98
106
  if timeout:
99
107
  start = time.time()
@@ -104,5 +112,10 @@ def read_voltage(state, timeout=None):
104
112
  print()
105
113
  return 0
106
114
  ser.write("OK".encode("ascii"))
115
+ ser.flush()
116
+ except Exception as e:
117
+ print(f"Error while reading {type} voltage: {e}")
107
118
  finally:
119
+ consume_response(ser)
108
120
  ser.close()
121
+ return 1
@@ -54,10 +54,8 @@ def check_port(port, data, baud_rate=BAUD_RATE):
54
54
  res, msg = wait_for_response(ser)
55
55
  while res != "OK":
56
56
  if res == "ERROR":
57
- raise Exception(msg)
58
- if res == "TIMEOUT_ERROR":
59
57
  return None
60
- print(f"{res} - {msg}")
58
+ res, msg = wait_for_response(ser)
61
59
 
62
60
  if verbose():
63
61
  print(f"Programmer: {msg}")
@@ -143,6 +141,54 @@ def find_programmer(data, port=None):
143
141
  return None
144
142
 
145
143
 
144
+ def read_response(ser):
145
+ while ser.in_waiting > 0:
146
+ byte_array = ser.readline()
147
+ res = read_filtered_bytes(byte_array)
148
+ type = None
149
+ msg = None
150
+ try:
151
+ if res:
152
+ if "OK:" in res:
153
+ msg = res.split("OK:")[-1].strip()
154
+ type = "OK"
155
+ return
156
+ elif "INFO:" in res:
157
+ msg = res.split("INFO:")[-1].strip()
158
+ type = "INFO"
159
+ return
160
+ elif "DEBUG:" in res:
161
+ msg = res.split("DEBUG:")[-1].strip()
162
+ type = "DEBUG"
163
+ return
164
+ elif "ERROR:" in res:
165
+ msg = res.split("ERROR:")[-1].strip()
166
+ type = "ERROR"
167
+ return
168
+ elif "WARN:" in res:
169
+ msg = res.split("WARN:")[-1].strip()
170
+ type = "WARN"
171
+ return
172
+ elif "DATA:" in res:
173
+ msg = res.split("DATA:")[-1].strip()
174
+ type = "DATA"
175
+ return
176
+ else:
177
+ return
178
+ finally:
179
+ write_feedback(type, msg)
180
+ # if type == "ERROR":
181
+ # raise Exception(msg)
182
+ return type, msg
183
+ return None, None
184
+
185
+
186
+ def consume_response(ser):
187
+ time.sleep(0.1)
188
+ while read_response(ser)[0] != None:
189
+ time.sleep(0.3)
190
+
191
+
146
192
  def wait_for_response(ser):
147
193
  """
148
194
  Waits for a response from the serial connection.
@@ -155,41 +201,13 @@ def wait_for_response(ser):
155
201
  """
156
202
  timeout = time.time() + 2 # Set timeout period
157
203
  while time.time() < timeout:
158
- if ser.in_waiting > 0:
159
- byte_array = ser.readline()
160
- res = read_filtered_bytes(byte_array)
161
- msg = None
162
- type = None
163
- try:
164
- if res:
165
- if "OK:" in res:
166
- msg = res.split("OK:")[-1].strip()
167
- type = "OK"
168
- return
169
- elif "INFO:" in res:
170
- msg = res.split("INFO:")[-1].strip()
171
- write_feedback("INFO", msg)
172
- # return "INFO", msg
173
- elif "ERROR:" in res:
174
- msg = res.split("ERROR:")[-1].strip()
175
- type = "ERROR"
176
- return
177
- elif "WARN:" in res:
178
- msg = res.split("WARN:")[-1].strip()
179
- type = "WARN"
180
- return
181
- elif "DATA:" in res:
182
- msg = res.split("DATA:")[-1].strip()
183
- type = "DATA"
184
- return
185
- timeout = time.time() + 2 # Reset timeout
186
- finally:
187
- write_feedback(type, msg)
188
- if type:
189
- return type, msg
204
+ type, msg = read_response(ser)
205
+ if type and type != "INFO" and type != "DEBUG" and type != "WARN":
206
+ return type, msg
207
+ # time.sleep(0.1)
190
208
  msg = f"Timeout, no response on {ser.portstr}"
191
- write_feedback("ERROR", msg)
192
- return "TIMEOUT_ERROR", msg
209
+ write_feedback("Error", msg)
210
+ raise Exception(msg)
193
211
 
194
212
 
195
213
  def write_feedback(type, msg):
@@ -199,7 +217,7 @@ def write_feedback(type, msg):
199
217
  Args:
200
218
  msg (str): The feedback message.
201
219
  """
202
- if msg and (verbose() or type == "ERROR" or type == "WARN"):
220
+ if msg and (verbose() or (type.upper() == "ERROR" or type == "WARN")):
203
221
  print(f"{type}: {msg}")
204
222
 
205
223
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: firestarter
3
- Version: 1.3.2
3
+ Version: 1.3.3
4
4
  Summary: EPROM burner software for the Relatively Universal ROM Programmer
5
5
  Author-email: Henrik Olsson <henols@gmail.com>
6
6
  Description-Content-Type: text/markdown
@@ -12,7 +12,7 @@ if [ ! -d "$TEMP_DIR" ]; then
12
12
  fi
13
13
 
14
14
  # Trap to clean up the temporary files on exit or interrupt
15
- trap "rm -rf $TEMP_DIR; echo 'Cleaned up temp files'; exit" EXIT
15
+ # trap "rm -rf $TEMP_DIR; echo 'Cleaned up temp files'; exit" EXIT
16
16
 
17
17
  # Convert TARGET_NAME to uppercase
18
18
  EPROM_NAME=$(echo "$EPROM_NAME" | tr '[:lower:]' '[:upper:]')
@@ -104,7 +104,7 @@ then
104
104
  exit 1
105
105
  fi
106
106
  echo
107
- sleep 0.5
107
+ sleep 1
108
108
  echo "---------------------------------"
109
109
  echo "VPP"
110
110
  echo "---------------------------------"
@@ -115,7 +115,7 @@ then
115
115
  exit 1
116
116
  fi
117
117
  echo
118
- sleep 0.5
118
+ sleep 1
119
119
  echo "---------------------------------"
120
120
  echo "VPE"
121
121
  echo "---------------------------------"
@@ -126,7 +126,7 @@ then
126
126
  exit 1
127
127
  fi
128
128
  echo
129
- sleep 0.5
129
+ sleep 1
130
130
 
131
131
  # ------------------------------ FIRMWARE TESTS ------------------------------
132
132
 
@@ -15,7 +15,7 @@ fi
15
15
  rm -f "$TEMP_DIR"/*
16
16
 
17
17
  # Trap to clean up the temporary files on exit or interrupt
18
- trap "rm -rf $TEMP_DIR; echo 'Cleaned up temp files'; exit" EXIT
18
+ # trap "rm -rf $TEMP_DIR; echo 'Cleaned up temp files'; exit" EXIT
19
19
 
20
20
  # Convert TARGET_NAME to uppercase
21
21
  EPROM_NAME=$(echo "$EPROM_NAME" | tr '[:lower:]' '[:upper:]')
@@ -1 +0,0 @@
1
- __version__ = "1.3.2"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes