Python Package of Event-Oriented Simulation for visible light communication
Project description
VLCSim - Visible Light Communication Simulator
VLCSim is an Event-Oriented simulator package for Visible Light Communication (VLC) systems. It provides a comprehensive framework for simulating dynamic VLC environments with support for resource allocation algorithms, RF fallback, and flexible room configurations.
Features
- Dynamic Environment: Simulate real-time connections with arrivals and departures
- Hybrid Communication: VLC with RF fallback support
- Flexible Resource Allocation: Implement custom allocation algorithms
- TDM Frame Management: Time-Division Multiplexing with configurable slices
- Configurable Parameters: Customize VLC/room parameters for different scenarios
- Event-Driven Simulation: Efficient discrete event simulation engine
- Performance Metrics: Built-in SNR and capacity calculations
Installation
From Source
git clone https://gitlab.com/DaniloBorquez/vlcsim.git
cd vlcsim
pip install -e .
Dependencies
pip install -r requirements.txt
Main dependencies:
numpy: Numerical computations and random number generationpytest: Testing framework (development)pytest-cov: Coverage reporting (development)
Quick Start
from vlcsim import Simulator, VLed, RF
# Create a 10x10x3m room with 20 grids and 0.8 reflection coefficient
sim = Simulator(10.0, 10.0, 3.0, 20, 0.8)
# Add VLed access points
vled = VLed(5.0, 5.0, 3.0, 2, 2, 20, 60) # x, y, z, nLedsX, nLedsY, power, theta
vled.sliceTime = 0.1
vled.slicesInFrame = 10
sim.scenario.addVLed(vled)
# Add RF access point as fallback
rf = RF(5.0, 5.0, 1.0)
rf.sliceTime = 0.1
rf.slicesInFrame = 10
sim.scenario.addRF(rf)
# Configure simulation parameters
sim.lambdaS = 3 # Arrival rate
sim.mu = 10 # Service rate
sim.goalConnections = 1000
# Initialize and run
sim.init()
sim.run()
Core Concepts
Events
The simulator uses 5 types of events:
| Event | Description |
|---|---|
| ARRIVE | New connection arrives to the system |
| RESUME | Connection begins transmission |
| PAUSE | Connection pauses transmission |
| DEPARTURE | Connection ends transmission |
| RETRYING | Unallocated connection attempts to reconnect |
Scenario Components
- VLed: Visible Light LED access points with configurable power and beam angle
- RF: Radio Frequency access points for fallback communication
- Receiver: Mobile devices with photodetector capabilities
- Connection: Represents a data transmission session with capacity requirements
Resource Allocation
VLCSim supports custom resource allocation algorithms. Implement your own strategy by defining a function that assigns connections to access points and frame slices.
Advanced Example
from vlcsim import *
def custom_allocation_algorithm(receiver, connection: Connection,
scenario: Scenario, controller: Controller):
"""Custom allocation: best VLed or RF fallback if overloaded"""
vleds = scenario.vleds
capacities = [scenario.capacityVled(receiver, vled) for vled in vleds]
best_idx = capacities.index(max(capacities))
# Use RF if VLed overloaded or no capacity
if (controller.numberOfActiveConnections(vleds[best_idx]) > 5
or capacities[best_idx] == 0):
connection.AP = scenario.rfs[0]
connection.receiver.capacityFromAP = scenario.capacityRf(receiver, connection.AP)
else:
connection.AP = vleds[best_idx]
connection.receiver.capacityFromAP = capacities[best_idx]
# Calculate required slices
numberOfSlices = connection.numberOfSlicesNeeded(
connection.capacityRequired, connection.receiver.capacityFromAP
)
# Assign slices in frames
actualSlice = connection.nextSliceInAPWhenArriving(connection.AP)
assigned = 0
# Try current frame
for slice in range(actualSlice, connection.AP.slicesInFrame):
if (not controller.framesState(connection.AP)
or not controller.framesState(connection.AP)[0][slice]):
connection.assignFrameSlice(0, slice)
assigned += 1
if assigned == numberOfSlices:
break
# Assign remaining slices in future frames
frameIndex = 1
while assigned < numberOfSlices:
if frameIndex >= len(controller.framesState(connection.AP)):
connection.assignFrameSlice(frameIndex, 0)
else:
for slice in range(connection.AP.slicesInFrame):
if not controller.framesState(connection.AP)[frameIndex][slice]:
connection.assignFrameSlice(frameIndex, slice)
break
assigned += 1
frameIndex += 1
return Controller.status.ALLOCATED, connection
# Setup simulation with 20x20x2.15m room
sim = Simulator(20.0, 20.0, 2.15, 10, 0.8)
# Add 4 VLeds in a grid pattern
for x, y in [(-7.5, -7.5), (-7.5, 7.5), (7.5, -7.5), (7.5, 7.5)]:
vled = VLed(x, y, 2.15, 60, 60, 20, 70)
vled.sliceTime = 0.2
vled.slicesInFrame = 10
vled.B = 0.5e5
sim.scenario.addVLed(vled)
# Add RF fallback
rf = RF(0, 0, 0.85)
rf.sliceTime = 0.2
rf.slicesInFrame = 10
rf.B = 0.5e5
sim.scenario.addRF(rf)
# Configure simulation parameters
sim.set_allocation_algorithm(custom_allocation_algorithm)
sim.goalConnections = 60
sim.lambdaS = 1 # 1 arrival per time unit
sim.mu = 30 # Average service time
sim.upper_random_wait = 20
sim.lower_random_wait = 2
sim.lower_capacity_required = 1e5
sim.upper_capacity_required = 5e5
# Run simulation
sim.init()
sim.run()
Testing
VLCSim has comprehensive test coverage (72%) with 166 tests.
Run Tests
# All tests
pytest tests/
# With coverage
pytest tests/ --cov=vlcsim --cov-report=term
# Specific module
pytest tests/test_controller.py -v
pytest tests/test_simulator.py -v
pytest tests/test_scenario.py -v
Coverage by Module
| Module | Coverage |
|---|---|
vlcsim/__init__.py |
100% |
vlcsim/scene.py |
88% |
vlcsim/controller.py |
71% |
vlcsim/simulator.py |
49% |
| Total | 72% |
API Reference
Simulator Class
Main simulation engine for event-driven VLC simulations.
sim = Simulator(length, width, height, nGrids, rho)
sim.init() # Initialize simulation
sim.run() # Execute simulation
sim.set_allocation_algorithm(func) # Set custom allocator
sim.print_initial_info() # Display scenario configuration
Key Parameters:
lambdaS: Arrival rate (connections per time unit)mu: Service rate parametergoalConnections: Total connections to simulateseedX, seedY, seedZ: Random seeds for position generationupper_random_wait, lower_random_wait: Retry delay bounds (seconds)upper_capacity_required, lower_capacity_required: Capacity bounds (bps)
Scenario Class
Room configuration with access points.
scenario.addVLed(vled) # Add VLC access point
scenario.addRF(rf) # Add RF access point
scenario.capacityVled(receiver, vled) # Calculate VLC capacity
scenario.capacityRf(receiver, rf) # Calculate RF capacity
Controller Class
Manages connections and resource allocation.
controller.assignConnection(connection, time)
controller.numberOfActiveConnections(ap)
controller.framesState(ap)
controller.APPosition(ap)
controller.init() # Initialize controller with APs
Connection Class
Represents a data transmission session.
connection.assignFrameSlice(frame, slice)
connection.numberOfSlicesNeeded(capacity, rate)
connection.nextSliceInAPWhenArriving(ap)
Key Properties:
id: Connection identifierreceiver: Receiver objectAP: Assigned access point (VLed or RF)allocated: Allocation status (boolean)capacityRequired: Required data rate (bps)frameSlice: Assigned TDM slices
Configuration Parameters
VLed Parameters
vled = VLed(x, y, z, nLedsX, nLedsY, ledPower, theta)
x, y, z: Position coordinates (meters)nLedsX, nLedsY: LED array dimensions (rows x columns)ledPower: LED power (mW)theta: Semi-angle at half illumination (degrees)sliceTime: Time slice duration (seconds)slicesInFrame: Number of slices per frameB: Bandwidth (Hz)
RF Parameters
rf = RF(x, y, z, bf=5e6, pf=40, BERf=10e-5)
x, y, z: Position coordinates (meters)bf: Bandwidth (Hz)pf: Transmission power (dBm)BERf: Bit Error Rate targetsliceTime: Time slice duration (seconds)slicesInFrame: Number of slices per frame
Receiver Parameters
receiver = Receiver(x, y, z, aDet, ts, index, fov)
x, y, z: Position coordinates (meters)aDet: Detector area (m²)ts: Optical filter transmittanceindex: Refractive indexfov: Field of view (degrees)
Contributing
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create feature branch (
git flow feature start feature-name) - Make your changes
- Run tests (
pytest tests/) - Commit changes (
git commit -m 'Add feature') - Push branch (
git push origin feature/feature-name) - Open Pull Request
Development
Project Structure
vlcsim/
├── vlcsim/
│ ├── __init__.py # Package initialization
│ ├── controller.py # Connection management and allocation
│ ├── scene.py # Scenario, VLed, RF, Receiver classes
│ └── simulator.py # Event-driven simulation engine
├── tests/
│ ├── test_controller.py # Controller tests (42 tests)
│ ├── test_simulator.py # Simulator tests (40 tests)
│ ├── test_connection.py # Connection tests (29 tests)
│ ├── test_scenario.py # Scenario tests
│ ├── test_vled.py # VLed tests
│ ├── test_rf.py # RF tests
│ └── test_receiver.py # Receiver tests
├── docs/ # Documentation
├── CHANGELOG.md # Version history
├── README.md # This file
└── requirements.txt # Dependencies
Running Development Environment
# Install in development mode
pip install -e .
# Install development dependencies
pip install -r requirements.txt
# Run tests with coverage
pytest tests/ --cov=vlcsim --cov-report=html
# View coverage report
open htmlcov/index.html
License
This project is licensed under the MIT License - see the LICENSE.md file for details.
Project Statistics
- Lines of Code: ~2,500
- Test Coverage: 72%
- Number of Tests: 166 passing
- Python Version: 3.8+
- Modules: 3 main modules (controller, scene, simulator)
- Last Updated: November 27, 2025
Acknowledgments
- Based on research in Visible Light Communication systems
- Event-driven simulation methodology
- TDM resource allocation strategies
- Hybrid VLC/RF communication systems
Contact
For questions, issues, or contributions, please:
- Open an issue on GitLab: https://gitlab.com/DaniloBorquez/vlcsim/-/issues
- Submit a merge request
- Contact the maintainers
Made with dedication for VLC research and simulation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vlcsim-0.4.1.tar.gz.
File metadata
- Download URL: vlcsim-0.4.1.tar.gz
- Upload date:
- Size: 27.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.10.19 Linux/5.15.154+
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79e0e630758f3dba9a026dcdc57d42496c20b49a47f224cfaad86bccc04a8c58
|
|
| MD5 |
6ac4b12632b1d5a5ff4c423dc1b7e2a2
|
|
| BLAKE2b-256 |
1ed9b08bb4bc3327e9dfd16deeb415b83111021efac3a628326ec7072a97cc12
|
File details
Details for the file vlcsim-0.4.1-py3-none-any.whl.
File metadata
- Download URL: vlcsim-0.4.1-py3-none-any.whl
- Upload date:
- Size: 25.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.10.19 Linux/5.15.154+
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1381cc4140b2c094ecd12b05edc941b4d39154a25be34a4398b4c8b5666a73e
|
|
| MD5 |
a5dd1f46b006656fd140dcbccf0aa6da
|
|
| BLAKE2b-256 |
6ec7a6ef4781a4435ad25d3b7e819bd31ff9c077ce48daed74b90d0b2f460f49
|