Browse Source

data response (first attempt)

Juraj Ďuďák 8 months ago
parent
commit
e825d5ea3b

+ 3 - 0
Core/Inc/NbusBridge.h

@@ -25,6 +25,7 @@
 
 typedef enum {
 	STATE_STOPPED,
+	STATE_TO_STOP,
 	STATE_RUNNING,
 }RunState_e;
 
@@ -37,6 +38,8 @@ private:
 	uint8_t _num_slaves;
 	RunState_e _run_state;
 	DataFrame *_workerFrame;
+	uint8_t _dataPacket[NBUS_MAX_FRAME_SIZE*MAX_SLAVES];
+	DataFrame *_dataFrame;
 
 	void transmit(DataFrame *packet);
 	void process_broadcast(uint8_t *rxFrame);

+ 2 - 2
Core/Inc/NbusSlave.h

@@ -32,12 +32,12 @@ public:
 	void setCommunicator(NbusCommunicator*);
 	void setAddress(uint8_t);
 	bool isActive();
+	uint8_t getSensorAddress();
+	uint8_t getModuleAddress();
 	DataFrame* nbus_echo();
 	DataFrame* nbus_sensor_count();
 	DataFrame* nbus_sensor_type(uint8_t);
 	DataFrame* nbus_sensor_format(uint8_t);
-//	DataFrame* nbus_sensors_formats();
-//	DataFrame* nbus_sensor_format(uint8_t, uint8_t);
 	DataFrame* nbus_module_info();
 	DataFrame* nbus_sensor_getData(uint8_t sensor_address);
 	DataFrame* nbus_sensor_parameter(uint8_t, uint8_t);

+ 28 - 4
Core/Src/NbusBridge.cpp

@@ -43,10 +43,13 @@ NbusBridge::NbusBridge(NbusCommunicator *nc) {
 			__NOP();
 		}
 	}
+
 	_communicator = nc;
 	_num_slaves = 0;
 	_run_state = STATE_STOPPED;
 	_pdu.sa = BROADCAST_ADDRESS;
