Esempio n. 1
0
void routing_master_from_pc(const char *data, const uint16_t length, const ComType com) {
	uint32_t uid = ((MessageHeader*)data)->uid;

	// Broadcast
	if(uid == 0) {
		for(uint8_t i = 1; i <= com_info.last_stack_address; i++) {
			uint32_t options = i;
			send_blocking_with_timeout_options(data, length, COM_SPI_STACK, &options);
		}

		if(com_info.ext_type[0] == COM_TYPE_MASTER) {
			send_blocking_with_timeout(data, length, com_info.ext[0]);
		}
		if(com_info.ext_type[1] == COM_TYPE_MASTER) {
			send_blocking_with_timeout(data, length, com_info.ext[1]);
		}
	// Message for brickd
	} else if(uid == 1) {
		if(com == COM_ETHERNET || com == COM_WIFI) {
			MessageHeader *header = (MessageHeader*)data;
			switch(header->fid) {
				case BRICKD_FID_GET_AUTHENTICATION_NONCE: {
					brickd_get_authentication_nonce(com, (GetAuthenticationNonce*)data);
					break;
				}

				case BRICKD_FID_AUTHENTICATE: {
					brickd_authenticate(com, (Authenticate*)data);
					break;
				}
			}
		}
	// Discover Route
	} else {
		const RouteTo route_to = routing_route_to(uid);
		if(route_to.to == ROUTING_STACK) {
			uint32_t options = route_to.option;
			send_blocking_with_timeout_options(data, length, COM_SPI_STACK, &options);
		} else if(master_mode & MASTER_MODE_MASTER) {
			if(route_to.to == ROUTING_EXTENSION_1) {
				if(com_info.ext_type[0] == COM_TYPE_MASTER) {
					send_blocking_with_timeout(data, length, com_info.ext[0]);
				}
			} else if(route_to.to == ROUTING_EXTENSION_2) {
				if(com_info.ext_type[1] == COM_TYPE_MASTER) {
					send_blocking_with_timeout(data, length, com_info.ext[1]);
				}
			} else {
				if(com_info.ext_type[0] == COM_TYPE_MASTER) {
					send_blocking_with_timeout(data, length, com_info.ext[0]);
				}
				if(com_info.ext_type[1] == COM_TYPE_MASTER) {
					send_blocking_with_timeout(data, length, com_info.ext[1]);
				}
			}
		}
	}
}
bool ICACHE_FLASH_ATTR com_handle_message(const uint8_t *data, const uint8_t length, const int8_t cid) {
	const MessageHeader *header = (const MessageHeader*)data;

	if(!brickd_check_auth(header, cid)) {
		return true;
	}

	if(header->uid == 1) {
		switch(header->fid) {
			case BRICKD_FID_GET_AUTHENTICATION_NONCE: brickd_get_authentication_nonce(cid, (GetAuthenticationNonce*)data); return true;
			case BRICKD_FID_AUTHENTICATE: brickd_authenticate(cid, (Authenticate*)data); return true;
		}
	}

	switch(header->fid) {
		case FID_SET_WIFI2_AUTHENTICATION_SECRET: set_wifi2_authentication_secret(cid, (SetWifi2AuthenticationSecret*)data); return true;
		case FID_GET_WIFI2_AUTHENTICATION_SECRET: get_wifi2_authentication_secret(cid, (GetWifi2AuthenticationSecret*)data); return true;
		case FID_SET_WIFI2_CONFIGURATION:         set_wifi2_configuration(cid, (SetWifi2Configuration*)data);                return true;
		case FID_GET_WIFI2_CONFIGURATION:         get_wifi2_configuration(cid, (GetWifi2Configuration*)data);                return true;
		case FID_GET_WIFI2_STATUS:                get_wifi2_status(cid, (GetWifi2Status*)data);                              return true;
		case FID_SET_WIFI2_CLIENT_CONFIGURATION:  set_wifi2_client_configuration(cid, (SetWifi2ClientConfiguration*)data);   return true;
		case FID_GET_WIFI2_CLIENT_CONFIGURATION:  get_wifi2_client_configuration(cid, (GetWifi2ClientConfiguration*)data);   return true;
		case FID_SET_WIFI2_CLIENT_HOSTNAME:       set_wifi2_client_hostname(cid, (SetWifi2ClientHostname*)data);             return true;
		case FID_GET_WIFI2_CLIENT_HOSTNAME:       get_wifi2_client_hostname(cid, (GetWifi2ClientHostname*)data);             return true;
		case FID_SET_WIFI2_CLIENT_PASSWORD:       set_wifi2_client_password(cid, (SetWifi2ClientPassword*)data);             return true;
		case FID_GET_WIFI2_CLIENT_PASSWORD:       get_wifi2_client_password(cid, (GetWifi2ClientPassword*)data);             return true;
		case FID_SET_WIFI2_AP_CONFIGURATION:      set_wifi2_ap_configuration(cid, (SetWifi2APConfiguration*)data);           return true;
		case FID_GET_WIFI2_AP_CONFIGURATION:      get_wifi2_ap_configuration(cid, (GetWifi2APConfiguration*)data);           return true;
		case FID_SET_WIFI2_AP_PASSWORD:           set_wifi2_ap_password(cid, (SetWifi2APPassword*)data);                     return true;
		case FID_GET_WIFI2_AP_PASSWORD:           get_wifi2_ap_password(cid, (GetWifi2APPassword*)data);                     return true;
		case FID_SAVE_WIFI2_CONFIGURATION:        save_wifi2_configuration(cid, (SaveWifi2Configuration*)data);              return true;
		case FID_GET_WIFI2_FIRMWARE_VERSION:      get_wifi2_firmware_version(cid, (GetWifi2FirmwareVersion*)data);           return true;
		case FID_ENABLE_WIFI2_STATUS_LED:         enable_wifi2_status_led(cid, (EnableWifi2StatusLED*)data);                 return true;
		case FID_DISABLE_WIFI2_STATUS_LED:        disable_wifi2_status_led(cid, (DisableWifi2StatusLED*)data);               return true;
		case FID_IS_WIFI2_STATUS_LED_ENABLED:     is_wifi2_status_led_enabled(cid, (IsWifi2StatusLEDEnabled*)data);          return true;
		case FID_SET_WIFI2_MESH_CONFIGURATION:    set_wifi2_mesh_configuration(cid, (SetWifi2MeshConfiguration*)data);       return true;
		case FID_GET_WIFI2_MESH_CONFIGURATION:    get_wifi2_mesh_configuration(cid, (GetWifi2MeshConfiguration*)data);       return true;
		case FID_SET_WIFI2_MESH_ROUTER_SSID:			set_wifi2_mesh_router_ssid(cid, (SetWifi2MeshRouterSSID*)data);						 return true;
		case FID_GET_WIFI2_MESH_ROUTER_SSID:			get_wifi2_mesh_router_ssid(cid, (GetWifi2MeshRouterSSID*)data);						 return true;
		case FID_SET_WIFI2_MESH_ROUTER_PASSWORD:  set_wifi2_mesh_router_password(cid, (SetWifi2MeshRouterPassword*)data);		 return true;
		case FID_GET_WIFI2_MESH_ROUTER_PASSWORD:  get_wifi2_mesh_router_password(cid, (GetWifi2MeshRouterPassword*)data);		 return true;
		case FID_GET_WIFI2_MESH_COMMON_STATUS:    get_wifi2_mesh_common_status(cid, (GetWifi2MeshCommonStatus*)data);    		 return true;
		case FID_GET_WIFI2_MESH_STATION_STATUS:   get_wifi2_mesh_station_status(cid, (GetWifi2MeshStationStatus*)data);  		 return true;
		case FID_GET_WIFI2_MESH_AP_STATUS:        get_wifi2_mesh_ap_status(cid, (GetWifi2MeshAPStatus*)data);            		 return true;
	}

	return false;
}