/* * MachineStatus.c * * Created on: Aug 15, 2019 * Author: shlomo */ #include #include #include /* puts(), etc. */ #include "Common/report/report.h" #include "include.h" #include "PMR/common/MessageContainer.pb-c.h" #include "PMR/MachineStatus/StartMachineStatusUpdateRequest.pb-c.h" #include "PMR/MachineStatus/StopMachineStatusUpdateRequest.pb-c.h" #include "PMR/MachineStatus/StartMachineStatusUpdateResponse.pb-c.h" #include "PMR/MachineStatus/StopMachineStatusUpdateResponse.pb-c.h" #include "PMR/Diagnostics/EventType.pb-c.h" #include "PMR/MachineStatus/MachineStatus.pb-c.h" #include "PMR/MachineStatus/MachineState.pb-c.h" #include "PMR/MachineStatus/IDSPackLevel.pb-c.h" #include "PMR/IFS/CartridgeStatus.pb-c.h" #include "PMR/IFS/InkFillingStatus.pb-c.h" #include "PMR/IFS/StartInkFillingStatusRequest.pb-c.h" #include "PMR/IFS/StartInkFillingStatusResponse.pb-c.h" #include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" #include "Drivers/Heater/TemperatureSensor.h" #include "drivers/Motors/Motor.h" #include "StateMachines/Initialization/InitSequence.h" #include "Modules/General/MachineStatus.h" #include "Modules/AlarmHandling/AlarmHandling.h" #include "Modules/Control/MillisecTask.h" #include "modules/waste/waste_ex.h" #include "modules/ids/ids_ex.h" #include "modules/ifs/ifs.h" MachineState StoredMachineStatus = MACHINE_STATE__PowerUp; bool SetMAchineStateProblem = false; void SetMachineStatus (MachineState New_state) { MachineState State = New_state; if (StoredMachineStatus == MACHINE_STATE__PowerOff) { ReportWithPackageFilter(GeneralFilter,"not changing MachineStatus while on power down",__FILE__,__LINE__,State,RpWarning,StoredMachineStatus, 0); return; } if (State == MACHINE_STATE__Ready) { if ((GetMachineState()data.len, requestContainer->data.data); ustrncpy (MachineUpdateToken, requestContainer->token,36); start_machine_status_update_request__free_unpacked(request,NULL); MachineUpdateResponseFunc(); return status; } void MachineUpdateStopReporting(void) { MachineUpdateToken[0] = 0; } uint32_t StopMachineUpdateFunc(MessageContainer* requestContainer) { MessageContainer responseContainer; StopMachineStatusUpdateRequest* request = stop_machine_status_update_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); StopMachineStatusUpdateResponse response = STOP_MACHINE_STATUS_UPDATE_RESPONSE__INIT; //TODO Handle the request!!!! MachineUpdateStopReporting(); responseContainer = createContainer(MESSAGE_TYPE__StopMachineStatusUpdateResponse, MachineUpdateToken, false, &response, &stop_machine_status_update_response__pack, &stop_machine_status_update_response__get_packed_size); responseContainer.has_continuous = true; responseContainer.continuous = true; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); my_free(responseContainer.data.data); //USBCDCD_sendData(container_buffer, container_size,10); SendChars(container_buffer, container_size); //free (container_buffer); return OK; } /*struct _Cartridge { ProtobufCMessage base; protobuf_c_boolean has_slot; CartridgeSlot slot; CartridgeTagContent *tag; protobuf_c_boolean has_index; int32_t index; }; typedef enum _CartridgeSlot { CARTRIDGE_SLOT__Ink = 0, CARTRIDGE_SLOT__WasteMiddle = 1, CARTRIDGE_SLOT__WasteLower = 2 PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(CARTRIDGE_SLOT) } CartridgeSlot; * */ char WasteEmptyingToken[36+1] = {0}; uint32_t CartridgeStateUpdate(CartridgeSlot Slot, int32_t index, CartridgeState State, double percentage) { if (WasteEmptyingToken[0] == 0) return ERROR; uint32_t status = NOT_SUPPORTED; MessageContainer responseContainer; CartridgeStatus CartridgeStatus = CARTRIDGE_STATUS__INIT; Cartridge CartData = CARTRIDGE__INIT; StartInkFillingStatusResponse response = START_INK_FILLING_STATUS_RESPONSE__INIT; response.status = my_malloc(sizeof(InkFillingStatus)); ink_filling_status__init(response.status); response.status->cartridgesstatuses = my_malloc(sizeof(void *)); response.status->n_cartridgesstatuses = 1; response.status->cartridgesstatuses[0] = &CartridgeStatus; CartridgeStatus.has_state = true; CartridgeStatus.state = State; CartridgeStatus.cartridge = &CartData; if (percentage>1) { CartridgeStatus.has_progresspercentage = true; CartridgeStatus.progresspercentage = percentage; } CartData.has_slot = true; CartData.slot = Slot; CartData.has_index = true; CartData.index = index; /* struct _CartridgeStatus { ProtobufCMessage base; Cartridge *cartridge; protobuf_c_boolean has_state; CartridgeState state; protobuf_c_boolean has_progresspercentage; double progresspercentage; char *message; }; size_t n_cartridgesstatuses; CartridgeStatus **cartridgesstatuses; typedef enum _CartridgeState { CARTRIDGE_STATE__None = 0, CARTRIDGE_STATE__Absent = 1, CARTRIDGE_STATE__Exists = 2, CARTRIDGE_STATE__Inserted = 3, CARTRIDGE_STATE__Filling = 4, CARTRIDGE_STATE__FillingCompleted = 5, CARTRIDGE_STATE__Emptying = 6, CARTRIDGE_STATE__EmptyingCompleted = 7, CARTRIDGE_STATE__Empty = 8, CARTRIDGE_STATE__Full = 9, CARTRIDGE_STATE__Error = 10 PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(CARTRIDGE_STATE) } CartridgeState; */ responseContainer = createContainer(MESSAGE_TYPE__StartInkFillingStatusResponse, WasteEmptyingToken, false, &response, &start_ink_filling_status_response__pack, &start_ink_filling_status_response__get_packed_size); responseContainer.has_continuous = true; responseContainer.continuous = true; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); my_free(responseContainer.data.data); //USBCDCD_sendData(container_buffer, container_size,10); SendChars((char*)container_buffer, container_size); //MessageContainer responseContainer; my_free(response.status->cartridgesstatuses); my_free(response.status); return status; } uint32_t StartInkFillingStatusRequestFunc(MessageContainer* requestContainer) { uint32_t status = NOT_SUPPORTED; //MessageContainer responseContainer; // MachineUpdateInitParams InitParams; Report("StartInkFillingStatusRequestFunc",__FILE__,__LINE__,(int)0,RpWarning,(int)0,0); StartInkFillingStatusRequest* request = start_ink_filling_status_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); ustrncpy (WasteEmptyingToken, requestContainer->token,36); CartridgeStateUpdate(CARTRIDGE_SLOT__Ink,0, CARTRIDGE_STATE__None,0); CartridgeStateUpdate(CARTRIDGE_SLOT__WasteMiddle, 0, CARTRIDGE_STATE__None,0); CartridgeStateUpdate(CARTRIDGE_SLOT__WasteLower, 1, CARTRIDGE_STATE__None,0); start_ink_filling_status_request__free_unpacked(request,NULL); return status; // case MESSAGE_TYPE__StartWasteEmptyingRequest: }