-
Notifications
You must be signed in to change notification settings - Fork 213
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Added the logic to display the user drawn clipart to the badge. #981
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -45,8 +45,6 @@ abstract class RetryBleState extends BleState { | |
attempt++; | ||
if (attempt < _maxRetries) { | ||
logger.d("Retrying ($attempt/$_maxRetries)..."); | ||
await Future.delayed( | ||
const Duration(seconds: 2)); // Wait before retrying | ||
} else { | ||
Comment on lines
47
to
48
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. issue (performance): Reconsider removing the delay between Bluetooth retry attempts Removing the delay between retry attempts could lead to rapid, successive retries. This might overwhelm the Bluetooth stack or the device. Consider reintroducing a delay, possibly with an exponential backoff strategy for more robust error handling. |
||
logger.e("Max retries reached. Last exception: $lastException"); | ||
lastException = | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -28,23 +28,14 @@ class FileHelper { | |||||||||||||||||||||||
return File(path).writeAsString(data); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// static Future<String> _readFromFile(String filename) async { | ||||||||||||||||||||||||
// try { | ||||||||||||||||||||||||
// final path = await _getFilePath(filename); | ||||||||||||||||||||||||
// return await File(path).readAsString(); | ||||||||||||||||||||||||
// } catch (e) { | ||||||||||||||||||||||||
// return ''; // Return an empty string if there's an error | ||||||||||||||||||||||||
// } | ||||||||||||||||||||||||
// } | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
static String _generateUniqueFilename() { | ||||||||||||||||||||||||
final String uniqueId = uuid.v4(); | ||||||||||||||||||||||||
final String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); | ||||||||||||||||||||||||
return 'data_${timestamp}_$uniqueId.json'; | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Add a new image to the cache | ||||||||||||||||||||||||
void addToCache(Uint8List imageData) { | ||||||||||||||||||||||||
void addToCache(Uint8List imageData, String filename) { | ||||||||||||||||||||||||
int key; | ||||||||||||||||||||||||
if (imageCacheProvider.availableKeys.isNotEmpty) { | ||||||||||||||||||||||||
// Reuse the lowest available key | ||||||||||||||||||||||||
|
@@ -57,7 +48,11 @@ class FileHelper { | |||||||||||||||||||||||
key++; | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
imageCacheProvider.imageCache[key] = imageData; | ||||||||||||||||||||||||
//storing the user drawn clipart to the badge in the form of a list | ||||||||||||||||||||||||
//the first element of the list is the filename and the second element is the key | ||||||||||||||||||||||||
//while parsing the vector we can take the filename and generate the hex for that vector | ||||||||||||||||||||||||
//therefore transfering the vector to the physiacl badge will be easier. | ||||||||||||||||||||||||
imageCacheProvider.imageCache[[filename, key]] = imageData; | ||||||||||||||||||||||||
Comment on lines
+51
to
+55
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. suggestion: Consider improving the comment explaining the new cache structure The current comment is a bit unclear. Consider explaining why this structure was chosen and how it benefits the system. For example: 'Store user-drawn clipart with both filename and key for easier vector-to-badge transfer. The filename allows hex generation, while the key maintains ordering.'
Suggested change
|
||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Remove an image from the cache | ||||||||||||||||||||||||
|
@@ -70,13 +65,14 @@ class FileHelper { | |||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Generate a Uint8List from a 2D list (image data) and add it to the cache | ||||||||||||||||||||||||
Future<void> _addImageDataToCache(List<List<dynamic>> imageData) async { | ||||||||||||||||||||||||
Future<void> _addImageDataToCache( | ||||||||||||||||||||||||
List<List<dynamic>> imageData, String filename) async { | ||||||||||||||||||||||||
// Convert List<List<dynamic>> to List<List<int>> | ||||||||||||||||||||||||
List<List<int>> intImageData = | ||||||||||||||||||||||||
imageData.map((list) => list.cast<int>()).toList(); | ||||||||||||||||||||||||
Uint8List imageBytes = | ||||||||||||||||||||||||
await imageUtils.convert2DListToUint8List(intImageData); | ||||||||||||||||||||||||
addToCache(imageBytes); | ||||||||||||||||||||||||
addToCache(imageBytes, filename); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Read all files, parse the 2D lists, and add to cache | ||||||||||||||||||||||||
|
@@ -92,7 +88,7 @@ class FileHelper { | |||||||||||||||||||||||
final List<dynamic> decodedData = jsonDecode(content); | ||||||||||||||||||||||||
final List<List<dynamic>> imageData = | ||||||||||||||||||||||||
decodedData.cast<List<dynamic>>(); | ||||||||||||||||||||||||
await _addImageDataToCache(imageData); | ||||||||||||||||||||||||
await _addImageDataToCache(imageData, file.path.split('/').last); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
@@ -126,6 +122,28 @@ class FileHelper { | |||||||||||||||||||||||
logger.d('Image saved to file: $filename'); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
//Add the image to the image cache after saving it to a file | ||||||||||||||||||||||||
await _addImageDataToCache(image); | ||||||||||||||||||||||||
await _addImageDataToCache(image, filename); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
Future<List<List<int>>?> readFromFile(String filename) async { | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. suggestion: Consider enhancing error handling in readFromFile method The current error handling returns null for all error cases. Consider differentiating between file not found and other IO errors. You might also want to propagate specific errors to the caller for better error handling upstream.
|
||||||||||||||||||||||||
try { | ||||||||||||||||||||||||
final path = await _getFilePath(filename); | ||||||||||||||||||||||||
final file = File(path); | ||||||||||||||||||||||||
if (await file.exists()) { | ||||||||||||||||||||||||
final content = await file.readAsString(); | ||||||||||||||||||||||||
final List<dynamic> decodedData = jsonDecode(content); | ||||||||||||||||||||||||
final List<List<dynamic>> image = decodedData.cast<List<dynamic>>(); | ||||||||||||||||||||||||
//COnvert the List<list<Dynamic>> to List<List<int>> | ||||||||||||||||||||||||
List<List<int>> imageData = | ||||||||||||||||||||||||
image.map((list) => list.cast<int>()).toList(); | ||||||||||||||||||||||||
return imageData; | ||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||
logger.d('File not found: $filename'); | ||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||
logger.e('Error reading file: $e'); | ||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should have some delay when retrying. You can reduce the delay but Retrying would not make sense if the failure is transient and you're trying again without waiting