Protobuf Description

syntax = "proto3";

package RemoteApiRs232;

option java_package = "com.thp.remoteapi_rs232";
option java_outer_classname = "ApiMessageProtos";

message ApiMessage {
    uint32 protocol_version = 1;    // currently always with value 1
    uint32 sequence_id = 2;         // wrap around to 0 at 255; i.e. it is treated as uint8
    // The api_messages are separated into 4 categories with a certain value range
    // 0x1000 - 0x1FFF: Request messages
    // 0x4000 - 0x4FFF: Response messages where response 0x4nnn belongs to request 0x1nnn
    // 0x8000 - 0x8FFF: Event messages
    // 0xc000 - 0xcFFF: Response messages not relatable to a specific request message
    oneof api_message {
        StartProduct start_product = 0x1001;
        GetProductList get_product_list = 0x1002;
        CancelProduct cancel_product = 0x1003 [deprecated = true];
        GetAvailableProductIds get_available_product_ids = 0x1004;
        GetActiveEvents get_active_events = 0x1005;
        ForceRinse force_rinse = 0x1006;
        PostponeRinse postpone_rinse = 0x1007;
        StartProductCategoryByName start_product_category_by_name = 0x1008;
        GetSwVersion get_sw_version = 0x1009;
        GetNSFCompliantCleaning get_nsf_compliant_cleaning = 0x100a [deprecated = true];
        GetRunningOrders get_running_orders = 0x100b;
        GetQueuedOrders get_queued_orders = 0x100c;
        GetOrder get_order = 0x100d;
        Confirm confirm = 0x100e;
        Cancel cancel = 0x100f;
        StartCleaning start_cleaning = 0x1010;
        GetSetting get_setting = 0x1011;

        ProductStarted product_started = 0x4001;
        ProductList product_list = 0x4002;
        ProductCancelled product_cancelled = 0x4003 [deprecated = true];
        AvailableProductIds available_product_ids = 0x4004;
        ActiveEvents active_events = 0x4005;
        RinseForced rinse_forced = 0x4006;
        RinsePostponed rinse_postponed = 0x4007;
        ProductCategoryByNameStarted product_category_by_name_started = 0x4008;
        SwVersion sw_version = 0x4009;
        NSFCompliantCleaning nsf_compliant = 0x400a [deprecated = true];
        RunningOrders running_orders = 0x400b;
        QueuedOrders queued_orders = 0x400c;
        OrderResponse order_response = 0x400d;
        Confirmed confirmed = 0x400e;
        Cancelled cancelled = 0x400f;
        CleaningStarted cleaning_started = 0x4010;
        SettingResponse setting_response = 0x4011;

        ErrorEvent error_event = 0x8000;
        ProductFinished product_finished = 0x8001 [deprecated = true];
        ProductAvailabilityChanged product_availability_changed = 0x8002;
        RinsingUpcoming rinsing_upcoming = 0x8003;
        RinseStarted rinse_started = 0x8004;
        AutomaticCleaningRunning auto_clean_is_running = 0x8005 [deprecated = true];
        ProgressUpdated progress_updated = 0x8006 [deprecated = true];
        Order order_changed = 0x8007;
        OrdersRemoved orders_removed = 0x8008;
        Setting setting_changed = 0x8009;

        UnknownMessage unknown_message = 0xc000;
        WrongCrc wrong_crc = 0xc001;
        BrokenMessage broken_message = 0xc002;
    }
    // The API message is followed by two bytes in big endian byte order that contain a CRC16 for this message.
    // The CRC polynomial is 0xC86C and an initial value of 0xffff is used.
    // This CRC is not considered to be part of the ApiMessage and has to be removed prior to
    // parsing the message with protobuf
}

enum ResponseCode {
    UNKNOWN_RESPONSE_CODE = 0;
    SUCCESS = 1;
    INVALID_PARAMETER = 2;
    DBUS_ADAPTER_ERROR = 3;
    GENERAL_ERROR = 4;
    SYSTEM_BUSY = 100;
    UNKNOWN_PRODUCT_ID = 101;
    PRODUCT_NOT_AVAILABLE = 102;
    PRODUCT_ID_NOT_POURING = 103;
    MAX_POSTPONE_NUM_REACHED = 104;
    NO_RINSING_UPCOMING = 105;
    SETTING_ID_NOT_AVAILABLE = 106;
}

