+ # Remark section containing exact cloud type + okta number
+ # cloud type codes in Geo::TAF::EN::CLOUD
+ # example: CI1AC1TCU4 = Cirrus 1/8, Altocumulus 1/8, Towering Cumulus 4/8
+ # example: SN2SC1SC3SC2
+ } elsif (my $ct = $t =~ m/^((?:CI|CS|CC|AS|AC|ACC|ST|NS|SC|SF|SN|CF|CU|TCU|CB)\d)+$/) {
+ foreach my $ct (split m/((?:CI|CS|CC|AS|AC|ACC|ST|NS|SC|SF|SN|CF|CU|TCU|CB)\d)/, $t) {
+ chomp $ct;
+ next if(length($ct) == 0);
+ $t = $ct;
+ $ct =~ s/\d+$//;
+ $t =~ s/^$ct//;
+ push @chunk, $self->_chunk('CLOUD', $t, $ct)
+ }
+
+ # pressure equivilent @ sea level
+ } elsif (($p) = $t =~ /^SLP(\d\d\d)$/) {
+ $p = 0+$p;
+ $p = sprintf '%.1f', 1000+$p/10.0;
+ push @chunk, $self->_chunk('SLP', $p, 'hPa');
+
+ # station type
+ } elsif (defined $self->{in_remark} && ($type) = $t =~ /^AO(1|2)$/) {
+ $type = ($type == '1' ? '-' : '+').'PRECIP';
+ push @chunk, $self->_chunk('STATION_TYPE', $type);
+
+ # US NWS:
+ # Hourly Precipitation Amount (P)
+ # 3- and 6-Hour Precipitation Amount (3, 6)
+ # 24-Hour Precipitation Amount (7)
+ #
+ # The specification says 4 digits after the type code, but some stations only have 3:
+ # CXKA 011100Z AUTO 35002KT M28/M31 RMK AO1 3010 SLP219 T12761306 50023
+ # ^^^ 0.1 inches in the 3 hour period
+ #
+ # KW22 011135Z AUTO 23016G23KT 10SM BKN029 OVC036 02/M02 A2988 RMK A02 P000
+ # ^^^ 0.0 inches in the last hour
+ } elsif (defined $self->{in_remark} && my ($precip_period, $precip) = $t =~ /^(3|6|7|P)(\d{3,4})$/) {
+ $precip_period = 24 if $precip_period eq '7';
+ $precip_period = 1 if $precip_period eq 'P';
+ push @chunk, $self->_chunk('PRECIP', $precip, $precip_period);
+
+ # other remarks go to a text buffer for now
+ #} elsif (defined $self->{in_remark} && length($t) > 0) {
+ } elsif (defined $self->{in_remark}) {
+ print "Adding to remark buffer: $t\n";
+ push @remark_buffer, $t;
+ $ignore_no_length_change = 1;
+
+ #X#} elsif (1) {
+ #X# print "Debug marker: $t\n";
+ #X# $ignore_no_length_change = 1;
+
+ } elsif(0) {
+
+
+ # End of processing
+ }
+
+ $c1 = $#chunk;
+ if($c0 == $c1 && $ignore_no_length_change == 0) {
+ push @chunk, $self->_chunk('RMK','Failed to decode: '.$t);
+ $self->{decode_failures}++;
+ }
+ }
+
+ if (@remark_buffer) {
+ push @chunk, $self->_chunk('BLOCK') unless ($c0 == $c1);
+ push @chunk, $self->_chunk('RMK', join(' ', @remark_buffer));
+ }