+	_dataFrame = new DataFrame(_dataPacket, sizeof(_dataPacket), TYPE_RAW, CRC_OFF);
+
 }
 
 NbusBridge::~NbusBridge() {
@@ -126,7 +129,7 @@ void NbusBridge::broadcastStop(){
 	_pdu.fc = FC_STOP;
 	_pdu.ma = BROADCAST_ADDRESS;
 	_communicator->send(&_pdu, NULL, 0);
-	_run_state = STATE_STOPPED;
+	_run_state = STATE_TO_STOP;
 }
 
 void NbusBridge::process_broadcast(uint8_t *rxFrame){
@@ -140,7 +143,11 @@ void NbusBridge::process_broadcast(uint8_t *rxFrame){
 		this->broadcastStart();
 		break;
 
+	default:
+		;//nothing
 	}
+
+	HAL_Delay(1);	/// send BC and wait TX complete
 }
 
 
@@ -204,6 +211,7 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size){
 		break;
 
 	case FC_DATA:			/* 0xB => 11 */
+		// NO NEED TO IMPLEMENT on NBUS BRIDGE
 		break;
 
 	case FC_SYNC:			/* 0xC => 12 */
@@ -231,20 +239,36 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size){
 }
 
 void NbusBridge::processRunningState(){
-	if (_run_state == STATE_STOPPED ){
+	if (_run_state == STATE_STOPPED){
+		return;
+	}
+
+	if (_run_state == STATE_TO_STOP){
 		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
+		_run_state = STATE_STOPPED;
 		return;
 	}
 
 	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
 	NbusSlave *slave;
+	uint8_t *slaveFrameResponse;
 	for(uint32_t i=0; i< _num_slaves; i++){
 		slave = getSlave(_slave_adress[i]);
 		if(slave != NULL && slave->isActive()){
-			for(uint32_t k = 0 ; k <= slave->nbus_get_sensor_count(false) ; k++){
+			_dataFrame->Init();
+			_dataFrame->AddHeader(TYPE_HEADER_2B);
+			_dataFrame->AddInt32(HAL_GetTick());
+			for(uint32_t k = 1 ; k <= slave->nbus_get_sensor_count(false) ; k++){
+				_dataFrame->AddInt8(slave->getModuleAddress());
 				_workerFrame = slave->nbus_sensor_getData(k);
-				sendResponseToMaster(_workerFrame);
+				slaveFrameResponse = _workerFrame->GetFrame();
+				_dataFrame->AddInt8(slave->getSensorAddress());
+				_dataFrame->AddArray(&slaveFrameResponse[3], _workerFrame->GetLength()-3);
 			}
+			_dataFrame->AddInt8(0xFF);
+			_dataFrame->AddInt8(0xFF);
+			_dataFrame->Commit();
+			sendResponseToMaster(_dataFrame);
 		}
 
 	}

+ 1 - 1
Core/Src/NbusCommunicator.cpp

@@ -16,7 +16,7 @@ NbusCommunicator::NbusCommunicator(UART_HandleTypeDef* uartUbus, UART_HandleType
 		}
 	}
 
-	_packet_rx = new DataFrame(_data_packet_rx, sizeof(_data_packet_rx), TYPE_PLAIN, CRC_OFF);\
+	_packet_rx = new DataFrame(_data_packet_rx, sizeof(_data_packet_rx), TYPE_PLAIN, CRC_OFF);
 	if(_packet_rx == NULL)
 	{
 		while(1){

+ 8 - 11
Core/Src/NbusSlave.cpp

@@ -33,6 +33,14 @@ void NbusSlave::setAddress(uint8_t address){
 	_pdu.ma = _address;
 }
 
+uint8_t NbusSlave::getModuleAddress(){
+	return _pdu.ma;
+}
+
+uint8_t NbusSlave::getSensorAddress(){
+	return _pdu.sa;
+}
+
 bool NbusSlave::isActive(){
 	return _communicator != NULL && _address != 0;
 }
@@ -77,23 +85,12 @@ DataFrame* NbusSlave::nbus_module_info() {
 	return _communicator->sendAndReceive(&_pdu, _sensor_cache, 0);
 }
 
-//DataFrame* NbusSlave::nbus_sensors_formats() {
-//	return nbus_sensor_formats(0);
-//}
-
 DataFrame* NbusSlave::nbus_sensor_format(uint8_t sensor_index) {
 	_pdu.sa = sensor_index;
 	_pdu.fc = FC_SENSOR_FORMAT;
 	return _communicator->sendAndReceive(&_pdu, _sensor_cache, 0);
 }
 
-//DataFrame* NbusSlave::nbus_sensor_format(uint8_t sensor_address, uint8_t  sensor_index) {
-//	_pdu.sa = sensor_address;
-//	_pdu.fc = FC_SENSOR_FORMAT;
-//	_sensor_cache[0] = sensor_index;
-//	return _communicator->sendAndReceive(&_pdu, _sensor_cache, 1);
-//}
-
 DataFrame* NbusSlave::nbus_sensor_getData(uint8_t sensor_address) {
 	_pdu.sa = sensor_address;
 	_pdu.fc = FC_DATA;

+ 15 - 1
Modules/dataframe/src/dataframe.cpp

@@ -164,6 +164,11 @@ void DataFrame::Init(void) {
     _frame[0] = 0; // length of packet
     _length = 1; //(uint8_t)_crcUse;
   }
+
+  if (_type == TYPE_RAW) {
+	 _raw_data = true;
+    _length = 0; //(uint8_t)_crcUse;
+  }
 }
 
 void DataFrame::FromArray(uint8_t *data, uint8_t size){
@@ -247,7 +252,7 @@ bool DataFrame::AddFloat(float f) {
 }
 
 uint8_t DataFrame::Commit(void) {
-  if (_raw_data == true){
+  if (_type == TYPE_RAW) {
 	  return _length;
   }
 
@@ -317,6 +322,15 @@ bool DataFrame::IsEmpty(void){
 	  return false;
 }
 
+void DataFrame::AddHeader(DataframeType_t type){
+  if (type == TYPE_HEADER_1B) {
+	  _frame[_length++] = HEADER_CHAR1;
+  }
+  if (type == TYPE_HEADER_2B) {
+	  _frame[_length++] = HEADER_CHAR1;
+	  _frame[_length++] = HEADER_CHAR2;
+  }
+}
 uint8_t DataFrame::GetLength(void){
 	return _length;
 }

+ 3 - 0
Modules/dataframe/src/dataframe.h

@@ -29,6 +29,8 @@ typedef enum {
   TYPE_HEADER_1B,
   /** Dataframe contain first 2 bytes as a preamble of packet */
   TYPE_HEADER_2B,
+  /** Dataframe with plain content. There is no header of preamble in frame, neither packet size in first byte*/
+  TYPE_RAW,
 } DataframeType_t;
 
 /**
@@ -156,6 +158,7 @@ public:
   bool IsEmpty(void);
 
   void FromArray(uint8_t *data, uint8_t size);
+  void AddHeader(DataframeType_t type);
 
 };