message StartProduct {
    string product_id = 1;
    double start_delay_s = 2 [deprecated = true]; 
}

message CancelProduct {
    string product_id = 1;   
    double cancel_delay_s = 2 [deprecated = true]; 
}

message StartProductCategoryByName {
    string product_name = 1;
    double start_delay_s = 2 [deprecated = true];  
}

message GetProductList { }

message GetAvailableProductIds { }

message GetActiveEvents { }

message ForceRinse { }

message PostponeRinse {
    uint32 milliseconds = 1; 
}

message GetSwVersion { }

message GetNSFCompliantCleaning {
}

message GetRunningOrders {
}

message GetQueuedOrders {
}

message GetOrder {
    string order_id = 1;
}

message Confirm {
    string order_id = 1;
}

message Cancel {
    string order_id = 1;
}

message StartCleaning {
}

message GetSetting {
    uint32 setting_id = 1;
}

message ProductStarted {
    ResponseCode response_code = 1;
    string order_id = 2;
}

message ProductCategoryByNameStarted {
    ResponseCode response_code = 1;
    string order_id = 2;
}

message ProductCancelled {
    ResponseCode response_code = 1;
}

message ProductList {
    ResponseCode response_code = 1;
    map<string, string> product_list = 2;
}

message AvailableProductIds {
    ResponseCode response_code = 1;
    repeated string available_product_ids = 2;
}

message ActiveEvents {
    ResponseCode response_code = 1;
    repeated ErrorEvent active_events = 2;
}

message RinseForced {
    ResponseCode response_code = 1;
}

message RinsePostponed {
    ResponseCode response_code = 1;
}

message SwVersion {
    ResponseCode response_code = 1;
    string sw_version = 2;
}

message NSFCompliantCleaning {
    ResponseCode response_code = 1;
    bool nsf_compliant = 2;
}

message RunningOrders {
    ResponseCode response_code = 1;
    repeated Order orders = 2;
}

message QueuedOrders {
    ResponseCode response_code = 1;
    repeated Order orders = 2;
}

message OrderResponse {
    ResponseCode response_code = 1;
    Order order = 2;
}

message Confirmed {
    ResponseCode response_code = 1;
}

message Cancelled {
    ResponseCode response_code = 1;
}

message CleaningStarted {
    ResponseCode response_code = 1;
    string order_id = 2;
}

message SettingResponse {
    ResponseCode response_code = 1;
    Setting setting = 2;
}

message ErrorEvent {
    uint32 error_number = 1;    
    string title = 2;           
    uint32 source_index = 3;    
}

message ProductFinished {
    string product_id = 1;
    bool success = 2;
    optional ProductResultDetails product_result_details = 3;
}

message ProductResultDetails {
    repeated CoffeeResult coffee_result = 1;
}

message CoffeeResult {
    double extraction_time_s = 1;
    double puck_thickness_after_squeeze_mm = 2;
}

message ProductAvailabilityChanged {
    repeated string product_ids = 1;
}


message RinsingUpcoming {
    uint32 start_in_ms = 1;
}

message RinseStarted {
}

message AutomaticCleaningRunning {
    bool is_running = 1;
}

message ProgressUpdated {
    uint32 current_step = 1;
    uint32 total_number_of_steps = 2;
}

message Order {
    string order_id = 1;
    string product_id = 2;
    string status = 3;
    bool is_finished = 4;
    bool is_cancel_allowed = 5;
    bool is_confirm_allowed = 6;
    bool is_cancelled = 7;
    bool is_confirmed = 8;
    OrderAction action = 9;
    repeated AdditionalInformation additional_information = 10;
}

message OrderAction {
    string context = 1;
    string action = 2;
}

message AdditionalInformation {
    string key = 1;
    oneof interaction {
        double value_double = 2;
        string value_string = 3;
    }
}

message OrdersRemoved {
    repeated string order_ids = 1;
}

message Setting {
    uint32 setting_id = 1;
    string value = 2;
}

message UnknownMessage { }
message WrongCrc { }
message BrokenMessage { }