summaryrefslogtreecommitdiffstats
path: root/generator/nanopb_generator.py
diff options
context:
space:
mode:
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>2015-01-04 11:36:42 +0200
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>2015-01-04 12:02:15 +0200
commit50c67ecec4895f65ba684e4b46b4b70980a5be6a (patch)
tree650cea85ca6c544bc6c3026c670cea63057bf721 /generator/nanopb_generator.py
parentb0d31468da7f644684be897cef5b0602ca10af0f (diff)
Add int_size option for generator.
This allows overriding the integer field types to e.g. uint8_t for saving RAM. Update issue 139 Status: FixedInGit
Diffstat (limited to 'generator/nanopb_generator.py')
-rwxr-xr-xgenerator/nanopb_generator.py44
1 files changed, 29 insertions, 15 deletions
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 6dcc911f..85cb413b 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -44,22 +44,30 @@ except:
import time
import os.path
-# Values are tuple (c type, pb type, encoded size)
+# Values are tuple (c type, pb type, encoded size, int_size_allowed)
FieldD = descriptor.FieldDescriptorProto
datatypes = {
- FieldD.TYPE_BOOL: ('bool', 'BOOL', 1),
- FieldD.TYPE_DOUBLE: ('double', 'DOUBLE', 8),
- FieldD.TYPE_FIXED32: ('uint32_t', 'FIXED32', 4),
- FieldD.TYPE_FIXED64: ('uint64_t', 'FIXED64', 8),
- FieldD.TYPE_FLOAT: ('float', 'FLOAT', 4),
- FieldD.TYPE_INT32: ('int32_t', 'INT32', 10),
- FieldD.TYPE_INT64: ('int64_t', 'INT64', 10),
- FieldD.TYPE_SFIXED32: ('int32_t', 'SFIXED32', 4),
- FieldD.TYPE_SFIXED64: ('int64_t', 'SFIXED64', 8),
- FieldD.TYPE_SINT32: ('int32_t', 'SINT32', 5),
- FieldD.TYPE_SINT64: ('int64_t', 'SINT64', 10),
- FieldD.TYPE_UINT32: ('uint32_t', 'UINT32', 5),
- FieldD.TYPE_UINT64: ('uint64_t', 'UINT64', 10)
+ FieldD.TYPE_BOOL: ('bool', 'BOOL', 1, False),
+ FieldD.TYPE_DOUBLE: ('double', 'DOUBLE', 8, False),
+ FieldD.TYPE_FIXED32: ('uint32_t', 'FIXED32', 4, False),
+ FieldD.TYPE_FIXED64: ('uint64_t', 'FIXED64', 8, False),
+ FieldD.TYPE_FLOAT: ('float', 'FLOAT', 4, False),
+ FieldD.TYPE_INT32: ('int32_t', 'INT32', 10, True),
+ FieldD.TYPE_INT64: ('int64_t', 'INT64', 10, True),
+ FieldD.TYPE_SFIXED32: ('int32_t', 'SFIXED32', 4, False),
+ FieldD.TYPE_SFIXED64: ('int64_t', 'SFIXED64', 8, False),
+ FieldD.TYPE_SINT32: ('int32_t', 'SINT32', 5, True),
+ FieldD.TYPE_SINT64: ('int64_t', 'SINT64', 10, True),
+ FieldD.TYPE_UINT32: ('uint32_t', 'UINT32', 5, True),
+ FieldD.TYPE_UINT64: ('uint64_t', 'UINT64', 10, True)
+}
+
+# Integer size overrides (from .proto settings)
+intsizes = {
+ nanopb_pb2.IS_8: 'int8_t',
+ nanopb_pb2.IS_16: 'int16_t',
+ nanopb_pb2.IS_32: 'int32_t',
+ nanopb_pb2.IS_64: 'int64_t',
}
class Names:
@@ -226,7 +234,13 @@ class Field:
# Decide the C data type to use in the struct.
if datatypes.has_key(desc.type):
- self.ctype, self.pbtype, self.enc_size = datatypes[desc.type]
+ self.ctype, self.pbtype, self.enc_size, isa = datatypes[desc.type]
+
+ # Override the field size if user wants to use smaller integers
+ if isa and field_options.int_size != nanopb_pb2.IS_DEFAULT:
+ self.ctype = intsizes[field_options.int_size]
+ if desc.type == FieldD.TYPE_UINT32 or desc.type == FieldD.TYPE_UINT64:
+ self.ctype = 'u' + self.ctype;
elif desc.type == FieldD.TYPE_ENUM:
self.pbtype = 'ENUM'
self.ctype = names_from_type_name(desc.type_name)