Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "COM.h"
- ///
- /// YAUVeC
- /// Brief description. Detailed stuff.
- ///
- COM::COM() {
- m_nError = 0;
- m_nCycleCount = 0;
- m_eSystemStatus = STATUS_NORMAL;
- m_bUARTMessageReady = FALSE;
- m_bSendSPIData = FALSE;
- m_cBlink.SetLEDGPIO(7);
- m_eCOMState = COM_INIT;
- m_bRestart = FALSE;
- m_bIdentifyModulesAgain = FALSE;
- m_bUARTMessageBeingProcessed = TRUE;
- m_bServoSetup = FALSE;
- m_bServoPreSetup = TRUE;
- }
- COM::~COM() {
- }
- void COM::Run() {
- CustomSetup();
- while(1) {
- m_cBlink.ManageLED();
- CustomLoop();
- }
- }
- void COM::CustomSetup() {
- m_cSPIProtocol.RunAsMaster();
- m_cSPIProtocol.InitSPI();
- m_cUART.Init();
- m_cBlink.SetLEDGPIO(7);
- m_cBlink.SetLEDOnCount(10);
- m_cBlink.SetLEDOffCount(100);
- m_cBlink.BlinkLED();
- SetupSlotsSS();
- }
- void COM::CustomLoop() {
- m_nCycleCount++;
- switch (m_eCOMState) {
- CASE COM_INIT:
- m_eCOMState = Init() ? COM_BUILD_MODULE_CAPACITY_MATRIX : COM_TROUBLESHOOT;
- break;
- CASE COM_BUILD_MODULE_CAPACITY_MATRIX:
- m_eCOMState = BuildModuleCapacityMatrix() ? COM_MANAGE_SENSORS : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_POWER:
- m_eCOMState = ManagePower() ? COM_MANAGE_SENSORS : COM_ANSWER_UART;
- break;
- CASE COM_MANAGE_SENSORS:
- m_eCOMState = ManageSensors() ? COM_MANAGE_GPSS : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_GPSS:
- m_eCOMState = ManageGPSs() ? COM_MANAGE_KALMAN : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_KALMAN:
- m_eCOMState = ManageKalman() ? COM_MANAGE_GUIDANCE : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_GUIDANCE:
- m_eCOMState = ManageGuidance() ? COM_MANAGE_NAVIGATION : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_NAVIGATION:
- m_eCOMState = ManageNavigation() ? COM_MANAGE_CONTROL : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_CONTROL:
- m_eCOMState = ManageControl() ? COM_MANAGE_SERVOS : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_SERVOS:
- m_eCOMState = ManageServos() ? COM_ANSWER_UART : COM_TROUBLESHOOT;
- break;
- CASE COM_ANSWER_UART:
- m_eCOMState = AnswerUART() ? COM_VERIFY_FLAGS : COM_TROUBLESHOOT;
- break;
- CASE COM_VERIFY_FLAGS:
- m_eCOMState = COM_EVALUATE_STATUS;
- VerifyFlags();
- break;
- CASE COM_EVALUATE_STATUS:
- m_eCOMState = EvaluateStatus() ? COM_BROADCAST_TELEMETRY : COM_TROUBLESHOOT;
- break;
- CASE COM_BROADCAST_TELEMETRY:
- m_eCOMState = BroadcastTelemetry() ? COM_MANAGE_HEARTBEAT : COM_TROUBLESHOOT;
- break;
- CASE COM_MANAGE_HEARTBEAT:
- m_eCOMState = ManageHeartbeat() ? COM_MANAGE_POWER : COM_TROUBLESHOOT;
- break;
- DEFAULT: m_eCOMState = COM_INIT;
- }
- }
- bool COM::Init() {
- m_bRestart = FALSE;
- RETURN TRUE;
- }
- bool COM::BuildModuleCapacityMatrix() {
- FOR (uint8_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot++) {
- m_anCapacitiesPerSlot[nSlot] = m_cSPIProtocol.ReadLongViaSPI(B00_MODULE_CAPACITIES, nSlot);
- }
- FOR (uint32_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot++) { // nSlot must be uint32 too FOR the code TO WORK
- FOR (uint32_t nCapacityBit = 0; nCapacityBit < TOTAL_CAPACITIES; nCapacityBit++) {
- IF (m_anCapacitiesPerSlot[nSlot] & (1UL << nCapacityBit)) {
- m_anSlotListPerCapacity[nCapacityBit] |= (1UL << nSlot);
- }
- }
- }
- m_bIdentifyModulesAgain = FALSE;
- RETURN TRUE;
- }
- bool COM::ManageSensors() {
- FOR (uint8_t nSlot = 1; nSlot < NUM_SLOTS; nSlot++) {
- ReadAndFuse(BIT09_ACCELEROMETER, B09_ACCEL_X_AVG, B09_ACCEL_X_STD_DEV, nSlot);
- ReadAndFuse(BIT09_ACCELEROMETER, B09_ACCEL_Y_AVG, B09_ACCEL_Y_STD_DEV, nSlot);
- ReadAndFuse(BIT09_ACCELEROMETER, B09_ACCEL_Z_AVG, B09_ACCEL_Z_STD_DEV, nSlot);
- ReadAndFuse(BIT10_GYROSCOPE, B10_GYRO_X_AVG, B10_GYRO_X_STD_DEV, nSlot);
- ReadAndFuse(BIT10_GYROSCOPE, B10_GYRO_Y_AVG, B10_GYRO_Y_STD_DEV, nSlot);
- ReadAndFuse(BIT10_GYROSCOPE, B10_GYRO_Z_AVG, B10_GYRO_Z_STD_DEV, nSlot);
- ReadAndFuse(BIT11_MAGNETOMETER, B11_MAG_X_AVG, B11_MAG_X_STD_DEV, nSlot);
- ReadAndFuse(BIT11_MAGNETOMETER, B11_MAG_Y_AVG, B11_MAG_Y_STD_DEV, nSlot);
- ReadAndFuse(BIT11_MAGNETOMETER, B11_MAG_Z_AVG, B11_MAG_Z_STD_DEV, nSlot);
- ReadAndFuse(BIT12_BAROMETER, B12_BARO_P_AVG, B12_BARO_P_STD_DEV, nSlot);
- ReadAndFuse(BIT12_BAROMETER, B12_BARO_T_AVG, B12_BARO_T_STD_DEV, nSlot);
- ReadAndFuse(BIT12_BAROMETER, B12_BARO_ALT_AVG, B12_BARO_ALT_STD_DEV, nSlot);
- }
- RETURN TRUE;
- }
- bool COM::ManageGPSs() {
- // m_anDataArray[COM_GPS_LATITUDE] = ReadViaSPI(GPSM_GET_GPS_LATITUDE, nSlot);
- // m_anDataArray[COM_GPS_LONGITUDE] = ReadViaSPI(GPSM_GET_GPS_LONGITUDE, nSlot);
- // m_anDataArray[COM_GPS_ALTITUDE] = ReadViaSPI(GPSM_GET_GPS_ALTITUDE, nSlot);
- RETURN TRUE;
- }
- bool COM::ManageKalman() {
- RETURN TRUE;
- }
- bool COM::ManageGuidance() {
- RETURN TRUE;
- }
- bool COM::ManageNavigation() {
- FOR (volatile uint8_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot++) {
- IF (m_anCapacitiesPerSlot[nSlot] & _BV(BIT03_NAVIGATION)) {
- // SEND sensor DATA
- m_cSPIProtocol.SendLongViaSPI(B09_ACCEL_X_AVG, nSlot, m_anDataArray[B09_ACCEL_X_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B09_ACCEL_Y_AVG, nSlot, m_anDataArray[B09_ACCEL_Y_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B09_ACCEL_Z_AVG, nSlot, m_anDataArray[B09_ACCEL_Z_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B09_ACCEL_X_AVG, nSlot, m_anDataArray[B09_ACCEL_X_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B09_ACCEL_Y_AVG, nSlot, m_anDataArray[B09_ACCEL_Y_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B09_ACCEL_Z_AVG, nSlot, m_anDataArray[B09_ACCEL_Z_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B10_GYRO_X_AVG, nSlot, m_anDataArray[B10_GYRO_X_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B10_GYRO_Y_AVG, nSlot, m_anDataArray[B10_GYRO_Y_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B10_GYRO_Z_AVG, nSlot, m_anDataArray[B10_GYRO_Z_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B10_GYRO_X_AVG, nSlot, m_anDataArray[B10_GYRO_X_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B10_GYRO_Y_AVG, nSlot, m_anDataArray[B10_GYRO_Y_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B10_GYRO_Z_AVG, nSlot, m_anDataArray[B10_GYRO_Z_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B11_MAG_X_AVG, nSlot, m_anDataArray[B11_MAG_X_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B11_MAG_Y_AVG, nSlot, m_anDataArray[B11_MAG_Y_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B11_MAG_Z_AVG, nSlot, m_anDataArray[B11_MAG_Z_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B11_MAG_X_AVG, nSlot, m_anDataArray[B11_MAG_X_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B11_MAG_Y_AVG, nSlot, m_anDataArray[B11_MAG_Y_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B11_MAG_Z_AVG, nSlot, m_anDataArray[B11_MAG_Z_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B12_BARO_P_AVG, nSlot, m_anDataArray[B12_BARO_P_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B12_BARO_T_AVG, nSlot, m_anDataArray[B12_BARO_T_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B12_BARO_ALT_AVG, nSlot, m_anDataArray[B12_BARO_ALT_AVG]);
- m_cSPIProtocol.SendLongViaSPI(B12_BARO_P_AVG, nSlot, m_anDataArray[B12_BARO_P_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B12_BARO_T_AVG, nSlot, m_anDataArray[B12_BARO_T_STD_DEV]);
- m_cSPIProtocol.SendLongViaSPI(B12_BARO_ALT_AVG, nSlot, m_anDataArray[B12_BARO_ALT_STD_DEV]);
- // READ navigation DATA
- // FIXME: THIS DATA SHOULD BE FUSED
- // FIXME: THIS DATA SHOULD CONTAIN ERROR INFORMATION
- // m_anDataArray[B03_PHI] = m_cSPIProtocol.ReadLongViaSPI(B03_PHI, nSlot);
- // m_anDataArray[B03_PHI_DOT] = m_cSPIProtocol.ReadLongViaSPI(B03_PHI_DOT, nSlot);
- // m_anDataArray[B03_PSI] = m_cSPIProtocol.ReadLongViaSPI(B03_PSI, nSlot);
- // m_anDataArray[B03_PSI_DOT] = m_cSPIProtocol.ReadLongViaSPI(B03_PSI_DOT, nSlot);
- // m_anDataArray[B03_THETA] = m_cSPIProtocol.ReadLongViaSPI(B03_THETA, nSlot);
- // m_anDataArray[B03_THETA_DOT] = m_cSPIProtocol.ReadLongViaSPI(B03_THETA_DOT, nSlot);
- }
- }
- RETURN TRUE;
- }
- bool COM::ManageControl() {
- IF (m_bServoPreSetup) {
- RETURN TRUE;
- // Query servo module FOR NUMBER OF servos etc.
- }
- FOR (volatile uint8_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot++) {
- IF (m_anCapacitiesPerSlot[nSlot] & _BV(BIT04_CONTROL)) {
- // m_cSPIProtocol.SendLongViaSPI(B03_PHI, nSlot, m_anDataArray[B03_PHI]);
- // m_cSPIProtocol.SendLongViaSPI(B03_PHI_DOT, nSlot, m_anDataArray[B03_PHI_DOT]);
- // m_cSPIProtocol.SendLongViaSPI(B03_PSI, nSlot, m_anDataArray[B03_PSI]);
- // m_cSPIProtocol.SendLongViaSPI(B03_PSI_DOT, nSlot, m_anDataArray[B03_PSI_DOT]);
- // m_cSPIProtocol.SendLongViaSPI(B03_THETA, nSlot, m_anDataArray[B03_THETA]);
- // m_cSPIProtocol.SendLongViaSPI(B03_THETA_DOT, nSlot, m_anDataArray[B03_THETA_DOT]);
- IF (m_bServoSetup) {
- m_cSPIProtocol.SendByteViaSPI(B17_NUM_SERVO_CHANNELS, nSlot, m_nNumServoChannels);
- FOR (uint8_t nServoNum = 0; nServoNum < m_nNumServoChannels; nServoNum++) {
- m_cSPIProtocol.SendByteViaSPI(B17_SERVO_SELECT, nSlot, nServoNum);
- m_anServoMin[nServoNum] = m_cSPIProtocol.ReadIntViaSPI(B17_SERVO_MIN, nSlot);
- m_anServoMax[nServoNum] = m_cSPIProtocol.ReadIntViaSPI(B17_SERVO_MAX, nSlot);
- m_anServoZero[nServoNum] = m_cSPIProtocol.ReadIntViaSPI(B17_SERVO_ZERO, nSlot);
- m_abServoEnable[nServoNum] = (bool) m_cSPIProtocol.ReadByteViaSPI(B17_SERVO_ENABLE, nSlot);
- m_anServoPos[nServoNum] = 0;
- }
- RETURN TRUE;
- }
- // NORMAL OPERATION
- FOR (uint8_t nServoNum = 0; nServoNum < m_nNumServoChannels; nServoNum++) {
- IF (m_abServoEnable[nServoNum]) {
- m_anServoPos[nServoNum] = m_cSPIProtocol.ReadIntViaSPI(B17_SERVO_POS, nSlot);
- }
- }
- }
- }
- RETURN TRUE;
- }
- bool COM::ManageServos() {
- FOR (volatile uint8_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot++) {
- IF (m_anCapacitiesPerSlot[nSlot] & (1UL << BIT17_SERVO_CONTROLER)) {
- IF (m_bServoPreSetup) {
- m_nNumServoChannels = m_cSPIProtocol.ReadByteViaSPI(B17_NUM_SERVO_CHANNELS, nSlot);
- m_bServoPreSetup = FALSE;
- m_bServoSetup = TRUE;
- RETURN TRUE;
- }
- IF (m_bServoSetup) {
- FOR (uint8_t nServoNum = 0; nServoNum < m_nNumServoChannels; nServoNum++) {
- m_cSPIProtocol.SendByteViaSPI(B17_SERVO_SELECT, nSlot, nServoNum);
- IF (m_abServoEnable[nServoNum]) {
- m_cSPIProtocol.SendIntViaSPI(B17_SERVO_MIN, nSlot, m_anServoMin[nServoNum]);
- m_cSPIProtocol.SendIntViaSPI(B17_SERVO_MAX, nSlot, m_anServoMax[nServoNum]);
- m_cSPIProtocol.SendIntViaSPI(B17_SERVO_ZERO, nSlot, m_anServoZero[nServoNum]);
- m_cSPIProtocol.SendIntViaSPI(B17_SERVO_POS, nSlot, m_anServoPos[nServoNum]);
- }
- m_cSPIProtocol.SendByteViaSPI(B17_SERVO_ENABLE, nSlot, m_abServoEnable[nServoNum]);
- }
- m_bServoSetup = FALSE;
- RETURN TRUE;
- }
- FOR (uint8_t nServoNum = 0; nServoNum < m_nNumServoChannels; nServoNum++) {
- IF (m_abServoEnable[nServoNum]) {
- m_cSPIProtocol.SendByteViaSPI(B17_SERVO_SELECT, nSlot, nServoNum);
- m_cSPIProtocol.SendIntViaSPI(B17_SERVO_POS, nSlot, m_anServoPos[nServoNum]);
- }
- }
- }
- }
- RETURN TRUE;
- }
- bool COM::ManagePower() {
- RETURN TRUE;
- }
- bool COM::AnswerUART() {
- IF (m_bUARTMessageReady) {
- m_bUARTMessageBeingProcessed = TRUE;
- CHAR achAnswer[UART_TRANSFER_BUFFER_SIZE];
- switch (m_achReceivedUARTMessage[0]) {
- CASE 's': m_cUART.SendCharArray(FormatSlotOccupation(achAnswer)); break;
- CASE 'r': m_bRestart = TRUE; break;
- CASE 'i': m_bIdentifyModulesAgain = TRUE; break;
- CASE 'f': m_cUART.SendCharArray(FormatFreeRAM(achAnswer)); break;
- CASE 'c': FormatCapacitierPerSlotAndSend(); break;
- // CASE 'D': IF (m_achReceivedUARTMessage[1] == '0') {
- // switch (m_achReceivedUARTMessage[2]) {
- // CASE '0': m_cUART.SendCharArray(Format3DData( m_sAccelerometer, achAnswer)); break;
- // CASE '1': m_cUART.SendCharArray(Format3DData( m_sGyroscope, achAnswer)); break;
- // CASE '2': m_cUART.SendCharArray(Format3DData( m_sMagnetometer, achAnswer)); break;
- // CASE '3': m_cUART.SendCharArray(FormatScalarData(m_sBarometerAltitude, achAnswer)); break;
- // CASE '4': m_cUART.SendCharArray(FormatScalarData(m_sBarometerPressure, achAnswer)); break;
- // CASE '5': m_cUART.SendCharArray(FormatScalarData(m_sBarometerTemperature, achAnswer)); break;
- // CASE '6': m_cUART.SendCharArray(FormatScalarData(m_sPsi, achAnswer)); break;
- // CASE '7': m_cUART.SendCharArray(FormatScalarData(m_sPsiDot, achAnswer)); break;
- // CASE '8': m_cUART.SendCharArray(FormatScalarData(m_sPhi, achAnswer)); break;
- // CASE '9': m_cUART.SendCharArray(FormatScalarData(m_sPhiDot, achAnswer)); break;
- // }
- // }
- // IF (m_achReceivedUARTMessage[1] == '1') {
- // switch (m_achReceivedUARTMessage[2]) {
- // CASE '0': m_cUART.SendCharArray(FormatScalarData(m_sTheta, achAnswer)); break;
- // CASE '1': m_cUART.SendCharArray(FormatScalarData(m_sThetaDot, achAnswer)); break;
- // CASE '2': m_cUART.SendCharArray(FormatScalarData(m_sLatitude, achAnswer)); break;
- // CASE '3': m_cUART.SendCharArray(FormatScalarData(m_sLongitude, achAnswer)); break;
- // CASE '4': m_cUART.SendCharArray(FormatScalarData(m_sGPSAltitude, achAnswer)); break;
- // CASE '5': break;
- // CASE '6': break;
- // CASE '7': break;
- // CASE '8': break;
- // CASE '9': break;
- // }
- // }
- // break;
- CASE 'C': IF (m_achReceivedUARTMessage[1] == '0') {
- switch (m_achReceivedUARTMessage[2]) {
- CASE '0': ; break; // C00 Ask pilot TO warm up engines.
- }
- }
- DEFAULT: Echo(m_achReceivedUARTMessage);
- }
- m_bUARTMessageReady = FALSE;
- m_bUARTMessageBeingProcessed = FALSE;
- }
- RETURN TRUE;
- }
- bool COM::VerifyFlags() {
- IF (m_bRestart) {
- m_eCOMState = COM_INIT;
- }
- IF (m_bIdentifyModulesAgain) {
- m_eCOMState = COM_BUILD_MODULE_CAPACITY_MATRIX;
- }
- RETURN TRUE;
- }
- bool COM::EvaluateStatus() {
- RETURN TRUE;
- }
- bool COM::BroadcastTelemetry() {
- IF (m_nCycleCount > 300) {
- // CHAR achNumber[NUMBER_BUFFER_SIZE];
- m_nCycleCount = 0;
- uint8_t nIndex;
- uConvertArrayToInt32 uUnpacker;
- m_cUART.WRITE('#');
- m_cUART.WRITE('#');
- m_cUART.WRITE('#');
- FOR (nIndex = 0; nIndex < MODULE_SELECT_TOTAL_OPTIONS; nIndex++) {
- // memset(achNumber, 0, NUMBER_BUFFER_SIZE);
- // itoa(nIndex, achNumber, 10);
- // m_cUART.SendCharArrayNoEOL(achNumber);
- uUnpacker.i = m_anDataArray[nIndex];
- m_cUART.WRITE(uUnpacker.b[0]);
- m_cUART.WRITE(uUnpacker.b[1]);
- m_cUART.WRITE(uUnpacker.b[2]);
- m_cUART.WRITE(uUnpacker.b[3]);
- IF (nIndex != (MODULE_SELECT_TOTAL_OPTIONS - 1)) {
- m_cUART.WRITE('#'); // Separator
- }
- }
- m_cUART.WRITE('\n');
- }
- RETURN TRUE;
- }
- bool COM::ManageHeartbeat() {
- RETURN TRUE;
- }
- void COM::TroubleShoot() {
- }
- void COM::ReadAndFuse(uint8_t nCapacityBit, uint8_t nValueSelectOption, uint8_t nSDSelectOption, uint8_t nSlot) {
- int32_t nValue, nStdDev;
- bool bFirst = TRUE;
- IF (m_anSlotListPerCapacity[nCapacityBit] & (1UL << nSlot)) {
- nValue = m_cSPIProtocol.ReadLongViaSPI(nValueSelectOption, nSlot);
- nStdDev = m_cSPIProtocol.ReadLongViaSPI(nSDSelectOption, nSlot);
- IF (bFirst) {
- bFirst = FALSE;
- m_anDataArray[nValueSelectOption] = nValue;
- m_anDataArray[nSDSelectOption] = nStdDev;
- }
- ELSE {
- int32_t nFusedSigma;
- m_anDataArray[nValueSelectOption] = FuseValues(m_anDataArray[nValueSelectOption],
- m_anDataArray[nSDSelectOption],
- nValue,
- nStdDev,
- nFusedSigma);
- m_anDataArray[nSDSelectOption] = nFusedSigma;
- }
- }
- }
- int32_t COM::FuseValues(int32_t nZ1, int32_t nSigma1, int32_t nZ2, int32_t nSigma2, int32_t &nFusedSigma) {
- int32_t nVariance1 = pow(nSigma1, 2);
- int32_t nVariance2 = pow(nSigma2, 2);
- int32_t nSumVariances = nVariance1 + nVariance2;
- int32_t nFusedVariance = (nVariance1 * nVariance2) / (nVariance1 + nVariance2);
- nFusedSigma = isqrt(nFusedVariance);
- RETURN ((nVariance2 / nSumVariances) * nZ1 + (nVariance1 / nSumVariances) * nZ2);
- }
- void COM::SetupSlotsSS() {
- // Disable Slave Selects FROM ALL slots
- GPIO1_IS_OUTPUT; GPIO1_HIGH; // SS1
- GPIO2_IS_OUTPUT; GPIO2_HIGH; // SS2
- GPIO3_IS_OUTPUT; GPIO3_HIGH; // SS3
- GPIO4_IS_OUTPUT; GPIO4_HIGH; // SS4
- GPIO5_IS_OUTPUT; GPIO5_HIGH; // SS5
- GPIO6_IS_OUTPUT; GPIO6_HIGH; // SS6
- GPIO7_IS_OUTPUT; //GPIO7_HIGH; // SS8 // FIXME! GPIO7 IS also SS7 the LED pin.
- GPIO8_IS_OUTPUT; GPIO8_HIGH; // SS7
- }
- CHAR * COM::FormatFreeRAM(CHAR * achBuffer) {
- CHAR achNumber[NUMBER_BUFFER_SIZE];
- memset(achBuffer, 0, UART_TRANSFER_BUFFER_SIZE);
- memset(achNumber, 0, NUMBER_BUFFER_SIZE);
- itoa(FreeRAM(), achNumber, 10);
- strncat(achBuffer, achNumber, UART_TRANSFER_BUFFER_SIZE);
- RETURN achBuffer;
- }
- void COM::ConvertAndConcatenate(DataType VALUE, CHAR * achBuffer) {
- CHAR achNumber[NUMBER_BUFFER_SIZE];
- ltoa(VALUE, achNumber, 10);
- strncat(achBuffer, achNumber, UART_TRANSFER_BUFFER_SIZE);
- }
- CHAR * COM::FormatSlotOccupation(CHAR * achBuffer) {
- CHAR achNumber[NUMBER_BUFFER_SIZE];
- CHAR chSeparator[3] = {':', ' ', 0};
- CHAR chSpace[2] = {' ', 0};
- memset(achBuffer, 0, UART_TRANSFER_BUFFER_SIZE);
- FOR (uint8_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot ++) {
- memset(achNumber, 0, NUMBER_BUFFER_SIZE);
- itoa(nSlot, achNumber, 10);
- strncat(achBuffer, achNumber, UART_TRANSFER_BUFFER_SIZE);
- strncat(achBuffer, chSeparator, UART_TRANSFER_BUFFER_SIZE);
- memset(achNumber, 0, NUMBER_BUFFER_SIZE);
- ltoa(m_anCapacitiesPerSlot[nSlot], achNumber, 10);
- strncat(achBuffer, achNumber, UART_TRANSFER_BUFFER_SIZE);
- strncat(achBuffer, chSpace, UART_TRANSFER_BUFFER_SIZE);
- }
- RETURN achBuffer;
- }
- void COM::FormatCapacitierPerSlotAndSend() {
- FOR (uint32_t nCapacityBit = 0; nCapacityBit < TOTAL_CAPACITIES; nCapacityBit++) {
- m_cUART.WRITE('\n');
- FormatLongAndSend(nCapacityBit);
- FOR (volatile uint32_t nSlot = 1; nSlot <= NUM_SLOTS; nSlot++) {
- IF (m_anSlotListPerCapacity[nCapacityBit] & (uint32_t)(1UL << nSlot)) {
- m_cUART.WRITE('X');
- }
- ELSE {
- m_cUART.WRITE('.');
- }
- }
- }
- m_cUART.WRITE('\n');
- }
- void COM::FormatLongAndSend(int32_t nNumber) {
- CHAR achNumber[15];
- // CHAR chComma[2] = {',', 0};
- ltoa(nNumber, achNumber, 10);
- // strncat( achNumber, chComma, sizeof(achNumber));
- m_cUART.SendCharArrayNoEOL(achNumber);
- }
- void COM::SendNextByteWrapper() {
- m_cUART.SendNextByte();
- }
- void COM::ReceiveNextByteWrapper() {
- m_cUART.ReceiveNextByte();
- IF (m_cUART.ReceptionIsComplete()) {
- m_bUARTMessageReady = TRUE;
- memset(m_achReceivedUARTMessage, 0, UART_TRANSFER_BUFFER_SIZE);
- m_cUART.GetIncommingMessage(m_achReceivedUARTMessage);
- }
- }
- void COM::Echo(CHAR * achReceived) {
- m_cUART.WRITE(achReceived[0]);
- m_cUART.WRITE(achReceived[1]);
- m_cUART.WRITE(achReceived[2]);
- m_cUART.WRITE(achReceived[3]);
- m_cUART.WRITE(achReceived[4]);
- m_cUART.WRITE(achReceived[5]);
- m_cUART.WRITE(achReceived[6]);
- m_cUART.WRITE(achReceived[7]);
- m_cUART.WRITE(achReceived[8]);
- m_cUART.WRITE(achReceived[9]);
- m_cUART.WRITE('\n');
- m_cUART.SendCharArray(achReceived);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement