mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-02-12 16:52:51 +00:00
update docs
This commit is contained in:
46
DEVELOPER.md
46
DEVELOPER.md
@@ -148,10 +148,29 @@ enum UploadOperation { create, modify, delete }
|
||||
- **Clear intent**: `operation == UploadOperation.delete` is unambiguous
|
||||
|
||||
**Session Pattern:**
|
||||
- `AddNodeSession`: For creating new nodes
|
||||
- `EditNodeSession`: For modifying existing nodes
|
||||
- `AddNodeSession`: For creating new nodes with single or multiple directions
|
||||
- `EditNodeSession`: For modifying existing nodes, preserving all existing directions
|
||||
- No "DeleteSession": Deletions are immediate (simpler)
|
||||
|
||||
**Multi-Direction Support:**
|
||||
Sessions use a simple model for handling multiple directions:
|
||||
```dart
|
||||
class AddNodeSession {
|
||||
List<double> directions; // [90, 180, 270] - all directions
|
||||
int currentDirectionIndex; // Which direction is being edited
|
||||
|
||||
// Slider always shows the current direction
|
||||
double get directionDegrees => directions[currentDirectionIndex];
|
||||
set directionDegrees(value) => directions[currentDirectionIndex] = value;
|
||||
}
|
||||
```
|
||||
|
||||
**Direction Interaction:**
|
||||
- **Add**: New directions start at 0° and are automatically selected for editing
|
||||
- **Remove**: Current direction removed from list (minimum 1 direction)
|
||||
- **Cycle**: Switch between existing directions in the list
|
||||
- **Submit**: All directions combined as semicolon-separated string (e.g., "90;180;270")
|
||||
|
||||
**Why no delete session:**
|
||||
Deletions don't need position dragging or tag editing - they just need confirmation and queuing. A session would add complexity without benefit.
|
||||
|
||||
@@ -182,6 +201,11 @@ Users expect instant response to their actions. By immediately updating the cach
|
||||
- **Orange ring**: Node currently being edited
|
||||
- **Red ring**: Nodes pending deletion
|
||||
|
||||
**Direction cone visual states:**
|
||||
- **Full opacity**: Active session direction (currently being edited)
|
||||
- **Reduced opacity (40%)**: Inactive session directions
|
||||
- **Standard opacity**: Existing node directions (when not in edit mode)
|
||||
|
||||
**Cache tags for state tracking:**
|
||||
```dart
|
||||
'_pending_upload' // New node waiting to upload
|
||||
@@ -190,6 +214,17 @@ Users expect instant response to their actions. By immediately updating the cach
|
||||
'_original_node_id' // For drawing connection lines
|
||||
```
|
||||
|
||||
**Multi-direction parsing:**
|
||||
The app supports nodes with multiple directions specified as semicolon-separated values:
|
||||
```dart
|
||||
// OSM tag: direction="90;180;270"
|
||||
List<double> get directionDeg {
|
||||
final raw = tags['direction'] ?? tags['camera:direction'];
|
||||
// Splits on semicolons, parses each direction, normalizes to 0-359°
|
||||
return [90.0, 180.0, 270.0]; // Results in multiple FOV cones
|
||||
}
|
||||
```
|
||||
|
||||
**Why underscore prefix:**
|
||||
These are internal app tags, not OSM tags. The underscore prefix makes this explicit and prevents accidental upload to OSM.
|
||||
|
||||
@@ -270,10 +305,17 @@ Users often want to follow their location while keeping the map oriented north.
|
||||
|
||||
**Data pipeline:**
|
||||
- **CSV ingestion**: Downloads utility permit data from alprwatch.org
|
||||
- **Dynamic field parsing**: Stores all CSV columns (except `location` and `ticket_no`) for flexible display
|
||||
- **GeoJSON processing**: Handles Point, Polygon, and MultiPolygon geometries
|
||||
- **Proximity filtering**: Hides suspected locations near confirmed devices
|
||||
- **Regional availability**: Currently select locations, expanding regularly
|
||||
|
||||
**Display approach:**
|
||||
- **Required fields**: `ticket_no` (for heading) and `location` (for map positioning)
|
||||
- **Dynamic display**: All other CSV fields shown automatically, no hardcoded field list
|
||||
- **Server control**: Field names and content controlled server-side via CSV headers
|
||||
- **Brutalist rendering**: Fields displayed as-is from CSV, empty fields hidden
|
||||
|
||||
**Why utility permits:**
|
||||
Utility companies often must file permits when installing surveillance infrastructure. This creates a paper trail that can indicate potential surveillance sites before devices are confirmed through direct observation.
|
||||
|
||||
|
||||
11
README.md
11
README.md
@@ -30,11 +30,12 @@ A comprehensive Flutter app for mapping public surveillance infrastructure with
|
||||
### Device Management
|
||||
- **Comprehensive profiles**: Built-in profiles for major manufacturers (Flock Safety, Motorola/Vigilant, Genetec, Leonardo/ELSAG, Neology) plus custom profile creation
|
||||
- **Full CRUD operations**: Create, edit, and delete surveillance devices
|
||||
- **Direction visualization**: Interactive field-of-view cones showing camera viewing angles
|
||||
- **Multi-direction support**: Devices can have multiple viewing directions (e.g. "90;180") with individual field-of-view cones
|
||||
- **Direction visualization**: Interactive field-of-view cones showing camera viewing angles with opacity-based selection
|
||||
- **Bulk operations**: Tag multiple devices efficiently with profile-based workflow
|
||||
|
||||
### Surveillance Intelligence
|
||||
- **Suspected locations**: Display potential surveillance sites from utility permit data (select locations, more added regularly)
|
||||
- **Suspected locations**: Display potential surveillance sites from utility permit data with dynamic field display (select locations, more added regularly)
|
||||
- **Proximity alerts**: Get notified when approaching mapped surveillance devices, with configurable distance and background notifications
|
||||
- **Location search**: Find addresses and points of interest to aid in mapping missions
|
||||
|
||||
@@ -57,7 +58,7 @@ A comprehensive Flutter app for mapping public surveillance infrastructure with
|
||||
1. **Install** the app on iOS or Android - a welcome popup will guide you through key information
|
||||
2. **Enable location** permissions
|
||||
3. **Log into OpenStreetMap**: Choose upload mode and get OAuth2 credentials
|
||||
4. **Add your first device**: Tap the "New Node" button, position the pin, set direction, select a profile, and tap submit
|
||||
4. **Add your first device**: Tap the "New Node" button, position the pin, set direction(s), select a profile, and tap submit
|
||||
5. **Edit or delete devices**: Tap any device marker to view details, then use Edit or Delete buttons
|
||||
|
||||
**New to OpenStreetMap?** Visit [deflock.me](https://deflock.me) for complete setup instructions and community guidelines.
|
||||
@@ -89,6 +90,10 @@ cp lib/keys.dart.example lib/keys.dart
|
||||
- Are offline areas preferred for fast loading even when online? Check working.
|
||||
- Fix network indicator - only done when fetch queue is empty!
|
||||
|
||||
### Recently Completed
|
||||
- **Multi-direction support**: Devices can now have multiple viewing directions (e.g., "90;180") with individual FOV cones
|
||||
- **Dynamic suspected location fields**: Server-controlled field display for suspected locations data
|
||||
|
||||
### Current Development
|
||||
- Import/Export map providers
|
||||
- Swap in alprwatch.org/directions avoidance routing API
|
||||
|
||||
Reference in New Issue
Block a user