Fix unsigned enums not working correctly inside OneOf (#611)

Fixed also a few smaller issues where generator didn't consider
fields inside oneof for field name mangling.
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 5759a7f..8e1074c 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1164,9 +1164,9 @@
         '''Return X-macro declaration of all fields in this message.'''
         Field.macro_x_param = 'X'
         Field.macro_a_param = 'a'
-        while any(field.name == Field.macro_x_param for field in self.fields):
+        while any(field.name == Field.macro_x_param for field in self.all_fields()):
             Field.macro_x_param += '_'
-        while any(field.name == Field.macro_a_param for field in self.fields):
+        while any(field.name == Field.macro_a_param for field in self.all_fields()):
             Field.macro_a_param += '_'
 
         result = '#define %s_FIELDLIST(%s, %s) \\\n' % (self.name,
@@ -1518,7 +1518,7 @@
         for enum in other.enums:
             if not enum.options.long_names:
                 for message in self.messages:
-                    for field in message.fields:
+                    for field in message.all_fields():
                         if field.default in enum.value_longnames:
                             idx = enum.value_longnames.index(field.default)
                             field.default = enum.values[idx][0]
@@ -1527,7 +1527,7 @@
         for enum in other.enums:
             if not enum.has_negative():
                 for message in self.messages:
-                    for field in message.fields:
+                    for field in message.all_fields():
                         if field.pbtype == 'ENUM' and field.ctype == enum.names:
                             field.pbtype = 'UENUM'
 
@@ -1746,7 +1746,7 @@
         # Add check for sizeof(double)
         has_double = False
         for msg in self.messages:
-            for field in msg.fields:
+            for field in msg.all_fields():
                 if field.ctype == 'double':
                     has_double = True
 
diff --git a/tests/regression/issue_611/SConscript b/tests/regression/issue_611/SConscript
new file mode 100644
index 0000000..0043539
--- /dev/null
+++ b/tests/regression/issue_611/SConscript
@@ -0,0 +1,7 @@
+# Regression test for #611:
+# Enum messages inside OneOf generated as ENUM instead of UENUM
+
+Import("env")
+
+env.NanopbProto("uenum.proto")
+env.Match(["uenum.pb.h", "uenum.expected"])
diff --git a/tests/regression/issue_611/uenum.expected b/tests/regression/issue_611/uenum.expected
new file mode 100644
index 0000000..507c590
--- /dev/null
+++ b/tests/regression/issue_611/uenum.expected
@@ -0,0 +1,5 @@
+STATIC.* ONEOF.* ENUM.*MyEnum
+STATIC.* ONEOF.* UENUM.*MyUEnum
+! [^U]ENUM.*MyUEnum
+! UENUM.*MyEnum
+
diff --git a/tests/regression/issue_611/uenum.proto b/tests/regression/issue_611/uenum.proto
new file mode 100644
index 0000000..f6df218
--- /dev/null
+++ b/tests/regression/issue_611/uenum.proto
@@ -0,0 +1,28 @@
+syntax = "proto2";
+
+enum my_enum {
+  E0 = 0;
+  E240 = 240;
+  E1 = -1;
+}
+
+enum my_uenum {
+  U0 = 0;
+  U240 = 240;
+}
+
+message my_message_regular {
+   required my_enum MyEnum = 1;
+   required my_uenum MyUEnum = 2;
+}
+
+message my_message_oneof {
+  required uint32 Data1 = 1;
+  oneof Data {
+    bool null = 2;
+    my_enum MyEnum = 3;
+    my_uenum MyUEnum = 4;
+  }
+}
+
+