Scanner
Detailed documentation of the ALS scanner module
In here, you will find detailed documentation about ALS modules and processes.
From what a module is to how a process works, you will find everything you need to know about the bits and bolts of ALS.
An ALS module is an elaborated processing unit responsible for a specific task.
Modules are dumb and isolated. They have no knowledge of other parts of the application. They just do their job and report to the application
A utility module is a very simple module that is in charge of auxiliary tasks inside ALS.
ALS uses 2 utility modules:
A main module is a specialized module that is in charge of image processing.
A main module is started with ALS and keeps polling its queue for new images to process, until the application is closed.
flowchart LR
    START((Start))
    TEST{{Image in Queue ?}}
    TAKE[Take Image from Queue]
    PROCESS[Process Image]
    BROADCAST[Broadcast Result]
    WAIT[Wait 20ms]
    
    START --> TEST
    TEST -- Yes --> TAKE
    TEST -- No --> WAIT
    TAKE --> PROCESS
    PROCESS --> BROADCAST
    BROADCAST --> WAIT
    WAIT --> TEST
    
    classDef bounds fill: #333, stroke: #666, stroke-width: 2px, color: #BBB, font-family: 'Poppins', sans-serif
    classDef step fill: #444, stroke: #622, stroke-width:2px, color: #c6c6c6, font-family: 'Poppins',sans-serif
    classDef wait  fill: #444, stroke: #262, stroke-width: 2px, color: #c6c6c6, font-family: 'Poppins', sans-serif
    classDef test fill: #444, stroke: #226,stroke-width: 2px, color: #c6c6c6, font-family:'Poppins', sans-serif
    class START bounds
    class TEST test
    class TAKE step
    class PROCESS step
    class BROADCAST step
    class WAIT wait
Main module workflow
ALS has 4 main modules:
A pipeline is a specialized main module that splits its work by handing its image over to a series of simple tasks called processes.
It manages the list of processes to run on the images in its queue and the order in which they are executed.
It ensures that each process is executed in order, with each process working on the result of the previous one.
Once the last process is done, the pipeline broadcasts the result to the application.
flowchart LR
    START((Start))
    TEST{{Image in Queue ?}}
    TAKE[Take Image from Queue]
    subgraph Process
        A[Process A]
        B[Process B]
    end
    BROADCAST[Broadcast Result]
    WAIT[Wait 20ms]
    
    START --> TEST
    TEST -- Yes --> TAKE
    TEST -- No --> WAIT
    TAKE --> A
    A -.-> B
    B --> BROADCAST
    BROADCAST --> WAIT
    WAIT --> TEST
    
    classDef bounds fill: #333, stroke: #666, stroke-width: 2px, color: #BBB, font-family: 'Poppins', sans-serif
    classDef step fill: #444, stroke: #622, stroke-width:2px, color: #c6c6c6, font-family: 'Poppins',sans-serif
    classDef process fill: #333, stroke: #622, stroke-width: 2px, color: #c6c6c6, font-family: 'Poppins', sans-serif
    classDef wait  fill: #444, stroke: #262,stroke-width: 2px, color: #c6c6c6, font-family:'Poppins', sans-serif
    classDef test fill: #444, stroke: #226, stroke-width: 2px, color: #c6c6c6, font-family: 'Poppins', sans-serif
    class START bounds
    class TEST test
    class TAKE step
    class A process
    class B process
    class BROADCAST step
    class WAIT wait
