24 #include <interfaces/OpenCVStereoParamsInterface.h>
26 #include <core/exceptions/software.h>
47 OpenCVStereoParamsInterface::OpenCVStereoParamsInterface() : Interface()
49 data_size =
sizeof(OpenCVStereoParamsInterface_data_t);
50 data_ptr = malloc(data_size);
51 data = (OpenCVStereoParamsInterface_data_t *)data_ptr;
52 data_ts = (interface_data_ts_t *)data_ptr;
53 memset(data_ptr, 0, data_size);
54 enum_map_PreFilterType[(int)PFT_NORMALIZED_RESPONSE] =
"PFT_NORMALIZED_RESPONSE";
55 enum_map_PreFilterType[(int)PFT_XSOBEL] =
"PFT_XSOBEL";
56 add_fieldinfo(IFT_ENUM,
"pre_filter_type", 1, &data->pre_filter_type,
"PreFilterType", &enum_map_PreFilterType);
57 add_fieldinfo(IFT_UINT32,
"pre_filter_size", 1, &data->pre_filter_size);
58 add_fieldinfo(IFT_UINT32,
"pre_filter_cap", 1, &data->pre_filter_cap);
59 add_fieldinfo(IFT_UINT32,
"sad_window_size", 1, &data->sad_window_size);
60 add_fieldinfo(IFT_INT32,
"min_disparity", 1, &data->min_disparity);
61 add_fieldinfo(IFT_UINT32,
"num_disparities", 1, &data->num_disparities);
62 add_fieldinfo(IFT_UINT32,
"texture_threshold", 1, &data->texture_threshold);
63 add_fieldinfo(IFT_UINT32,
"uniqueness_ratio", 1, &data->uniqueness_ratio);
64 add_fieldinfo(IFT_UINT32,
"speckle_window_size", 1, &data->speckle_window_size);
65 add_fieldinfo(IFT_UINT32,
"speckle_range", 1, &data->speckle_range);
66 add_fieldinfo(IFT_BOOL,
"try_smaller_windows", 1, &data->try_smaller_windows);
67 add_messageinfo(
"SetPreFilterTypeMessage");
68 add_messageinfo(
"SetPreFilterSizeMessage");
69 add_messageinfo(
"SetPreFilterCapMessage");
70 add_messageinfo(
"SetSADWindowSizeMessage");
71 add_messageinfo(
"SetMinDisparityMessage");
72 add_messageinfo(
"SetNumDisparitiesMessage");
73 add_messageinfo(
"SetTextureThresholdMessage");
74 add_messageinfo(
"SetUniquenessRatioMessage");
75 add_messageinfo(
"SetSpeckleWindowSizeMessage");
76 add_messageinfo(
"SetSpeckleRangeMessage");
77 add_messageinfo(
"SetTrySmallerWindowsMessage");
78 unsigned char tmp_hash[] = {0x3a, 0x8e, 0x8c, 0x21, 0xea, 0x8c, 0x83, 0x29, 0x91, 0xdd, 0x5f, 0x5f, 0x16, 0xbf, 0x5f, 0xa6};
83 OpenCVStereoParamsInterface::~OpenCVStereoParamsInterface()
92 OpenCVStereoParamsInterface::tostring_PreFilterType(
PreFilterType value)
const
95 case PFT_NORMALIZED_RESPONSE:
return "PFT_NORMALIZED_RESPONSE";
96 case PFT_XSOBEL:
return "PFT_XSOBEL";
97 default:
return "UNKNOWN";
106 OpenCVStereoParamsInterface::pre_filter_type()
const
116 OpenCVStereoParamsInterface::maxlenof_pre_filter_type()
const
126 OpenCVStereoParamsInterface::set_pre_filter_type(
const PreFilterType new_pre_filter_type)
128 set_field(data->pre_filter_type, new_pre_filter_type);
138 OpenCVStereoParamsInterface::pre_filter_size()
const
140 return data->pre_filter_size;
148 OpenCVStereoParamsInterface::maxlenof_pre_filter_size()
const
160 OpenCVStereoParamsInterface::set_pre_filter_size(
const uint32_t new_pre_filter_size)
162 set_field(data->pre_filter_size, new_pre_filter_size);
172 OpenCVStereoParamsInterface::pre_filter_cap()
const
174 return data->pre_filter_cap;
182 OpenCVStereoParamsInterface::maxlenof_pre_filter_cap()
const
194 OpenCVStereoParamsInterface::set_pre_filter_cap(
const uint32_t new_pre_filter_cap)
196 set_field(data->pre_filter_cap, new_pre_filter_cap);
206 OpenCVStereoParamsInterface::sad_window_size()
const
208 return data->sad_window_size;
216 OpenCVStereoParamsInterface::maxlenof_sad_window_size()
const
228 OpenCVStereoParamsInterface::set_sad_window_size(
const uint32_t new_sad_window_size)
230 set_field(data->sad_window_size, new_sad_window_size);
238 OpenCVStereoParamsInterface::min_disparity()
const
240 return data->min_disparity;
248 OpenCVStereoParamsInterface::maxlenof_min_disparity()
const
258 OpenCVStereoParamsInterface::set_min_disparity(
const int32_t new_min_disparity)
260 set_field(data->min_disparity, new_min_disparity);
270 OpenCVStereoParamsInterface::num_disparities()
const
272 return data->num_disparities;
280 OpenCVStereoParamsInterface::maxlenof_num_disparities()
const
292 OpenCVStereoParamsInterface::set_num_disparities(
const uint32_t new_num_disparities)
294 set_field(data->num_disparities, new_num_disparities);
305 OpenCVStereoParamsInterface::texture_threshold()
const
307 return data->texture_threshold;
315 OpenCVStereoParamsInterface::maxlenof_texture_threshold()
const
328 OpenCVStereoParamsInterface::set_texture_threshold(
const uint32_t new_texture_threshold)
330 set_field(data->texture_threshold, new_texture_threshold);
342 OpenCVStereoParamsInterface::uniqueness_ratio()
const
344 return data->uniqueness_ratio;
352 OpenCVStereoParamsInterface::maxlenof_uniqueness_ratio()
const
366 OpenCVStereoParamsInterface::set_uniqueness_ratio(
const uint32_t new_uniqueness_ratio)
368 set_field(data->uniqueness_ratio, new_uniqueness_ratio);
378 OpenCVStereoParamsInterface::speckle_window_size()
const
380 return data->speckle_window_size;
388 OpenCVStereoParamsInterface::maxlenof_speckle_window_size()
const
400 OpenCVStereoParamsInterface::set_speckle_window_size(
const uint32_t new_speckle_window_size)
402 set_field(data->speckle_window_size, new_speckle_window_size);
412 OpenCVStereoParamsInterface::speckle_range()
const
414 return data->speckle_range;
422 OpenCVStereoParamsInterface::maxlenof_speckle_range()
const
434 OpenCVStereoParamsInterface::set_speckle_range(
const uint32_t new_speckle_range)
436 set_field(data->speckle_range, new_speckle_range);
447 OpenCVStereoParamsInterface::is_try_smaller_windows()
const
449 return data->try_smaller_windows;
457 OpenCVStereoParamsInterface::maxlenof_try_smaller_windows()
const
470 OpenCVStereoParamsInterface::set_try_smaller_windows(
const bool new_try_smaller_windows)
472 set_field(data->try_smaller_windows, new_try_smaller_windows);
477 OpenCVStereoParamsInterface::create_message(
const char *type)
const
479 if ( strncmp(
"SetPreFilterTypeMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
481 }
else if ( strncmp(
"SetPreFilterSizeMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
483 }
else if ( strncmp(
"SetPreFilterCapMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
485 }
else if ( strncmp(
"SetSADWindowSizeMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
487 }
else if ( strncmp(
"SetMinDisparityMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
489 }
else if ( strncmp(
"SetNumDisparitiesMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
491 }
else if ( strncmp(
"SetTextureThresholdMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
493 }
else if ( strncmp(
"SetUniquenessRatioMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
495 }
else if ( strncmp(
"SetSpeckleWindowSizeMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
497 }
else if ( strncmp(
"SetSpeckleRangeMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
499 }
else if ( strncmp(
"SetTrySmallerWindowsMessage", type, INTERFACE_MESSAGE_TYPE_SIZE_ - 1) == 0 ) {
503 "message type for this interface type.", type);
512 OpenCVStereoParamsInterface::copy_values(
const Interface *other)
517 type(), other->
type());
519 memcpy(data, oi->data,
sizeof(OpenCVStereoParamsInterface_data_t));
523 OpenCVStereoParamsInterface::enum_tostring(
const char *enumtype,
int val)
const
525 if (strcmp(enumtype,
"PreFilterType") == 0) {
542 OpenCVStereoParamsInterface::SetPreFilterTypeMessage::SetPreFilterTypeMessage(
const PreFilterType ini_pre_filter_type) :
Message(
"SetPreFilterTypeMessage")
544 data_size =
sizeof(SetPreFilterTypeMessage_data_t);
547 data = (SetPreFilterTypeMessage_data_t *)
data_ptr;
549 data->pre_filter_type = ini_pre_filter_type;
551 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
552 add_fieldinfo(
IFT_ENUM,
"pre_filter_type", 1, &data->pre_filter_type,
"PreFilterType", &enum_map_PreFilterType);
557 data_size =
sizeof(SetPreFilterTypeMessage_data_t);
560 data = (SetPreFilterTypeMessage_data_t *)
data_ptr;
563 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
564 add_fieldinfo(
IFT_ENUM,
"pre_filter_type", 1, &data->pre_filter_type,
"PreFilterType", &enum_map_PreFilterType);
581 data = (SetPreFilterTypeMessage_data_t *)
data_ptr;
613 set_field(data->pre_filter_type, new_pre_filter_type);
638 data_size =
sizeof(SetPreFilterSizeMessage_data_t);
641 data = (SetPreFilterSizeMessage_data_t *)
data_ptr;
643 data->pre_filter_size = ini_pre_filter_size;
645 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
651 data_size =
sizeof(SetPreFilterSizeMessage_data_t);
654 data = (SetPreFilterSizeMessage_data_t *)
data_ptr;
657 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
675 data = (SetPreFilterSizeMessage_data_t *)
data_ptr;
689 return data->pre_filter_size;
711 set_field(data->pre_filter_size, new_pre_filter_size);
736 data_size =
sizeof(SetPreFilterCapMessage_data_t);
739 data = (SetPreFilterCapMessage_data_t *)
data_ptr;
741 data->pre_filter_cap = ini_pre_filter_cap;
743 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
749 data_size =
sizeof(SetPreFilterCapMessage_data_t);
752 data = (SetPreFilterCapMessage_data_t *)
data_ptr;
755 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
773 data = (SetPreFilterCapMessage_data_t *)
data_ptr;
787 return data->pre_filter_cap;
809 set_field(data->pre_filter_cap, new_pre_filter_cap);
834 data_size =
sizeof(SetSADWindowSizeMessage_data_t);
837 data = (SetSADWindowSizeMessage_data_t *)
data_ptr;
839 data->sad_window_size = ini_sad_window_size;
841 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
847 data_size =
sizeof(SetSADWindowSizeMessage_data_t);
850 data = (SetSADWindowSizeMessage_data_t *)
data_ptr;
853 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
871 data = (SetSADWindowSizeMessage_data_t *)
data_ptr;
885 return data->sad_window_size;
907 set_field(data->sad_window_size, new_sad_window_size);
932 data_size =
sizeof(SetMinDisparityMessage_data_t);
935 data = (SetMinDisparityMessage_data_t *)
data_ptr;
937 data->min_disparity = ini_min_disparity;
939 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
945 data_size =
sizeof(SetMinDisparityMessage_data_t);
948 data = (SetMinDisparityMessage_data_t *)
data_ptr;
951 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
969 data = (SetMinDisparityMessage_data_t *)
data_ptr;
981 return data->min_disparity;
1001 set_field(data->min_disparity, new_min_disparity);
1026 data_size =
sizeof(SetNumDisparitiesMessage_data_t);
1029 data = (SetNumDisparitiesMessage_data_t *)
data_ptr;
1031 data->num_disparities = ini_num_disparities;
1033 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1039 data_size =
sizeof(SetNumDisparitiesMessage_data_t);
1042 data = (SetNumDisparitiesMessage_data_t *)
data_ptr;
1045 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1063 data = (SetNumDisparitiesMessage_data_t *)
data_ptr;
1077 return data->num_disparities;
1099 set_field(data->num_disparities, new_num_disparities);
1124 data_size =
sizeof(SetTextureThresholdMessage_data_t);
1127 data = (SetTextureThresholdMessage_data_t *)
data_ptr;
1129 data->texture_threshold = ini_texture_threshold;
1131 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1137 data_size =
sizeof(SetTextureThresholdMessage_data_t);
1140 data = (SetTextureThresholdMessage_data_t *)
data_ptr;
1143 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1161 data = (SetTextureThresholdMessage_data_t *)
data_ptr;
1176 return data->texture_threshold;
1199 set_field(data->texture_threshold, new_texture_threshold);
1224 data_size =
sizeof(SetUniquenessRatioMessage_data_t);
1227 data = (SetUniquenessRatioMessage_data_t *)
data_ptr;
1229 data->uniqueness_ratio = ini_uniqueness_ratio;
1231 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1237 data_size =
sizeof(SetUniquenessRatioMessage_data_t);
1240 data = (SetUniquenessRatioMessage_data_t *)
data_ptr;
1243 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1261 data = (SetUniquenessRatioMessage_data_t *)
data_ptr;
1277 return data->uniqueness_ratio;
1301 set_field(data->uniqueness_ratio, new_uniqueness_ratio);
1326 data_size =
sizeof(SetSpeckleWindowSizeMessage_data_t);
1329 data = (SetSpeckleWindowSizeMessage_data_t *)
data_ptr;
1331 data->speckle_window_size = ini_speckle_window_size;
1333 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1339 data_size =
sizeof(SetSpeckleWindowSizeMessage_data_t);
1342 data = (SetSpeckleWindowSizeMessage_data_t *)
data_ptr;
1345 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1363 data = (SetSpeckleWindowSizeMessage_data_t *)
data_ptr;
1377 return data->speckle_window_size;
1399 set_field(data->speckle_window_size, new_speckle_window_size);
1424 data_size =
sizeof(SetSpeckleRangeMessage_data_t);
1427 data = (SetSpeckleRangeMessage_data_t *)
data_ptr;
1429 data->speckle_range = ini_speckle_range;
1431 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1437 data_size =
sizeof(SetSpeckleRangeMessage_data_t);
1440 data = (SetSpeckleRangeMessage_data_t *)
data_ptr;
1443 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1461 data = (SetSpeckleRangeMessage_data_t *)
data_ptr;
1475 return data->speckle_range;
1497 set_field(data->speckle_range, new_speckle_range);
1522 data_size =
sizeof(SetTrySmallerWindowsMessage_data_t);
1525 data = (SetTrySmallerWindowsMessage_data_t *)
data_ptr;
1527 data->try_smaller_windows = ini_try_smaller_windows;
1529 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1535 data_size =
sizeof(SetTrySmallerWindowsMessage_data_t);
1538 data = (SetTrySmallerWindowsMessage_data_t *)
data_ptr;
1541 enum_map_PreFilterType[(int)
PFT_XSOBEL] =
"PFT_XSOBEL";
1559 data = (SetTrySmallerWindowsMessage_data_t *)
data_ptr;
1574 return data->try_smaller_windows;
1597 set_field(data->try_smaller_windows, new_try_smaller_windows);
1658 if ( m10 != NULL ) {
Base class for all Fawkes BlackBoard interfaces.
const char * type() const
Get type of interface.
void * data_ptr
Pointer to local memory storage.
void set_field(FieldT &field, DataT &data)
Set a field, set data_changed to true and update data_changed accordingly.
Base class for all messages passed through interfaces in Fawkes BlackBoard.
void add_fieldinfo(interface_fieldtype_t type, const char *name, size_t length, void *value, const char *enumtype=0, const interface_enum_map_t *enum_map=0)
Add an entry to the info list.
void * data_ptr
Pointer to memory that contains local data.
message_data_ts_t * data_ts
data timestamp aliasing pointer
unsigned int data_size
Size of memory needed to hold all data.
SetMinDisparityMessage Fawkes BlackBoard Interface Message.
int32_t min_disparity() const
Get min_disparity value.
~SetMinDisparityMessage()
Destructor.
virtual Message * clone() const
Clone this message.
size_t maxlenof_min_disparity() const
Get maximum length of min_disparity value.
void set_min_disparity(const int32_t new_min_disparity)
Set min_disparity value.
SetMinDisparityMessage()
Constructor.
SetNumDisparitiesMessage Fawkes BlackBoard Interface Message.
void set_num_disparities(const uint32_t new_num_disparities)
Set num_disparities value.
virtual Message * clone() const
Clone this message.
SetNumDisparitiesMessage()
Constructor.
size_t maxlenof_num_disparities() const
Get maximum length of num_disparities value.
~SetNumDisparitiesMessage()
Destructor.
uint32_t num_disparities() const
Get num_disparities value.
SetPreFilterCapMessage Fawkes BlackBoard Interface Message.
SetPreFilterCapMessage()
Constructor.
uint32_t pre_filter_cap() const
Get pre_filter_cap value.
~SetPreFilterCapMessage()
Destructor.
void set_pre_filter_cap(const uint32_t new_pre_filter_cap)
Set pre_filter_cap value.
size_t maxlenof_pre_filter_cap() const
Get maximum length of pre_filter_cap value.
virtual Message * clone() const
Clone this message.
SetPreFilterSizeMessage Fawkes BlackBoard Interface Message.
virtual Message * clone() const
Clone this message.
void set_pre_filter_size(const uint32_t new_pre_filter_size)
Set pre_filter_size value.
size_t maxlenof_pre_filter_size() const
Get maximum length of pre_filter_size value.
~SetPreFilterSizeMessage()
Destructor.
SetPreFilterSizeMessage()
Constructor.
uint32_t pre_filter_size() const
Get pre_filter_size value.
SetPreFilterTypeMessage Fawkes BlackBoard Interface Message.
SetPreFilterTypeMessage()
Constructor.
size_t maxlenof_pre_filter_type() const
Get maximum length of pre_filter_type value.
void set_pre_filter_type(const PreFilterType new_pre_filter_type)
Set pre_filter_type value.
~SetPreFilterTypeMessage()
Destructor.
virtual Message * clone() const
Clone this message.
PreFilterType pre_filter_type() const
Get pre_filter_type value.
SetSADWindowSizeMessage Fawkes BlackBoard Interface Message.
size_t maxlenof_sad_window_size() const
Get maximum length of sad_window_size value.
uint32_t sad_window_size() const
Get sad_window_size value.
~SetSADWindowSizeMessage()
Destructor.
void set_sad_window_size(const uint32_t new_sad_window_size)
Set sad_window_size value.
SetSADWindowSizeMessage()
Constructor.
virtual Message * clone() const
Clone this message.
SetSpeckleRangeMessage Fawkes BlackBoard Interface Message.
~SetSpeckleRangeMessage()
Destructor.
uint32_t speckle_range() const
Get speckle_range value.
virtual Message * clone() const
Clone this message.
void set_speckle_range(const uint32_t new_speckle_range)
Set speckle_range value.
SetSpeckleRangeMessage()
Constructor.
size_t maxlenof_speckle_range() const
Get maximum length of speckle_range value.
SetSpeckleWindowSizeMessage Fawkes BlackBoard Interface Message.
void set_speckle_window_size(const uint32_t new_speckle_window_size)
Set speckle_window_size value.
uint32_t speckle_window_size() const
Get speckle_window_size value.
size_t maxlenof_speckle_window_size() const
Get maximum length of speckle_window_size value.
virtual Message * clone() const
Clone this message.
SetSpeckleWindowSizeMessage()
Constructor.
~SetSpeckleWindowSizeMessage()
Destructor.
SetTextureThresholdMessage Fawkes BlackBoard Interface Message.
virtual Message * clone() const
Clone this message.
uint32_t texture_threshold() const
Get texture_threshold value.
void set_texture_threshold(const uint32_t new_texture_threshold)
Set texture_threshold value.
size_t maxlenof_texture_threshold() const
Get maximum length of texture_threshold value.
SetTextureThresholdMessage()
Constructor.
~SetTextureThresholdMessage()
Destructor.
SetTrySmallerWindowsMessage Fawkes BlackBoard Interface Message.
bool is_try_smaller_windows() const
Get try_smaller_windows value.
SetTrySmallerWindowsMessage()
Constructor.
virtual Message * clone() const
Clone this message.
void set_try_smaller_windows(const bool new_try_smaller_windows)
Set try_smaller_windows value.
~SetTrySmallerWindowsMessage()
Destructor.
size_t maxlenof_try_smaller_windows() const
Get maximum length of try_smaller_windows value.
SetUniquenessRatioMessage Fawkes BlackBoard Interface Message.
size_t maxlenof_uniqueness_ratio() const
Get maximum length of uniqueness_ratio value.
SetUniquenessRatioMessage()
Constructor.
~SetUniquenessRatioMessage()
Destructor.
virtual Message * clone() const
Clone this message.
uint32_t uniqueness_ratio() const
Get uniqueness_ratio value.
void set_uniqueness_ratio(const uint32_t new_uniqueness_ratio)
Set uniqueness_ratio value.
OpenCVStereoParamsInterface Fawkes BlackBoard Interface.
PreFilterType
The type used for the pre-filter to come up with the features for the correspondence matching.
@ PFT_NORMALIZED_RESPONSE
Normalized response filter.
@ PFT_XSOBEL
Sobel filters.
virtual bool message_valid(const Message *message) const
Check if message is valid and can be enqueued.
Fawkes library namespace.
@ IFT_UINT32
32 bit unsigned integer field
@ IFT_INT32
32 bit integer field
@ IFT_ENUM
field with interface specific enum type
Timestamp data, must be present and first entries for each interface data structs!...