Pipeline workflow
2 of the main modules are pipelines:
A process is the smallest processing unit in ALS
It is managed by its parent pipeline and is responsible for a specific task to perform on a given image.
As implied earlier, ALS is split into two realms:
Below is the detailed flow within each realm.
From the file system to the Stacker module
flowchart LR
    subgraph Filesystem
        SCAN_FOLDER@{ shape: lin-cyl, label: "Scan Folder" }
    end
        
    subgraph Scanner Module 
        SCANNER_ENGINE[Engine]
    end
           
    subgraph Preprocess Module
        direction TB
        PREPROCESS_ENGINE[Engine]
        HOT_PIXEL[Hot Pixel Removal]
        DARK_SUB[Dark Subtraction]
        DEBAYER[DeBayer]
    end  
    subgraph Stacker Module
        direction TB
        STACK_ENGINE[Engine]
    end
    SCAN_FOLDER -.-> SCANNER_ENGINE
    SCANNER_ENGINE -.-> PREPROCESS_ENGINE
    PREPROCESS_ENGINE -.-> STACK_ENGINE
    
    classDef module fill:#333,stroke:darkred,stroke-width:2px
    classDef main_module fill:#333,stroke:darkred,stroke-width:4px,color:#c6c6c6,font-family:'Poppins',sans-serif
    classDef process fill:#262626,stroke:darkred,stroke-width:1px,color:#c3c3c3,font-family:'Poppins',sans-serif
    classDef folder fill:#555,stroke:#970,stroke-width:2px,color:#c6c6c6,font-family:'Poppins',sans-serif
    classDef display fill:#555,stroke:#222,stroke-width:2px,color:#c6c6c6,font-family:'Poppins',sans-serif
    
    class SCANNER_ENGINE module
    class PREPROCESS_ENGINE main_module
    class STACK_ENGINE main_module
    class HOT_PIXEL process
    class DARK_SUB process
    class DEBAYER process
    class SCAN_FOLDER folder
Flow inside the subs realm
From the Stacker module to the displays and output filesystem
flowchart LR
    subgraph Stacker Module
        direction TB
        STACK_ENGINE[Engine]
    end
    
    subgraph Process Module
        direction TB
        PROCESS_ENGINE[Engine]
        STRETCH[Autostretch]
        LEVELS[Levels]
        COLOR_BAL[Color Balance]
    end 
    
    subgraph Save Module
        direction TB
        SAVE_ENGINE[Engine]
    end
    subgraph Filesystem
        direction TB
        
        WEB_FOLDER@{ shape: lin-cyl, label: "Web Folder" }
        WORK_FOLDER@{ shape: lin-cyl, label: "Work Folder" }
    end
    
    subgraph Server Module
        direction TB
        SERVER_ENGINE[Engine]
    end
    
    subgraph GUI
        direction TB
        SCREEN@{ shape: curv-trap, label: "Central zone" }
        HISTOGRAM@{ shape: curv-trap, label: "Histogram" }
    end
    
    STACK_ENGINE --> PROCESS_ENGINE
    
    PROCESS_ENGINE --> SAVE_ENGINE
    PROCESS_ENGINE ---> SCREEN
    PROCESS_ENGINE ---> HISTOGRAM
    
    SAVE_ENGINE --> WEB_FOLDER
    SAVE_ENGINE --> WORK_FOLDER
    WEB_FOLDER --> SERVER_ENGINE
    
    classDef module fill:#333,stroke:darkred,stroke-width:2px
    classDef main_module fill:#333,stroke:darkred,stroke-width:4px,color:#c6c6c6,font-family:'Poppins',sans-serif
    classDef process fill:#262626,stroke:darkred,stroke-width:1px,color:#c3c3c3,font-family:'Poppins',sans-serif
    classDef folder fill:#555,stroke:#970,stroke-width:2px,color:#c6c6c6,font-family:'Poppins',sans-serif
    classDef display fill:#555,stroke:#222,stroke-width:2px,color:#c6c6c6,font-family:'Poppins',sans-serif
    
    class STACK_ENGINE main_module
    class PROCESS_ENGINE main_module
    class SAVE_ENGINE main_module
    class SERVER_ENGINE module
    class SCREEN display
    class HISTOGRAM display
    class STRETCH process
    class LEVELS process
    class COLOR_BAL process
    class WEB_FOLDER folder
    class WORK_FOLDER folder
Flow inside the images realm
Detailed documentation of the ALS scanner module
Detailed documentation of the ALS Preprocess module
Detailed documentation of the ALS Stack module
Detailed documentation of the ALS Process module
Detailed documentation of the ALS Save module
Detailed documentation of the ALS Image Server module